1.4 请说一说ArrayList 如何保证线程安全,除了加关键字的方式 ?
这道题想考察什么?
1、ArrayList的底层原理?
考察的知识点
ArrayList底层的源码的理解
考生如何回答
ArrayList 如何保证线程安全
- 继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用ArrayList的方法。
- 可以使用Collections.synchronizedList()这个函数,使用方法如下
List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());
5.png
- 使用CopyOnWriteArrayList
List<String> k=new CopyOnWriteArrayList<>();
1.5 请说一说ArrayList、HashMap、LinkedHashMap ?
这道题想考察什么?
1、ArrayList、HashMap和LinkedHashMap的底层原理?
考察的知识点
ArrayList、HashMap、LinkedHashMap的源码的理解
考生如何回答
ArrayList
ArrayList:底层结构是一个数组,初始长度为10 容量不足时,扩展为原来的1.5倍也就是扩展为15
ArrayList底层是一个双向链表,好处是不用扩容,坏处是当你要寻找第N个元素时,实践复杂度为O(n),就是遍历N个元素去找到他 而ArrayList的时间复杂度是 O(1)
List:元素有序 有序值的是在内存中存放,可重复
HashMap
底层结构是 一个元素为链表的数组 , 虽然是数组 但是是无序插入数组的。根据哈希值来插入。
当hash相同则需要用到链表结构 , 把新插入的但 hashcode值相同的 链在之前插入的后面形成链表,当连得太多 就会形成红黑树,新加入的元素形成连头,第一存放在位置上的就成链尾
LinkedHashMap
底层是一个元素为链表的数组 + 元素之间的形成的双向链表 , 即是单向链表形成的双向链表。 双向链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素,因此LinkedHashSet可以保证元素按插入顺序输出。
LinkedHashMap底层使用哈希表与双向链表来保存所有元素,它维护着一个运行于所有条目的双向链表(如果学过双向链表的同学会更好的理解它的源代码),此链表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序
-
按插入顺序的链表:在LinkedHashMap调用get方法后,输出的顺序和输入时的相同,这就是按插入顺序的链表,默认是按插入顺序排序。
-
按访问顺序的链表:在LinkedHashMap调用get方法后,会将这次访问的元素移至链表尾部,不断访问可以形成按访问顺序排序的链表。简单的说,按最近最少访问的元素进行排序(类似LRU算法)。
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("apple", "苹果");
map.put("watermelon", "西瓜");
map.put("banana", "香蕉");
map.put("peach", "桃子");
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
// print
apple=苹果
watermelon=西瓜
banana=香蕉
peach=桃子
LinkedList与ArrayList的区别
-
LinkedList底层是双向链表
ArrayList底层是可变数组 -
LinkedList不允许随机访问,即查询效率低
ArrayList允许随机访问,即查询效率高 -
LinkedList插入和删除效率快
ArrayList插入和删除效率低
对于随机访问的两个方法,get和set函数,ArrayList优于LinkedList,因为LinkedList要移动指针;对于新增和删除两个方法,add和remove函数,LinedList比较占优势,因为ArrayList要移动数据。
文末
此面试题会持续更新,请大家持续关注!
更多面经和进阶详解可看我的个人简介!!
网友评论