Java集合面试代码真题及详细答案(实战版)_第1页
Java集合面试代码真题及详细答案(实战版)_第2页
Java集合面试代码真题及详细答案(实战版)_第3页
Java集合面试代码真题及详细答案(实战版)_第4页
Java集合面试代码真题及详细答案(实战版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java集合面试代码真题及详细答案(实战版)本次面试题聚焦Java集合核心高频考点,包含基础辨析、代码改错、实操编程、底层原理应用题,全部贴合企业真实面试场景,答案简洁落地、侧重实战开发,无理论空话。一、基础辨析代码题(高频易错)题目1:ArrayList和LinkedList遍历效率对比代码验证,说明原因需求:编写代码分别通过普通for循环、增强for循环、迭代器遍历ArrayList、LinkedList,对比查询效率,输出结果并解释原理。参考答案代码:java

importjava.util.ArrayList;

importjava.util.LinkedList;

importjava.util.Iterator;

publicclassListTraverseTest{

publicstaticvoidmain(String[]args){

//初始化数据,10万条元素

ArrayList<Integer>arrayList=newArrayList<>();

LinkedList<Integer>linkedList=newLinkedList<>();

for(inti=0;i<100000;i++){

arrayList.add(i);

linkedList.add(i);

}

//1.普通for循环遍历

longstart=System.currentTimeMillis();

for(inti=0;i<arrayList.size();i++){

arrayList.get(i);

}

System.out.println("ArrayList普通for遍历耗时:"+(System.currentTimeMillis()-start)+"ms");

start=System.currentTimeMillis();

for(inti=0;i<linkedList.size();i++){

linkedList.get(i);

}

System.out.println("LinkedList普通for遍历耗时:"+(System.currentTimeMillis()-start)+"ms");

//2.迭代器遍历

start=System.currentTimeMillis();

Iterator<Integer>arrIt=arrayList.iterator();

while(arrIt.hasNext()){

arrIt.next();

}

System.out.println("ArrayList迭代器遍历耗时:"+(System.currentTimeMillis()-start)+"ms");

start=System.currentTimeMillis();

Iterator<Integer>linkIt=linkedList.iterator();

while(linkIt.hasNext()){

linkIt.next();

}

System.out.println("LinkedList迭代器遍历耗时:"+(System.currentTimeMillis()-start)+"ms");

}

}答案解析:1、执行结果:普通for循环遍历下,ArrayList速度极快,LinkedList耗时极久;迭代器/增强for循环(底层也是迭代器)遍历,两者效率差距很小。2、核心原理:-ArrayList基于动态数组实现,支持随机访问,get(index)方法是O(1)时间复杂度,直接通过数组下标定位元素。-LinkedList基于双向链表实现,不支持随机访问,普通for循环调用get(index)时,每次都需要从头节点/尾节点遍历查找,时间复杂度O(n),海量数据下效率极低。-迭代器遍历是顺序遍历,链表只需顺着节点指针向后查找,无需重复遍历,因此效率和ArrayList基本持平。题目2:代码改错:List遍历时删除元素报错问题错误代码:以下代码运行会抛出异常,请找出问题并修改java

importjava.util.ArrayList;

importjava.util.List;

publicclassListRemoveErrorTest{

publicstaticvoidmain(String[]args){

List<String>list=newArrayList<>();

list.add("Java");

list.add("Python");

list.add("Java");

list.add("C++");

//需求:删除所有"Java"元素

for(Strings:list){

if("Java".equals(s)){

list.remove(s);

}

}

System.out.println(list);

}

}报错信息:ConcurrentModificationException(并发修改异常)错误原因:增强for循环底层依赖迭代器,迭代器遍历过程中,集合自身的size、modCount字段会被校验。直接调用集合的remove()方法会修改modCount,而迭代器的expectedModCount不变,两者校验失败,触发并发修改异常。正确写法(三种实战方案):方案1:使用迭代器自带的remove方法(传统项目常用)java

importjava.util.ArrayList;

importjava.util.Iterator;

importjava.util.List;

publicclassListRemoveCorrectTest{

publicstaticvoidmain(String[]args){

List<String>list=newArrayList<>();

list.add("Java");

list.add("Python");

list.add("Java");

list.add("C++");

Iterator<String>it=list.iterator();

while(it.hasNext()){

Strings=it.next();

if("Java".equals(s)){

//迭代器remove会同步更新expectedModCount,不会报错

it.remove();

}

}

System.out.println(list);

}

}方案2:Java8+removeIf(开发首选,简洁高效)java

list.removeIf(s->"Java".equals(s));方案3:普通for循环倒序遍历(规避下标移位问题)java

for(inti=list.size()-1;i>=0;i--){

if("Java".equals(list.get(i))){

list.remove(i);

}

}二、Map核心代码面试题(必考)题目1:HashMap遍历的四种方式,对比优劣需求:写出HashMap四种常用遍历方式,并说明日常开发最优选择完整代码:java

importjava.util.HashMap;

importjava.util.Map;

importjava.util.Set;

publicclassHashMapTraverseTest{

publicstaticvoidmain(String[]args){

Map<String,Integer>map=newHashMap<>();

map.put("张三",23);

map.put("李四",25);

map.put("王五",22);

//方式1:keySet遍历(只获取key,再get值)

Set<String>keySet=map.keySet();

for(Stringkey:keySet){

System.out.println("key:"+key+",value:"+map.get(key));

}

//方式2:entrySet遍历(键值对同时获取)

for(Map.Entry<String,Integer>entry:map.entrySet()){

System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());

}

//方式3:迭代器遍历entrySet

variterator=map.entrySet().iterator();

while(iterator.hasNext()){

Map.Entry<String,Integer>entry=iterator.next();

System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());

}

//方式4:Java8forEach遍历

map.forEach((k,v)->System.out.println("key:"+k+",value:"+v));

}

}优劣解析:1、keySet+get:效率最低,遍历key后还要二次查询value,大数据量不推荐;2、entrySet普通遍历:效率高,一次性获取键值对,日常开发最常用;3、迭代器遍历:支持遍历过程中删除元素,不会报并发修改异常,适合需要删改场景;4、forEach遍历:代码最简洁,适合只做查询、打印、数据处理的只读场景。题目2:HashMap空键空值测试题(面试坑点)需求:判断以下代码输出结果,并说明原因java

