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

目录
相关文章
|
10天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
27 3
|
6天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
20 5
|
6天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
34 5
|
5天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
14 1
|
8天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
27 3
|
4天前
|
算法 Java
JAVA 二叉树面试题
JAVA 二叉树面试题
10 0
|
3天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
71 38
|
1天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
5天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
18 1
[Java]线程生命周期与线程通信
|
2天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。