Java学习笔记-09Collection
2021/11/7 22:13:31
本文主要是介绍Java学习笔记-09Collection,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- ArrayList: 线程不安全,效率高;底层使用Object[] elementData存储
- LinkedList: 对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
- Vector: 古老实现类;线程安全,效率低;底层使用object[] elementData存储
- 都实现了List接口;都存储有序的、可重复的数据
jdk7:底层创建长度为10 的Object[]数组elementData;若添加元素导致底层数组容量不够,则扩容,默认扩容为原来的1.5倍,并需要将原有数组中的数据复制到新数组中;因此建议开发中使用带参的构造器
jdk8:底层Object[] elementData 初始化为{},并没有创建;第一次调用add()时,底层才创建了长度为10的数组
- HashSet:线程不安全,可以存储null值
- LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历
- TreeSet:可以按照添加对象的指定属性,进行排序
- Set根据元素的哈希值存放,equals()判断不一致
- 添加元素的过程:以HashSet为例:
- 首先调用元素a所在类的hashCode()方法,计算元素a的哈希值
- 然后此哈希值通过某种算法计算出在HashSet底层数组中的存放位置(即索引位置)
- 接着判断数组此位置上是否已经有元素,若没有其他元素,则元素a添加成功(情况1),若此位置上又其他元素b,则比较元素a与元素b的hash值,若hash值不相同,则元素a添加成功(情况2),若hash值相同,需要调用元素a所在类的equals()方法,equals()返回true,元素a添加失败,返回false,则元素a添加成功(情况3)。
- 对于情况2和3,元素a与已经存在在指定索引位置上的数据以链表的形式存储,原来的元素在数组中,指向元素a
- LinkedHashSet 添加数据的同时,每个数据还维护了两个引用,记录此数据前一个和后一个数据。好处:对于频繁的遍历操作,效率高于HashSet
- 向TreeSet(底层红黑树)中添加的数据,要求是相同类的对象
Map中的key:无序的、不可重复的,使用Set存储所有的key key所在的类要重写equals()和hashcode() (以HashMap为例)
Map中的value:无序的、可重复的,使用Collection存储所有的value value所在的类要重写equals()
一个键值对:key-value构成了一个Entry对象
Map中的Entry:无序的、不可重复的,使用Set存储所有的entry
- Hashmap:主要实现类,线程不安全,效率高,存储null的key和value
- 底层:jdk7及以前:数组+链表,jdk8:数组+链表+红黑树
- LinkedHashmap:在遍历map元素时,可以按照添加的顺序实现遍历
- TreeMap:按照键值对进行排序,实现排序遍历,底层使用红黑树
- Hashtable:古老实现类,线程安全,效率低,不能存储null的key和value
- Properties:常用来处理配置文件,key和value都是String类型
Hashmap的底层实现原理
- jdk7
- 实例化以后,底层创建了长度为16的一维数组Entry[] table
- 首先,调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存在位置
- 若此位置上的数据为空,此时key1-value1添加成功
- 若此位置上的数据不为空(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多个数据的哈希值:若不相同,此时的key1-value1添加成功,若相同,继续比较:调用key1所在类的equals()方法,比较:若equals()返回false:此时key1-value1添加成功,若返回true:使用value1替换相同key的vlaue值(修改功能)
- 默认扩容为原来容量的2倍,并将原来的数据复制过来
- jdk8
- 实例化以后,底层没有创建一个长度为16的数组
- jdk8底层的数组是:Node[],而非Entry[]
- 首次调用put()方法时,底层创建长度为16的数组
- jdk7底层结构只有:数组+链表,jdk8中底层结构:数组+链表+红黑树
- 当数组的某个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度>64时,此时此索引位上的所有数据改为红黑树存储。
-
这篇关于Java学习笔记-09Collection的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02Java管理系统项目实战入门教程
- 2024-11-02Java监控系统项目实战教程
- 2024-11-02Java就业项目项目实战:从入门到初级工程师的必备技能
- 2024-11-02Java全端项目实战入门教程
- 2024-11-02Java全栈项目实战:从入门到初级应用
- 2024-11-02Java日志系统项目实战:初学者完全指南
- 2024-11-02Java微服务系统项目实战入门教程
- 2024-11-02Java微服务项目实战:新手入门指南
- 2024-11-02Java项目实战:新手入门教程
- 2024-11-02Java小程序项目实战:从入门到简单应用