Java关键知识点之集合框架

汇总:Android小白成长之路_知识体系汇总【持续更新中…】

集合框架

在这里插入图片描述

  • SetList区别:
    • Set接口实例存储的是无序、不重复的数据,List存放的是有序、可以重复的数据
    • Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变
    • List和数组类似,可以动态增长,查找元素效率高,插入删除效率低,会引起元素位置改变
  • 只有VectorStackHashTable是线程安全的,其他都是非线程安全的

ArrayList

  • ArrayList类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制
  • ArrayList<E>中的元素实际上都是对象,因此无法直接把E类型变量写为基本数据类型,而应该使用它们的包装类
  • ArrayList是线程不安全的,建议在单线程中使用
  • ArrayList的默认大小是10,当容量不足时,会扩容,新的容量 = (原来容量*3)/2+1

LinkedList

  • LinkedList是一种双向循环链表,且头结点不存放数据
  • LinkedList是线程不安全的,建议在单线程中使用
  • LinkedList支持从头遍历和从尾遍历,因此它的get方法做了优化,如果索引小于size/2,则从头遍历,否则从尾遍历
  • LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址,ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址,所以,如果待插入、删除的元素是在数据结构的前半段尤其是非常靠前的位置的时候,LinkedList的效率将大大快过ArrayList,但越是往后,ArrayList由于要批量copy的元素越来越少,操作速度必然追上乃至超过LinkedList。不过一般情况下都是LinkedList更快,毕竟ArrayList如果触发了扩容也是耗时操作

HashMap

  • HashMap数组+链表组成,jdk1.8以后,当链表长度达到8,便会使用红黑树
  • HashMap.put(key,value)过程:
    • 获取key字符串的hashcode
    • 经过HashMap中的hash函数,使得hash值更散列
    • 根据hash值确定存储的位置,若该位置没有元素,则直接插入,否则迭代该处元素链表并依次比较其keyhash值,如果两个hash值相等,则用新的value覆盖掉原来的,如果不等,则将该节点插入链表的表头,如果超过了8,则转为插入红黑树
  • HashMap的初始容量大小默认为16,当存储的元素个数超过容量乘以加载因子(默认0.75)的结果值,就会将数组容量变为原来的两倍,这个过程称为扩容,扩容时会生成一个新的数组,原来的所有数据将重新计算hash值重新分配到新数组中,非常耗时,因此创建hashMap时预设元素的个数能够有效地提高性能
  • HashMap允许keynull的形式存取,会将其放到第一个位置中,在存储时会对其做特殊处理
  • HashMap是线程不安全的,需要线程安全时可用使用HashTable
  • 重写对象的equals方法时,通常要同时重写它的hashcode方法,保证其返回相同的值,就是为了防止两个对象equals返回true,却由于hashcode不同,从而在HashMap中存放了两个对象

HashSet

  • HashSet是基于HashMap来实现的,是一个不允许重复元素的集合
  • HashSet也允许有null
  • HashSet实现了Set接口, 仅存储对象,value值默认为Object对象
  • HashSet是线程不安全的
    仅存储对象,value值默认为Object对象
  • HashSet是线程不安全的

猜你喜欢

转载自blog.csdn.net/Nbin_Newby/article/details/120677017