java集合 基础思维导图

java集合 基础思维导图JAVA 集合 在处理数据的过程中经常会需要一个容器来存储某一类型的数据 Java 中的数组就是这样一种容器 但 Java 中的数组有其局限性 定义后的数组长度不可变 超出数组长度后就不能再存放数据了 而很多时候我们并不知道数据到底有多少 所以就需要有不定长的容器来存放数据 这就是集合 Java 中的集合都采用了泛型实现 可以存入任何类型的对象数据 Java 中的数组 Java

大家好,我是讯享网,很高兴认识大家。



JAVA 集合
在处理数据的过程中经常会需要一个容器来存储某一类型的数据,Java 中的数组就是这样一种容器。但 Java 中的数组有其局限性,定义后的数组长度不可变,超出数组长度后就不能再存放数据了。而很多时候我们并不知道数据到底有多少,所以就需要有不定长的容器来存放数据,这就是集合,Java 中的集合都采用了泛型实现,可以存入任何类型的对象数据。Java 中的数组:

青岛Java培训--中享思途

青岛Java培训--中享思途

1. List 列表,有序、可重复
常用的 List 实现类有:ArrayList、LinkedList、Vector、Stack。
1.1 ArrayList 列表
ArrayList 数组列表,有序,可重复,内部是通过 Array 实现。初始化对象时,如果没有传大小,则列表的大小为 DEFAULT_CAPACITY 的默认值 10。当列表容量不够时,继续往列表中追加元素,则通过数组拷贝,对原数组进行扩容,扩容的方式为 "int newCapacity = oldCapacity + (oldCapacity >> 1)",即新数组容量 newCapacity 为 10 + 10/2 = 15。如果一次性追加多个元素时比如 6 ,时候列表最小容量 minCapacity 需要 10 + 6 = 16,新的容量 newCapacity 小于最小容量 minCapacity 则新数组容量取最小容量值 newCapacity = minCapacity。
对数组列表进行插入、删除操作时都需要对数组进行拷贝并重排序。所以如果能知道大概存储多少数据时,尽量初始化初始容量,提升性能。

青岛Java培训--中享思途

1.2 LinkedList 双向链表
LinkedList 是双向链表,也即每个元素都有指向前后元素的指针。既然是链表那么顺序读取的效率非常高,而随机读取的效率较低。当随机获取一个 index 位元素时,链表先比较 index 和链表长度 1/2 的大小,小于时从链表头部查找元素,大于时就从链表尾部查找元素。

java集合 基础思维导图青岛Java培训--中享思途

对比 ArrayList 如果随机读取数据较多时使用 ArrayList 性能高,插入删除较多时使用 LinkedList 性能高。
1.3 Vector 向量,线程安全的列表
与 ArrayList 一样也是通过数组实现的,不同的是 Vector 是线程安全的,也即同一时间下只能有一个线程访问 Vector,线程安全的同时带来了性能的耗损,所以一般都使用 ArrayList。Vector 的扩容也与 ArrayList 不同,可以设置扩容值,默认每次扩容原来的一倍。

青岛Java培训--中享思途

1.4 Stack 栈,后进先出(LIFO)
Stack 继承自 Vector 所以也是数组实现的,线程安全的栈。因为 Stack 继承自 Vector 所以就拥有 Vector 中定义的方法,但作为栈数据类型,不建议使用 Vector 中与栈无关的方法,尽量只用 Stack 中的定义的栈相关方法,这样不会破坏栈数据类型。

青岛Java培训--中享思途

1.5 ArrayQueue 数组队列,先进后出(FIFO)
ArrayQueue 是数组实现的队列,从队尾加入数据,只能队头删除数据,可随机读取队列数据。

青岛Java培训--中享思途

2. Queue 队列,有序、可重复
继承自 Queue 的队列有:ArrayDeque、LinkedList、PriorityQueue。
2.1 ArrayDeque 数组实现的双端队列
ArrayDeque 是队列,但也可以作为栈使用,而且对比 Stack 更高效。作为双端队列那就可以在队列两端插入和删除元素。当追加元素超过容量限制时,则创建一个两边容量的新数组,并将原数组的内容拷贝到新数组中。

青岛Java培训--中享思途

2.2 LinkedList 队列也是双向链表
上文 1.2 中已经提过,这里就不赘述了。推荐使用 ArrayDeque。
2.3 PriorityQueue 优先队列,数组实现的二叉树
PriorityQueue 是一个完全二叉树实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值)。

青岛Java培训--中享思途

3. Map 映射/字典,无序,键值对,键唯一
常用的 Map 实现有:HashMap、TreeMap、LinkedHashMap
3.1 HashMap 哈希映射/字典
HashMap就是key->value的键值对数据,key是唯一的,而且key和value都可以为null。HashMap和HashTable相似,HashTable实现了线程同步,在 "Object超类解析" 章节中简单介绍过HashTable的数据存储方式。HashMap 是个无序的字典,遍历时不保证元素顺序。HashMap创建时默认会设置初始容量大小(默认16),和装载因子(默认0.75,扩充容量的阀值),装载因子=已存入元素个数/总容量大小。当然这两个值也可以手动设置。
HashMap的数据存储结构如下图:

青岛Java培训--中享思途

青岛Java培训--中享思途

hash() 函数对 key 取值后返回一个整数。又因为 HashMap 的容量 n 大小始终为 2 的幂(默认为 16),那么 n - 1 的二进制始终是最高位为 1,其它位为 0 的数,如:10...0,这个数与整数做 & 运算就得到 hash / n 的余数,余数的取值范围在 0 ~ n-1,很巧妙的设计。相关源码,这里截取了部分:

青岛Java培训--中享思途

3.2 TreeMap 红黑树实现的 key->value 容器,可排序
红黑树是一种自平衡二叉查找树,具体查看资料。
3.3 LinkedHashMap 链表映射/字典
LinkedHashMap 继承自 HashMap 所以具有 HashMap 的所有特性。同时又实现了双向链表的特性,保留了元素插入顺序。

青岛Java培训--中享思途

4. Set 集合,不可重复
常用的 Set 实现有:HashSet、LinkedHashSet、TreeSet、EnumSet。
4.1 HashSet 哈希集合
HashSet是基于HashMap实现的集合,对HashMap做了一些封装。数据结构如图:

青岛Java培训--中享思途

青岛Java培训--中享思途

4.2 LinkedHashSet 链表集合
继承自 HashSet 与 LinkedHashMap 相似,是对 LinkedHashMap 的封装。
4.3 TreeSet 红黑树集合
与 TreeMap 相似。是对 TreeMap 的封装。
本文只是对 Java 中的集合类做了个简单介绍,详细设计请查看源码了解详情。

小讯
上一篇 2024-12-25 08:34
下一篇 2024-12-23 19:39

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/1036.html