【Android面试】2023最新面试专题二:ArrayList篇

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>>());

在这里插入图片描述

  • 使用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要移动数据。

最后

此面试题会持续更新,请大家持续关注!!!

扫描下方二维码即可领取面试题

ps:群内设有ChatGPT机器人,可以解答各位在技术上遇到的难题哦!

猜你喜欢

转载自blog.csdn.net/datian1234/article/details/130811283