Java集合概述和总结分析与图示

简介: Java集合概述和总结分析与图示

Java集合中主要分为两大体系:collection和Map。也就是值的集合和键值对(Entry<K,V>)的集合。


JDK1.2 引入了 Java 集合框架,包含一组数据结构。与数组不同,这些数据结构的存储空间会随着元素添加动态增加。其中,一些支持添加重复元素另一些不支持,一些支持 null,一些能自动升序打印元素。


所有这些数据结构在 java.util 包里,包含了 Collection、List、Set、Map、SortedMap 接口。这些接口的实现类有 LinkedList、TreeSet、ArrayList、HashMap 等。除了这些数据结构,java.util 包还提供了 Date、GregorianCalender、StringTokenizer、Random 这样的工具类。分类

可以按照接口、实现、算法三个方面对集合框架中的数据结构进行分类:



接口:Collection、List、Map 组成了集合框架中所有具体实现类的接口,它们定义了子类必须实现的方法,非常好记。比如向集合添加元素,会用到 Collection 中定义的 add() 方法


实现:所有实现了上述3个接口的类,都被称作集合框架,实际上就是数据结构。比如 LinkedList、TreeSet 等


算法:集合框架提供了很多可以直接调用的算法,比如求最大最小值、排序、填充等

【1】Collection接口




20161118103711562.jpg



【2】Map接口继承树

Map接口下面的均为键值对实体(Entry)集合,类名通常以*Map结尾,比较特殊的有HashTable和Properties。


集合框架核心接口及实现类:


Collection:根接口,大部分数据结构都实现了 Collection 接口中的方法


Set:实现 Set 接口的数据结构不允许重复的元素,例如 HashSet、LinkedHashSet


SortedSet:实现 SortedSet 接口的数据结构默认可按升序打印元素,例如 TreeSet


List:实现 List 接口的数据结构允许重复元素,可通过 index 访问元素,例如 LinkedList、ArrayList、Vector


Map:实现 Map 接口的数据结构存储键值对,不允许重复的 key,例如 HashMap、LinkedHashMap、Hashtable


SortedMap:继承了 Map 接口,存储键值对,不允许重复的 key,默认可按 key 升序打印元素,例如 TreeMap


SortedSet 与 SortedMap 默认的排序是自然序,可通过 Comparator 或 Comparable 接口实现自定义排序。在接口与具体的实现类之间还有一些抽象类,如下图:



这些抽象类为集合增加了很多功能:


HashSet:实现 Set 接口,不允许重复的元素,底层数据结构 hash table


LinkedHashSet:实现 Set 接口,不允许重复的元素,底层数据结构 hash table 与双链表


TreeSet:实现 NavigableSet 接口,不允许重复的元素,底层数据结构红黑树


ArrayList:实现 List 接口,允许重复元素,底层数据结构可变数组


LinkedList:实现 List 接口,允许重复元素,底层数据结构双链表


Vector:实现 List 接口,允许重复元素,底层数据结构可变数组


HashMap:实现 Map 接口,不允许重复的 key,底层数据结构 hash table


LinkedHashMap:实现 Map 接口,不允许重复的 key,底层数据结构 hash table 与双链表


HashTable:实现 Map 接口,不允许重复的 key,底层数据结构 hash table


TreeMap:实现 SortedMap 接口,不允许重复的 key,底层数据结构红黑树

【3】Collection接口详解接:


Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。


JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。


在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理。从 Java5 增加了泛型以后,Java 集合可以记住容器中对象的数据类型

主要方法:






20161118104128483.png


【4】Map接口详解


Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value。


Map 中的 key 和 value 都可以是任何引用类型的数据


Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。


常用String类作为Map的“键”。


key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。Map 常用方法

  • 添加、删除操作:
Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()


  • 元视图操作的方法:
Set<K> keySet()
 Collection<V> values()
Set<Map.Entry<K, V>> entrySet()
  • 元素查询的操作:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)

【5】使用Iterator接口遍历集合

Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。


Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。

Iterator iterator = coll.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}

Java 5 还提供了 foreach 循环迭代访问 Collection:



【6】实现类对比分析


List容器中的每个元素都有一个整数型的序号记载其位置,元素值可以重复,允许多个null。


Map容器中元素为Key-Value对,key不可重复,元素值可以重复,允许一个key为null,HashMap中允许存在多个null为键值。


HashTable是Dictionary的子类并实现了Map接口。

Set容器中元素根据hash算法无序存放,元素不可重复,允许一个null。

类\特性 有序 可重复 线程安全 存储结构 适用情况 父类或接口
ArrayList 数组 默认缺省选择 List
LinkedList 链表 频繁插入删除 List
Vector 数组 线程安全 List
HashMap 无序 key不可重复Value可重复 根据hashcode进行hash算法得到的值进行存储 默认缺省选择 Map
LinkedHashMap 有序迭代次序与插入顺序一致 key不可重复Value可重复 hash算法+指针 需要排序 HashMap
TreeMap 有序根据Key-Value进行排序 key不可重复Value可重复 hash算法+key特定排序 特定要求排序 SortedMap
HashTable 无序 key不可重复Value可重复 hash算法 线程安全 Map
Properties 无序 key不可重复Value可重复 hash算法 线程安全,属性文件 HashTable
HashSet 无序 不可重复 hash算法 默认缺省选择 Set
LinkedHashSet 有序根据插入顺序排序 不可重复 hash算法+指针 有序 HashSet
TreeSet 有序根据特定排序 不可重复 hash算法+排序 特定排序 SortedSet



参考博文:

一文快速了解Java集合框架

目录
相关文章
|
11天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
33 3
|
17天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
28天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
44 5
|
2月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
48 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
42 2
|
2月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2月前
|
Java 开发者
从 Java 中的 Set 集合中删除元素
【10月更文挑战第30天】