Java基础--集合相关原理(collection)(list,,set,,map)-常用类与特点,及扩容机制

集合:

ArrayList

特点

有序插入,不安全,可以为空,可以重复

扩容机制,

创建实例的时候会赋予elementData一个空的数组,进行第一次add的时候会将长度赋值为10,如果超出数组长度就进行扩容,扩容方法为使用右移位扩容至源数组的1.5倍,

add()添加元素

底层是动态数组进行add的时候会首先调用一个方法,方法内部存在大量的方法调用,进行判断要插入的下标是不是大于等于当前数组的长度,如果大于或者等于那么就调用grow方法进行数组的扩容,就是将新数组的长度增加为当前数组长度加上当前数组长度的1.5倍(使用的是位移运算 >> 1 相当于除2 << 1 相当于乘2) ,

remove()删除元素

会判断当前元素是否为最后一个元素 如果是将最后一个元素赋值为null;如果不是就使用Arrays.copy命令将这个元素后的所有元素都向前移位

LinkendList:

特点

有序插入,允许重复,可以为null,不安全

底层原理

双向链表使用node是进行存储,包含上一个节点位置,下一个节点的位置和item(自己的值)

扩容机制

初始化为0,随着元素的增加增加

vector

父类

AbstractList

实现list

特点

值可以重复,可以为空,线程安全,使用synchronized锁实现(同步方法)

底层原理:

动态数组,

扩容机制:

初始化容量为10,

最容量Integer.max-8

如果有设置容量就扩容旧数组+容量,没有的话就扩大两倍

HashSet(为什么不使用hashmap???)

父类

AbstractSet

实现 Set

特点

无序存入,可以为null ,不安全,可重复

底层原理

new 了一个hashMap…

扩容机制

全部调用hashmap的方法

TreenSet

父类

AbstractSet

实现 NavigableMap

特点:

不许为null(将值作为key进行存储),不能重复,插入无序天然排序,不安全

底层原理

new 了一个TreenMap…给NavigableMap进行赋值全称调用NavigableMap的方法

hashMap

父类:

AbstractMap

特点

无序,key允许一个null,value允许多个null,不安全,可重复

将元素以Node的方式进行存储,其中包含key的hash,key,val,和下一个Node节点的位置

底层原理

动态数组+链表+红黑树的方式

扩容机制:

刚创建时为0,进行第一次put长度变为16;当存储的元素达到数组长度的0.75倍时扩容至源数组的2倍,如果链表的长度达到8时就会通过算法将链表转为红黑树,红黑树节点为6时就通过算法将其转为链表的形式

达到负载因子后就会重写hash,重新计算hash值的位置,比较浪费性能.

put()存值

当进行put时会先判断是否为第一次进行存值,如果是将数组的长度就扩容为16,首先在进行判断key值是否为null,为null就存放在tab0的位置,不为null,存储时使用数组长度-1跟可以的hash值进行与运算操作的到一个一定小于数组下标的索引值进行存储,如果该位置有元素存在着进行key值的equals判断,相等就替换不相等就以链式方式进行存储,如果链表的长度为8就转为红黑树,如果不为8就进行追加,

remove()删除值

在进行删除时,首先判断是否为null,为空就删除table[0],不为空就进行key值的与运算,找到对应的索引,然后进行查看是否有链表存在,不存在直接删除,存在就循环判断key值是否相等,找到相等的进行删除.

HashTable

特点

不能为空,无序存放,线程安全synchronized锁实现(同步方法) value可以重复

底层原理

跟hashMap相同,以Entry的方式进行存储包含key的hash key value 以及下一个节点

扩容机制:

初始容量为11,负载因子为0.75,使用左位移运算,进行二倍+1的扩容

达到负载因子后就会重写hash,重新计算hash值的位置,比较浪费性能.

put()添加

1.7的hash 先判断是否为null为null就抛出null

TreeMap

父类

AbstractMap

特点

key不能为null,天然排序,key不可重复,不安全的

底层原理

平衡二叉查找树

扩容机制

随元素的增加而增加

ConcurrentHashMap

父类:

AbstractMap

实现:ConcurrentMap

特点

key和value都不能为空,线程安全的(同步代码块的方式+cas算法) 无序的

底层原理

分段数组

扩容机制

到达分段数组的长度就进行新建数组

LinkedHashMap

父类

HashMap

接口:Map

构建时调用父类构造器,创建HashMap,存储时调用父类的put…

特点

允许key和value为空,线程不安全,存储有序取值有序,value可以重复

底层原理:

动态数组+链表+红黑树,增加一个双向链表保证遍历顺序和插入顺序一致,

如有错误请见谅,联系作者进行更改,互相学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值