java集合整理

it2022-05-05  161

1.Arraylist 底层数据结构:数组 扩容机制:默认0,添加一个元素后为10,往后1.5倍扩容 适用于 频繁的访问 线程不安全的 2.vector 底层数据结构:数组 扩容机制:默认初始容量10,2倍扩容,可于构造函数传递初始容量和扩容倍数。 线程安全的 3.linkedlist 底层数据结构:双向链表 扩容机制:无需扩容 适用于频繁的插入,删除。 Add() 尾插 offer() 尾插 push()头插 4.ArrayDeque 底层数据结构:数组 扩容:默认是16,二倍扩容,传递值 >2^n 容量 底层是环形数组 通过(tail + 1) & (elements.length - 1) 确定存放的位置 不支持传入null 5. PriorityQueue 底层数据结构:数组 扩容:<64 2倍+2扩容 >64 是1.5倍扩容 通过小根堆,没有经过排序,每次出去的都是最小值,添加进去的元素必须可以比较,即实现comparable 接口 或 自定义comparator Add() 底层调用的是offer()方法 如果添加元素为null 会排除异常 6.hashmap 底层数据结构:1.7 以前 数组+链表 1.7以后 数组+红黑树 默认初始容量是16 加载因子:需要根据实际情况定义默认0.75 扩容为 2^k 访问顺序不是添加顺序 扩容后需要重新计算hashcode的值如果 如果第k位为零的话,位置不变 如果第k位为1的话,位置改变 2^k-1 length 加载因子: 越大冲突几率越大 ,空间利用率越高。 阈值:容量*加载因子 默认=12 添加的元素可以为null ,但是不能存入相同的key,后面value值会替换前面的value Key—Hashcode --> 扰动处理(降低hascode重复概率 即哈希冲突)—》&table.length-1(让值小于数组最大值) 解决hasn冲突的办法: 链地址法: 数组加链,hashmap采用的方法 0.开放地址法:(记录存放地址的到底存放在何处) 1.线性探测 发生冲突后 indec+1 的形式 去存放 index = index +1%table.length 2.二次探测 index = index + 1^2 % table.ength index = index - 1^2 % table.ength index = index + 2^2 % table.ength index = index - 2^2 % table.ength 3.随机探测 index = index +random %table.length 4.再哈希法: 先构建一组hash 算法 ,hash1 hash2 hash3 5.公共溢出法:建立一个公共区域,储存发生hash冲突的数据 扰动处理 和 扩容都是为了减小链表的长度 减小hash冲突的目的:降低查找复杂度,使其时间复杂度为O(1);链表时间复杂度为 o(n) 线程不安全的 7. Hashset 里的数据不能重复 可以用来去重 所有方法都是借助于hashmap 实现的 里面的value 是一个 object对象 存放的是一个单值 使用时候只存放一个值 Contains() 判断值是否存在。 8. Linkedhashmap 也是通过hashmap 来实现的 比较 hashmap 不同:多了个befer after 将entry 连接起来 head 遍历是通过 after来遍历 构造方法 :传值boolean 维护访问顺序 ,访问后将entry删除,然后 添加 成为最后一个结点 9.hashtable 不允许key和value 为空 除过迭代器,还可以通过枚举的方法去迭代。 keys()迭代key element()迭代 value 区别(和hashmap): 没有对hashcode进行扰动处理 多线程情况下不知道是添加为null还是被其他线程删除 容量为 11 加载因子为 0.75 扩容为 *2+1 容量为奇数


最新回复(0)