我们将逐步学习Java集合类的优化过程,并按版本逐一对比分析。主要讨论的焦点将包括JDK1.0、1.2、1.4、1.5、1.6、1.8、9、10、11和21版本的Java集合功能
Java集合API的改进
Java集合API在多年中经历了显著改进,引入了新功能、增强和优化,以提高开发者的生产力、改善性能,并适应修订的编程模式和需求。它将帮助开发者利用Java集合的力量构建更健壮、高效和可维护的应用程序。
JDK1.0中的集合类
在JDK1.0中,有四个类Vector、Stack、Hashtable和Properties。此外,还有一个名为“Enumeration”的接口,用于以简单的方式遍历值。进一步分类,Stack是Vector的子类,Properties是Hashtable的子类。
Vector类的问题
Vector是线程安全的,即Vector中的所有方法都是同步的。因此,它不适合单线程环境。
由于它在内部基于数组工作,插入和删除操作非常慢。
它允许在其中添加重复元素
无法按顺序存储元素
Hashtable类的问题
Hashtable是线程安全的,即Hashtable中的所有方法都是同步的。因此,它不适合单线程环境。
Hashtable无法按顺序存储条目
Enumeration的问题
无法删除元素且方法名称过长
JDK1.2中的集合类
在JDK1.2中,SunMicro-system引入了ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap、Iterator和ListIterator。
ArrayList:用于提供单线程环境下的解决方案,因为ArrayList中的方法不是同步的。
LinkedList用于提供更快的元素插入和删除。
HashSet:不允许有重复元素。
TreeSet:用于按排序顺序存储元素。
HashMap:提供单线程环境下的解决方案,因为HashMap中的方法不是同步的。
TreeMap:用于按顺序存储键值对。
Iterator:用于解决枚举问题。同时还有一个专门处理列表的类ListIterator。
HashSet的问题:它不能保持插入顺序,即它不会按照元素添加到集合中的顺序存储元素。
HashMap的问题:像HashSet一样,它不能保持插入顺序。
JDK1.4中的集合类
在JDK1.2中,SunMicrosystems引入了LinkedHashSet和LinkedHashMap。
LinkedHashSet:用于解决HashSet中插入顺序的问题。它按照元素添加到集合中的顺序存储元素。
LinkedHashMap:用于解决HashMap中插入顺序的问题。它还按照元素添加到集合中的顺序存储元素。
JDK1.5中的集合类
for-Each循环:作为替代迭代器进行迭代的另一种方法
CopyOnWriteArrayList:引入以允许在修改底层列表的情况下安全地迭代元素。
CopyOnWriteArraySet:它使用内部CopyOnWriteArrayList进行所有操作。因此,它具有与该列表相同的基本属性。
JDK1.6中的集合类
NavigableSet:作为扩展了导航方法的有序集合,用于报告给定搜索目标的最近匹配。
NavigableMap:作为扩展了导航方法的SortedMap,返回给定搜索目标的最近匹配项。
Java集合框架也有新更新,以支持lambda表达式、流和聚合操作。
stream()作为父接口Collection的默认方法:返回一个以该集合为源的顺序Stream。
parallelStream()作为父接口Collection的默认方法:返回一个可能并行的Stream,以这个集合作为其源。
spliterator()作为父接口Collection的一个默认方法:创建一个遍历此集合中元素的Spliterator
removeIf(Predicatefilter)作为父接口Collection的默认方法:移除满足给定谓词的所有元素。
同样重要的是,这里的一个显著点是所有新添加的方法都是接口Collection内部的默认方法。这是使用默认方法的最佳示例。
新增用于创建不可变列表、集合和映射的of()静态工厂方法介绍。这些方法包括:List.of(),Set.of(),Map.of(),Map.ofEntries()
Arrays.mismatch():新增方法以查找两个数组中第一个不匹配的索引。
Arrays.compare():添加了新方法来比较提供的两个数组中的元素。
为Arrays.equals()添加了更多重载方法。
Enumeration.asIterator():添加了返回java.util.Iterator实例的新方法。
此外,在StreamAPI中添加了一些方法,如dropWhile、takeWhile和ofNullable。
Java10中的集合增强
引入了List.copyOf()、Set.copyOf()和Map.copyOf(),用于创建现有集合的不变副本。
Java11中的集合增强
Collection.toArray(IntFunction):添加了新的默认方法,允许将集合的元素转移到新创建的具有所需运行时类型的数组中。新方法是现有toArray(…)方法的重载变体。
Java21中的集合增强
Java21在集合框架中引入了三个新接口:SequencedCollection、SequencedSet和SequencedMap。这些新的集合接口通过新库提供的默认方法,使我们能够访问其第一个和最后一个元素。该功能还允许我们通过简单的调用方法来获取集合的反转视图。
defaultvoidaddFirst(Ee)defaultvoidaddLast(Ee)defaultEgetFirst()defaultEgetLast()defaultEremoveFirst()defaultEremoveLast()SequencedCollectionreversed()SequencedSet序列集合
SequencedSetreversed()SequencedMap序列映射
defaultMap.EntryfirstEntry()defaultMap.EntrylastEntry()defaultMap.EntrypollFirstEntry()defaultMap.EntrypollLastEntry()defaultVputFirst(Kk,Vv)defaultVputLast(Kk,Vv)SequencedMapreversed()defaultSequencedSet>sequencedEntrySet()defaultSequencedSetsequencedKeySet()defaultSequencedCollectionsequencedValues()