对List、Set和Map的一个个人理解

List 和 set是 都是继承(extends) Collection 这个接口

List主要常用分为(List元素是可以重复的)
  • 1、ArrayList:底层使用的是动态数组实现的数据结构(特点是:查询快,增删慢),默认大小是10,使用的时候时会先判断对象的大小有没有等于或者大于默认(或者是自己定义)的对象大小,如果对象要是等于或者大于的话,arrayList就会实行扩容,新建一个数组对象是原来定于或者默认的1.5倍(ArrayList默认1.5倍扩容,这里也不知道为什么是1.5倍可能觉得1.5倍比较好权衡把),然后再把原先的对象复制到新里面去。

  • 2、linkedList:底层使用的是双向链表的数据结构(特点是:增删快,查询慢)

Set主要常用分为(Set元素是不可以重复的)

  • 1、HashSet:实现原理其实是HashMap,HashSet得key就是value
  • 2、TreeSet:实现原理其实是TreeMap
Map(Key、Value的形式保存数据)
  • HashMap:(线程不安全的) 底层使用的是(jdk7的时候用的是数组+链表的形式(hashMap数组是主体,链表是为了解决哈希冲突而存在的)jdk8的时候多了个红黑树)默认大小是16,使用的时候时会判断对对象大小有没有到默认大小(或者是自己定义的大小)的0.75,要是超过了,就会进行扩容机制,扩容的大小是原先的2倍(为什么时2倍呢? 主要好像是幂的平方是最大程度是避免hash碰撞)

  • 往hashMap中put元素的时候,会根据key来计算hash值,根据hash值来获取对应的下标,如果要是这个这个下标的位置已经存放其他的元素,那就将这个位置的元素以链表的形式存储,新进来的放在链表头(先进后出),如果该下标没有其他元素,就之间存入到该位置。当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。

----- hash碰撞:不一样的对象但是hash值是一样的,

假设:hash表的大小为4(即有4个槽),现在要把一串数据存到表里:5,48,33,15 假设计算:hash(5)=2, 所以数据5应该放在hash表的第2个槽里;hash(48)=1,所以数据48应该放在hash表的第1个槽里; hash(33)=1,也就是说,数据33也应该放在hash表的第1个槽里——于是就造成了碰撞(也称为冲突,collision)。 主要得解决:开放定址(用链表或者红黑树存一起)、再哈希法(重新计算hash值)、链地址法(完后找空位)

------红黑树

是一种特定类型的二叉树,是数据结构里面的一种结构

原创文章 2 获赞 6 访问量 246

猜你喜欢

转载自blog.csdn.net/Sersph/article/details/105880612