首页 > 其他分享 >【Android面试】2023最新面试专题二:ArrayList篇

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

时间:2023-09-26 22:01:18浏览次数:34  
标签:顺序 插入 ArrayList 元素 链表 面试 2023 LinkedHashMap

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

【Android面试】2023最新面试专题二:ArrayList篇_双向链表

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

最后

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

有需要的小伙伴,可以点击下方课程链接详细了解!!!

https://edu.51cto.com/course/32703.html

标签:顺序,插入,ArrayList,元素,链表,面试,2023,LinkedHashMap
From: https://blog.51cto.com/u_16163453/7615183

相关文章

  • 2023年最新京东app端sign签名算法与cipher加解密逆向分析(2023-09-26)
    前言:  本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!技术交流合作请私信!一.工具的选择(抓包工具的选择,是门学问)用到工具如下:1、安卓手机一台,系统版本:android6.01;型号:小米MI4LTE  之所以要选择android6手机,原理如下:  ......
  • kubernetes集群搭建2023
    参考:https://zhuanlan.zhihu.com/p/627310856(比较详细的一篇k8s集群部署文章)https://www.cnblogs.com/libruce/p/17477374.html或者https://zhuanlan.zhihu.com/p/590652259(不关闭防火墙的情况,如何配置端口)https://www.cnblogs.com/suuuch/p/16728103.html(初始化集群或者新节......
  • SMU Autumn 2023 Round 5
    SMUAutumn2023Round5A.EveryoneLovestoSleep把时间都转成分钟,然后存起来,二分找到离他睡觉点最近的一个时间段,减去他的睡觉点,如果最近的在第二天,则把中间的这段时间加起来#include<bits/stdc++.h>#defineintlonglong#definedebug(a)cout<<#a<<"="<<a<<'\n'......
  • 2023-2024-1 20211319蓝宇 《信息安全专业导论》第一周学习总结
    作业信息|这个作业属于哪个课程|2020-2021-1信息安全专业导论(https://edu.cnblogs.com/campus/besti/2020-2021-1fois))||这个作业要求在哪里|[2020-2021-1信息安全专业导论第一周作业](https://edu.cnblogs.com/campus/besti/2020-2021-1fois/homework/11249))||这个作业的......
  • 2023.09.26 联考总结&题解
    T1derby你考虑直接贪心进行匹配即可,就是说对于每一个\(1\)去匹配最大的\(0\)#include<bits/stdc++.h>usingnamespacestd;intn,m;vector<int>A[2],B[2];intmain(){ freopen("derby.in","r",stdin); freopen("derby.out","w",s......
  • 2023.09.25
      今天进行了回文串的练习,上午进行了金属创意制作,充分发挥了自己的动手能力。下午进行了建民老师的课,对类和对象进行了加深学习。课上代码还未完成。。。。。。。#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAXSIZE100intpush(char*zhan,inttop......
  • 2023.9.26
    今天学习了数据结构,首先学习了栈的基本知识,栈的初始化为先给栈分配一个预定大小的数组空间,接着学习了如栈的操作,将元素押入栈顶,用栈顶指针加一,出栈操做同上类似。接着学习了链式表的栈操作,类似于单链表的结构,利用前插法押入元素,在顺序出栈同单链表相似。紧接着学习了递归思想,首先......
  • Vue前端面试题
    1.Vue路由传递params参数使用对象写法的时候能不能和path一起使用?不能路由传参对象的写法:指定路由需要使用name指定。使用path会导致路由失效无法跳转。this.$router.push({name:"search",params:{keyword:this.keyword},query:{k:this.keyword.toUpperCase()}})2.如何指定params参......
  • 2023021885
    2023021885杨少雄swordnewnew的主页-博客园(cnblogs.com)开朗数据库,HTML滑板,摩托车前端工程师希望大家玩的开心,在这次的合作中相互学习,相互进步......
  • 2023中秋/国庆双节假期服务公告
    尊敬的智安网络用户:   您好!2023年中秋国庆双节假期将近,提前祝您节日快乐!感谢您一直以来对智安网络的支持与信任。根据2023年中秋国庆放假安排,我们将持续为您服务。关于假期期间智安网络客服支持、服务受理、备案审核、财务相关的须知如下:客服支持:   我们的客服团队将继......