Java教程

Java学习笔记-09Collection

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!