集合总结

HashSet在存一个新的对象的时候,先比较其跟已有的对象中的hashCode是否有相同的,如果没有相同的,则直接添加,不会调用equals方法进行判断,所以导致即使我们重写了equals方法也无法避免重复值的插入,只有当有两个hashCode相同的时候,它才会调用equals方法进行比较,如果返回的是true,则不添加,如果返回false,则添加进集合

  1. HashSet底层通过包装HashMap来实现,HashSet在添加一个值的时候,实际上是将此值作为HashMap中的key来进行保存。
  2. HashMap的底层实现是通过初始化化一个Entry数组来实现key、value的保存。
  3. 在HashMap的Entry中有四个变量,key、value、hash、next,其中next用于在hash方法添加值冲突时候,所指向的下一个值。
  4. 在HashMap中添加值步骤
    第一步,对key的hashcode进行hash计算,获取应该保存到数组中的index。
    第二步,判断index所指向的数组元素是否为空,如果为空则直接插入。
    第三步,如果不为空,则依次查找entry中next所指定的元素,判读key是否相等,如果相等,则替换久的值,返回。
    第四步,如果都不相等,则将此链表头元素赋值给待插入entry的next变量,让后将待插入元素插入到entry数组中去。
  5. map遍历方法有两种,keyset 和Map.Entry

TreeMap中默认的排序为升序,只能储存
自然顺序的元素,Comparable接口的compareTo方法
自定义比较器实现Comparator接口,实现compare方法

常用集合的默认初始容量和扩容的原因:
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低。
加载因子的系数小于等于1,意指 即当 元素个数 超过 容量长度*加载因子的系数 时,进行扩容。另外,扩容也是有默认的倍数的,不同的容器扩容情况不同。

List 是有序的、可重复
ArrayList、Vector默认初始容量为10
Vector 和 ArrayList区别
Vector:线程安全,但速度慢
    底层数据结构是数组结构
    加载因子为1:即当元素个数超过容量长度时,进行扩容
    扩容增量:原容量的 1倍
      如 Vector的容量为10,一次扩容后是容量为20
ArrayList:线程不安全,查询速度快
    底层数据结构是数组结构
    扩容增量:原容量的 0.5倍      
Set(集) 元素无序的、不可重复。
HashSet:线程不安全,存取速度快
     底层实现是一个HashMap(保存数据),实现Set接口
     默认初始容量为16(为何是16,见下方对HashMap的描述)
     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
     扩容增量:原容量的 1 倍
      如 HashSet的容量为16,一次扩容后是容量为32

Map是一个双列集合
HashMap:默认初始容量为16
     (为何是16:16是2^4,可以提高查询效率,另外,32=16<<1 –>至于详细的原因可另行分析,或分析源代码)
     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
     扩容增量:原容量的 1 倍
      如 HashSet的容量为16,一次扩容后是容量为32

LinkedHashMap 与 HashMap区别
HashMap:

开发中用得更多的当然是HashMap,在Map中插入、删除和获取元素,HashMap是比较好的选择。它根据key的hashcode值进行数据存储,根据key可以直接获取对应的value,在效率上也是非常快的。HashMap允许一个为null的key,至于value可以有多个null。但是如果需要进行多线程的并发写HashMap,就可能造成数据的不一致情况,这个时候可以使用Collections.synchronizedMap的方式,或者使用Hashtable,或者更高级的ConcurrentHashMap,这个是jdk1.5出现的并发包下的,主要用来解决并发的Map操作。

注:ConcurrentHashMap的性能是优于Hashtable和Collections.synchronizedMap的。

LinkedHashMap:

顾名思义多了一层链表操作,既然有了链表,那必然就能找到插入数据的顺序了,也就是插入的数据,在遍历取出时,是于插入的顺序一致的。
它本身就是从HashMap继承而来,并且实现了Map接口,LinkedHashMap的实现基本和HashMap一致,但是他多一个header属性,这个属性就是用来额外存储顺序的。
在工作中,使用得linkedHashMap更多的是为了保持与某个数组或者集合的顺序一致,同时又构建比较复杂key-value型的数据结构,此时一般就会用到这个了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值