Java基础19-一文搞懂Java集合类框架,以及常见面试题(一)

简介: Java基础19-一文搞懂Java集合类框架,以及常见面试题(一)

在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! image.png

java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等!

image.png

上面的图展示了整个集合大家族的成员以及他们之间的关系。下面就上面的各个接口、基类做一些简单的介绍(主要介绍各个集合的特点。区别)。

下面几张图更清晰地介绍了结合类接口间的关系:

image.png

map的实现类

image.png

Collection接口

Collection接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。Collection所代表的是一种规则,它所包含的元素都必须遵循一条或者多条规则。如有些允许重复而有些则不能重复、有些必须要按照顺序插入而有些则是散列,有些支持排序但是有些则不支持。

在Java中所有实现了Collection接口的类都必须提供两套标准的构造函数,一个是无参,用于创建一个空的Collection,一个是带有Collection参数的有参构造函数,用于创建一个新的Collection,这个新的Collection与传入进来的Collection具备相同的元素。//要求实现基本的增删改查方法,并且需要能够转换为数组类型

    public class Collection接口 {
        class collect implements Collection {复制代码
            @Override
            public int size() {
                return 0;
            }复制代码
            @Override
            public boolean isEmpty() {
                return false;
            }复制代码
            @Override
            public boolean contains(Object o) {
                return false;
            }复制代码
            @Override
            public Iterator iterator() {
                return null;
            }复制代码
            @Override
            public Object[] toArray() {
                return new Object[0];
            }复制代码
            @Override
            public boolean add(Object o) {
                return false;
            }复制代码
            @Override
            public boolean remove(Object o) {
                return false;
            }复制代码
            @Override
            public boolean addAll(Collection c) {
                return false;
            }复制代码
            @Override
            public void clear() {复制代码
            }
    //省略部分代码  复制代码
            @Override
            public Object[] toArray(Object[] a) {
                return new Object[0];
            }
        }
    }复制代码

List接口

List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

2.1、ArrayList

    public class List接口 {
        //下面是List的继承关系,由于List接口规定了包括诸如索引查询,迭代器的实现,所以实现List接口的类都会有这些方法。
        //所以不管是ArrayList和LinkedList底层都可以使用数组操作,但一般不提供这样外部调用方法。
        //    public interface Iterable<T>
    //    public interface Collection<E> extends Iterable<E>
    //    public interface List<E> extends Collection<E>
        class MyList implements List {复制代码
            @Override
            public int size() {
                return 0;
            }复制代码
            @Override
            public boolean isEmpty() {
                return false;
            }复制代码
            @Override
            public boolean contains(Object o) {
                return false;
            }复制代码
            @Override
            public Iterator iterator() {
                return null;
            }复制代码
            @Override
            public Object[] toArray() {
                return new Object[0];
            }复制代码
            @Override
            public boolean add(Object o) {
                return false;
            }复制代码
            @Override
            public boolean remove(Object o) {
                return false;
            }复制代码
            @Override
            public void clear() {复制代码
            }复制代码
           //省略部分代码复制代码
            @Override
            public Object get(int index) {
                return null;
            }复制代码
            @Override
            public ListIterator listIterator() {
                return null;
            }复制代码
            @Override
            public ListIterator listIterator(int index) {
                return null;
            }复制代码
            @Override
            public ListIterator listIterator(int index) {
                return null;
            }复制代码
            @Override
            public Object[] toArray(Object[] a) {
                return new Object[0];
            }
        }
    }复制代码

Set接口

Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样运行null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,同时要注意任何可变对象,如果在对集合中元素进行操作时,导致e1.equals(e2)==true,则必定会产生某些问题。实现了Set接口的集合有:EnumSet、HashSet、TreeSet。

3.1、EnumSet

是枚举的专用Set。所有的元素都是枚举类型。

3.2、HashSet

HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。它内部元素的顺序是由哈希码来决定的,所以它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。

    public class Set接口 {
        // Set接口规定将set看成一个集合,并且使用和数组类似的增删改查方式,同时提供iterator迭代器
        //    public interface Set<E> extends Collection<E>
        //    public interface Collection<E> extends Iterable<E>
        //    public interface Iterable<T>
        class MySet implements Set {复制代码
            @Override
            public int size() {
                return 0;
            }复制代码
            @Override
            public boolean isEmpty() {
                return false;
            }复制代码
            @Override
            public boolean contains(Object o) {
                return false;
            }复制代码
            @Override
            public Iterator iterator() {
                return null;
            }复制代码
            @Override
            public Object[] toArray() {
                return new Object[0];
            }复制代码
            @Override
            public boolean add(Object o) {
                return false;
            }复制代码
            @Override
            public boolean remove(Object o) {
                return false;
            }复制代码
            @Override
            public boolean addAll(Collection c) {
                return false;
            }复制代码
            @Override
            public void clear() {复制代码
            }复制代码
            @Override
            public boolean removeAll(Collection c) {
                return false;
            }复制代码
            @Override
            public boolean retainAll(Collection c) {
                return false;
            }复制代码
            @Override
            public boolean containsAll(Collection c) {
                return false;
            }复制代码
            @Override
            public Object[] toArray(Object[] a) {
                return new Object[0];
            }
        }
    }复制代码


Java基础19-一文搞懂Java集合类框架,以及常见面试题(二):https://developer.aliyun.com/article/1535725

目录
相关文章
|
5天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
7天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
14天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
12天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
14天前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
2天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
11 2
|
8天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
31 4
|
9天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
44 4
|
9天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
9天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
11 0