美文网首页
【Android面试】2023最新面试专题二:ArrayList

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

作者: 小城哇哇 | 来源:发表于2023-05-23 11:33 被阅读0次

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

    文末

    此面试题会持续更新,请大家持续关注!
    更多面经和进阶详解可看我的个人简介!!

    相关文章

      网友评论

          本文标题:【Android面试】2023最新面试专题二:ArrayList

          本文链接:https://www.haomeiwen.com/subject/hljxedtx.html