面经集合


Java集合

[TOC]

HashMap原理

[HashMap原理解析](https://blog.csdn.net/fedorafrog/article/details/115478407 "HashMap原理解析")

线程安全的HashMap

(1)使用ConcurrentHashMap (2)使用HashTable (3)Collections.synchronizedHashMap()方法

ConcurrentHashMap原如何保证的线程安全

JDK1.7:使用分段锁,将一个Map分为了16个段,每个段都是一个小的hashmap,每次操作只对其中一个段加锁

JDK1.8:采用CAS+Synchronized保证线程安全,每次插入数据时判断在当前数组下标是否是第一次插入,是就通过CAS方式插入,然后判断f.hash是否=-1,是的话就说明其他线程正在进行扩容,当前线程也会参与扩容;删除方法用了synchronized修饰,保证并发下移除元素安全

HashTable与HashMap的区别

(1)HashTable的每个方法都用synchronized修饰,因此是线程安全的,但同时读写效率很低 (2)HashTable的Key不允许为null (3)HashTable只对key进行一次hash,HashMap进行了两次Hash (4)HashTable底层使用的数组加链表

ArrayList和LinkedList的区别

ArratList的底层使用动态数组,默认容量为10,当元素数量到达容量时,生成一个新的数组,大小为前一次的1.5倍,然后将原来的数组copy过来;因为数组在内存中是连续的地址,所以ArrayList查找数据更快,由于扩容机制添加数据效率更低

LinkedList的底层使用链表,在内存中是离散的,没有扩容机制;LinkedList在查找数据时需要从头遍历,所以查找慢,但是添加数据效率更高

如何保证ArrayList的线程安全?

(1)使用collentions.synchronizedList()方法为ArrayList加锁 (2)使用Vector,Vector底层与Arraylist相同,但是每个方法都由synchronized修饰,速度很慢 (3)使用juc下的CopyOnWriterArrayList,该类实现了读操作不加锁,写操作时为list创建一个副本,期间其它线程读取的都是原本list,写操作都在副本中进行,写入完成后,再将指针指向副本。

5.1.1.  list set queue map的区别

5.1.2.  如何选用集合

5.1.3.  为什么使用集合

5.1.4.  arraylist和vector的区别

5.1.5.  arraylist和linkedlist的区别

5.1.6.  comparable和comparator的区别

5.1.7.  无序性和不可重复性的含义

5.1.8.  hashset linkedhashset treeset的区别

5.1.9.  queue和deque的区别

5.1.10.  priorityqueue的认识

5.1.11.  hashmap和hashtable的区别

5.1.12.  hashset如何检查重复

5.1.13.  hashmap的长度为什么是2的幂次方

5.1.14.  concurrenthashmap和hashtable的区别

5.1.15.  concurrenthashmap线程安全的具体实现方式

5.1.16.  treemap和treeset在排序时如何比较元

5.1.17.  collections工具类中的sort方法如何比较元素

5.1.18.  collection和collections的区别

5.1.19.  array和arraylist的区别

5.1.20.  hashmap和concurrenthashmap的区别

5.1.21.  使用object作为hashmap的key,怎么办

5.1.22.  为什么hashmap中的string integer这样的包装类适合作为key

5.1.23.  什么是哈希冲突

5.1.24.  fall-fast 和fall-safe

5.1.25.  arraylist获取的list应该注意什么

5.1.26.  w

页面列表

ITEM_HTML