importjava.util.HashMap;

importjava.util.Map;

publicclassHashMapNullTest{

publicstaticvoidmain(String[]args){

Map<String,Integer>map=newHashMap<>();

System.out.println(map.get(null));

map.put(null,100);

map.put(null,200);

map.put("age",null);

System.out.println(map);

System.out.println(map.containsKey(null));

System.out.println(map.containsValue(null));

}

}输出结果:null

{null=200,age=null}

true

true核心考点解析:1、HashMap允许1个null键,多个null值;2、多次putnull键会覆盖,和普通key的覆盖逻辑一致,后值覆盖前值;3、get不存在的key会返回null,无法区分是key不存在,还是key对应value为null;4、TreeMap不允许null键,Hashtable不允许null键和null值。三、集合实操编程题(面试手写代码)题目1:利用集合对数组去重(两种方法)需求:给定int数组,编写代码实现数组去重,保留原有顺序参考答案:java

importjava.util.ArrayList;

importjava.util.LinkedHashSet;

importjava.util.List;

importjava.util.Set;

publicclassArrayDistinctTest{

publicstaticvoidmain(String[]args){

int[]arr={1,2,2,3,3,3,4,5,5};

//方法1:LinkedHashSet去重(保留顺序,代码简洁)

Set<Integer>set=newLinkedHashSet<>();

for(intnum:arr){

set.add(num);

}

System.out.println("LinkedHashSet去重结果:"+set);

//方法2:List判断contains去重(基础写法,面试基础必写)

List<Integer>list=newArrayList<>();

for(intnum:arr){

if(!list.contains(num)){

list.add(num);

}

}

System.out.println("List去重结果:"+list);

}

}解析:HashSet无法保留元素原有顺序,LinkedHashSet基于插入顺序排序,是去重保序的最优选择。题目2:统计字符串中每个字符出现次数(HashMap经典实操)需求:输入任意字符串,统计每个字符出现的次数,输出结果参考答案代码:java

importjava.util.HashMap;

importjava.util.Map;

publicclassCharCountTest{

publicstaticvoidmain(String[]args){

Stringstr="javacollectioninterview";

Map<Character,Integer>countMap=newHashMap<>();

//遍历字符串每个字符

for(inti=0;i<str.length();i++){

charch=str.charAt(i);

//如果key存在,次数+1;不存在,初始化为1

countMap.put(ch,countMap.getOrDefault(ch,0)+1);

}

//遍历输出结果

countMap.forEach((k,v)->System.out.println("字符"+k+":出现"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论