集合
2021-08-18 11:36:41 星期三
说一下arrayList和linkedList区别
- 底层数据结构不同。arraylist底层是基于数组实现的,linkedlist底层基于链表实现的
- 由于底层数据结构不同,运用场景也不同。arraylist适合随机查找,linkedlist适用删除和添加
- 查找一般用arraylist,get(index)查,速度快,但世事无绝对👉,如果是查询第一个和最后一个元素,用linkedlist查也很快,因为linkedlist在存储过程中一直记录着第一个(frist属性记录)和最后一个(last属性记录)元素,直接getFrist(),getLast()取
- 添加的情况也与上同,arraylist.add()时,如果arraylist不需要扩容(初始容量10),添加速度也很快。而linkedlist添加时不考虑扩容(链表结构),add()速度快且要数据后移(arraylist下标位置有数据时,数据后移影响数据👈🏻)
- 另外arraylist和linkedlist都实现了List借口,但是linkedlist还实现了Deque接口,所以linkedlist还可以当做队列使用
- 实现Deque接口,linkedlist可以做双端队列来用,有addfrist(),addlast()方法
2021-08-18 11:37:35 星期三
说一下hashmap的put方法(说一下hashmap)
hashmap的put方法的大致流程:
-
1️⃣ 根据key通过哈希算法与与运算得出数组下标
-
2️⃣ 如果数组下标位置元素为空,则将key和value封装成entry对象(jdk1.7中是entry对象,jdk8是node对象)
-
3️⃣ 如果数组下标位置元素不为空,则要分情况:
🅰️ jdk1.7 -> 先判断是否需要扩容,需要就扩容,不需要则生成entry对象,并使用头插法添加到当前位置的链表中
链表需要扩容 ? 扩容 :(生成entry对象,头插到当前位置上) 🅱️ jdk1.8 -> 先判断当前位置的node的类型,看是红黑树node,还是链表node
if(node == 红黑树node) 将(key,value)封装成红黑树节点 add -> 红黑树 else //链表node 将(key,value)封装成链表node 尾插法 -> 链表 尾插所以要遍历链表 遍历时判断是否存在当前的key 存在则更新value 不存在则插入这个新node 插入链表后 查看链表的节点个数 如果超过了8 就将链表转成红黑树 🅲 将(key,value)封装node插入到链表或红黑树中后,在判断是否需要进行扩容,如果需要就扩容,不需要就结束put方法
⬆️ 突发奇想🤣
2021-08-18 11:39:02 星期三
SynchronizedMap和ConcurrentHashMap有什么区别?
-
SynchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步。而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁。所以,只要有一个线程访问map,其他线程就无法进入map,而如果一个线程在访问ConcurrentHashMap某个桶时,其他线程,仍然可以对map执行某些操作。
-
所以,ConcurrentHashMap在性能以及安全性方面,明显比Collections.synchronizedMap()更加有优势。同时,同步操作精确控制到桶,这样,即使在遍历map时,如果其他线程试图对map进行数据修
改,也不会抛出ConcurrentModifificationException。
2021-08-18 11:41:45 星期三
jdk7,jdk8中hashmap的不同点
- 7中在链表中加元素采用的是头插法,8中用的是尾插法
- 7中的put首先通过hash(key)方法算出hash值
int hash = hash(key);
int i = indexfor(hash,table.length);

浙公网安备 33010602011771号