java集合-总结

java集合

在这里插入图片描述

List

继承自Collection。可以存在相同的对象,有序的。具体实现类有ArrayList,LinkedList,Vector等(已经被废弃,很少使用)

ArrayList

​ ArrayList:线程不安全,底层基于数组,在查询和修改的时候可以根据索引位置快速定位到元素,所以查询和修改比较快,但是因为数组长度是不可变的,每次更改数组长度的时候,底层都是需要新建数组,然后拷贝数组中的数据的,所以添加和删除的话效率就比较低。

LinkedList

​ LinkedList:线程不安全,底层时基于双向链表的,链表查询的话就只有一个节点一个节点的往下找,所以查询和修改效率比较低,但是添加元素的话,直接在原有的基础上挂上一个新节点即可,删除也是一样,只需要重新挂节点,所以添加和删除效率比较高。

Vector

​ 它是ArrayList的线程安全版本,也就是在ArrayList的基础上增加了线程安全的特点。

Set

继承自Collection。不保存重复的对象,无序的,。具体实现类有HashSet,LinkedHashSet,TreeSet等。

HashSet

​ 实现Set接口。不能保证元素的顺序,元素不能重复。元素可以为null。底层是一个数组,但是元素的位置和元素的取值不存在确定的关系,而是将元素进行Hash运算之后的位置。这样做是为了增加查询的速度。index = hash(value)。不是线程安全。HashSet是基于HashMap的,这个HashMap的key就是放进HashSet中的对象,value就是一个Object类型的对象。

​ 当向HashSet集合中存入一个元素时,HashSet会先调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。如果该位置没有被占用,直接把该元素存储到 hashCode() 该位置。如果该位置被占用,那么会继续判断该元素和占用对象的 equals() 作比较。hashCode 相同,equals 为 true,则视为同一个对象,不保存在 hashSet中。hashCode 相同,equals 为 false,则存储在之前对象同槽位形成链表,如果链表节点数大于等于8,则转为红黑树。当红黑树节点小于等于6的时候,则退化为链表结构(红黑树结构是jdk1.8才有的)。

TreeSet

该类实现了Set接口,可以实现排序等功能。排序方式主要为自然排序和定制排序:

​ 自然排序:TreeSet存储元素类型类型必须要实现Comparable接口,并且复写里面的compareTo方法。

​ 定制排序:在创建TreeSet对象的时候,在构造参数位置传入一个匿名接口Comparator<>,泛型跟上存储类型,然后复写compare方法即可。

​ compareTo方法和compare一样,返回值是自己的某个属性和另一个对象的某个属性的差值,返回0说明是重复的;如果是负数,则往前面排;如果是正数,往后面排。

LinkedHashSet

LinkedHashSet存储结构是一个双向链表,因此它存储的元素是有序的。

LinkedHashSet继承自HashSet,源码更少、更简单,唯一的区别是LinkedHashSet内部使用的是LinkHashMap。这样做的意义或者好处就是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。

Map

Map内存储的是键/值对这样以成对的对象组(可以把一组对象当成一个元素),通过“键”对象来查询“值”对象

Map是不同于Collection的另外一种集合接口

Map中,key值是唯一的(不能重复),而key对象是与value对象关联在一起的
在这里插入图片描述

HashMap —— key/value对是按照Hash算法存储的

是一个映射关系。这个集合中的数据是以Entry(key,value)的形式存在。一般情况下,key是String,而value是Object。key不能重复,但是value可以重复。HashMap的原理是index=hash(key)。也就是根据key进行hash运算来确定Object的存储位置。

TreeMap —— key/value对是排序(按key排序)存储的

HashMap与TreeMap的比较

  • HashMap基于哈希表实现。TreeMap基于树实现。
  • HashMap可以通过调优初始容量和负载因子,优化HashMap空间的使用。TreeMap没有调优选项,因为该树总处于平衡状态
  • HashMap性能优于TreeMap。

HashMap与Hashtable的比较

  • Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
  • Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
  • HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

如何选择集合类

  • Set内存放的元素不允许重复,List存放的元素有一定的顺序。
  • Map的应用主要在利用键/值对进行快速查询。
  • ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好 。
  • HashSet和TreeSet的区别在于集合内元素是否排序 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值