【Java】集合框架JCF

本文深入解析Java集合框架,包括Collection、List、Set、Map等核心接口及其实现类的特性与区别,如ArrayList、LinkedList、HashSet、HashMap等,探讨其内部结构与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Collection的框架类图

在这里插入图片描述

public interface Collection<E> extends Iterable<E>

在Java的类集里面(java.util包)提供了两个最为核心的接口:Collection、Map接口。
Collection是单个集合保存的最大父接口。
Collection接口只是一个存储数据的标准,并不能区分存储类型。在实际开发之中,往往会考虑使用Collection接口的子接口:List(允许数据重复)、Set(不允许数据重复)。
在这里插入图片描述

接口下的常用方法:
在这里插入图片描述

二、List接口

public interface Set<E> extends Collection<E>

List接口对Collection的扩充:
在这里插入图片描述

由于List本身还是接口,要想取得接口的实例化对象,就必须有子类,在List接口下有三个常用子类:ArrayList、Vector、 LinkedList。
在这里插入图片描述

集合操作简单java类时,对于remove()、contains()方法需要equals()方法支持。

面试题:请解释ArrayList与Vector区别

1、历史时间:ArrayList是从JDK1.2提供的,而Vector是从JDK1.0就提供了。
2、处理形式:ArrayList是异步处理,性能更高;Vector是同步处理,性能较低。
3、数据安全:ArrayList是非线程安全;Vector是性能安全。
4、输出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、 foreach、Enumeration

面试题:请解释ArrayList与LinkedList区别

1、观察ArrayList源码,可以发现ArrayList里面存放的是一个数组,如果实例化此类对象时传入了数组大小,则里面保存的数组就会开辟一个定长的数组,但是后面再进行数据保存的时候发现数组个数不够了会进行数组动态扩充。 所以在实际开发之中,使用ArrayList最好的做法就是设置初始化大小。
2、LinkedList:是一个纯粹的链表实现,与之前编写的链表程序的实现基本一样(人家性能高)。
总结:ArrayList封装的是数组;LinkedList封装的是链表。ArrayList时间复杂度为1,而LinkedList的复杂度为 n。

三、Set接口

public interface Set<E> extends Collection<E>

Set接口与List接口最大的不同在于Set接口中的内容是不允许重复的。同时需要注意的是,Set接口并没有对 Collection接口进行扩充,而List对Collection进行了扩充。因此,在Set接口中没有get()方法。

在Set子接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)
在这里插入图片描述
在Java中进行对象比较的操作有两步:第一步要通过一个对象的唯一编码找到一个对象的信息,当编码匹配之后再调用equals()方法进行内容的比较。

如果两个对象的hashCode()相同,equals()不同结果是什么?
答案:不能消除
如果两个对象的hashCode()不同,equals()相同结果是什么?
答案:不能消除
对象判断必须两个方法equals()、hashCode()返回值都相同才判断为相同。

我们经常听见hashCode相等,那么equals可以不相等,但是equals相等,那么hashCode就一定相等这2个定理,这两个定理其实是一种规范,但是我们可以不遵从这种规范,如果不实现这个规范,那么这些对象存入Map或者Set集合中就会有问题

四、集合输出

1、Iterator迭代输出

在JDK1.5之前,在Collection接口中就定义有iterator()方法,通过此方法可以取得Iterator接口的实例化对象;而在 JDK1.5之后,将此方法提升为Iterable接口中的方法。无论你如何提升,只要Collection有这个方法,那么List、Set也一定有此方法。

对于Iterator接口最初的设计里面实际有三个抽象方法:
1、判断是否有下一个元素: public boolean hasNext()
2、取得当前元素: public E next()
3、删除元素: public default void remove(),此方法从JDK1.8开始变为default完整方法

标准的Iterator使用:
在这里插入图片描述

2、ListIterator双向迭代输出

Iterator输出有一个特点:只能够由前向后进行内容的迭代处理,而如果要想进行双向迭代,那么就必须依靠 Iterator的子接口:ListIterator来实现。
首先来观察一下此接口定义的方法:
1、判断是否有上一个元素:public boolean hasPrevious()
2、取得上一个元素:public E previous()

Iterator接口对象是由Collection接口支持的,但是ListIterator是由List接口支持的,List接口提供有如下方法:

  • 取得ListIterator接口对象:public ListIterator listIterator()

在这里插入图片描述
如果要想实现由后向前的输出,那么应该首先进行从前向后的输出,否则无法实现双向

3、Enumeration枚举输出

在JDK1.0的时候就引入了Enumeration输出接口,而在JDK1.5的时候对其也做了更正,主要是追加了泛型的应用。 首先来观察Enumeration的接口定义:
1、判断是否有下一个元素:public boolean hasMoreElements()
2、取得元素:public E nextElement()

但是要想取得这个接口的实例化对象,是不能依靠Collection、List、Set等接口的。只能够依靠Vector子类,因为 Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法

  • 取得Enumeration接口对象:public Enumeration elements()

在这里插入图片描述

4、foreach输出

在这里插入图片描述

五、Map接口

public interface Map<K,V>

Map接口中常用的方法:
在这里插入图片描述

Map本身是一个接口,要使用Map需要通过子类进行对象实例化。Map接口的常用子类有如下四个: HashMap、 Hashtable、TreeMap、ConcurrentHashMap。

1、HashMap
public class HashMap<K,V> extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable

HashMap内部的结构可以看作是数组(Node[] table)和链表结合组成的复合结构, 数组被分为一个个桶(bucket),通过哈希值决定了键值对在这个数组的寻址;哈希值相同的键值对,则以链表形式存储,如果链表大小超过阈值(TREEIFY_THRESHOLD, 8),链表就会被改造为树形结构。

哈希桶扩容(容量 + 负载因子)
树化(保证因哈希冲突严重所带来的安全问题)

2、Hashtable
public class Hashtable<K,V>    extends Dictionary<K,V>    implements Map<K,V>, Cloneable, java.io.Serializable

面试题:请解释HashMap与Hashtable的区别
在这里插入图片描述

3、ConcurrentHashMap
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>    implements ConcurrentMap<K,V>, Serializable

在这里插入图片描述

4、Map集合使用Iterator输出

在这里插入图片描述
在这里插入图片描述

5、Map集合小结

1、Collection保存数据的目的一般用于输出(Iterator),Map保存数据的目的是为了根据key查找,找不到返 回null
2、Map使用Iterator输出(Map.Entry的作用)
3、HashMap数据结构一定要理解(链表与红黑树)、HashMap与Hashtable区别

六、Stack栈

public class Stack<E> extends Vector<E>

在Java集合中提供有Stack类,这个类是Vector的子类。需要注意的是,使用这个类的时候使用的不是Vector类中的方法,并且在使用时不要进行向上转型。因为要操作的方法不是由List定义的,而是由Stack定义的。
1、入栈 : public E push(E item)
2、出栈 : public synchronized E pop()
3、观察栈顶元素 : public synchronized E peek()

在这里插入图片描述

七、Queue接口

public interface Queue<E> extends Collection<E>

在这里插入图片描述

使用Queue接口主要是进行先进先出的实现,在这个接口里面有如下的方法:

  • 按照队列取出内容: public E poll();

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值