3.6.1ArrayList和LinkedList有什么差别?在哪种场景里应当用ArrayList(或LinkedList)?

大家如果学过数据结构,这个问题不难回答:前者是基于数组,数组比较擅长索引查找,但不擅长被频繁地插入或删除;后者是基于链表,它擅长被频繁地插入或删除,如果对其频繁地进行索引查找,就会影响性能。

3.6.2 ArrayList和Vector有什么差别?

我们知道,ArrayList是线程不安全的,而且会以大概50%的规模进行动态扩容;而Vector是线程安全的,它会以100%的规模进行动态扩容。所以在单线程环境下,出于性能和内存使用量这两方面的考虑,建议使用ArrayList。

3.6.3 HashSet和TreeSet有什么差别?

我们在3.2.4部分具体分析过它们的差别,这里就不再重叙。

3.6.4 我们知道,Set里不允许插入重复的元素。对于HashSet和TreeSet,如果我们要插入自定义的类,我们该往自定义的类里加入什么方法来保证“不重复”?

对于HashSet,它是基于Hash表的,我们需要重写其中的hashCode和equals方法;对于TreeSet,我们需要重写compareTo方法(当然还得实现Compareable接口)。具体的细节请大家阅读3.2.3部分。

在大多数场景下,我们是会放入自定义类型,而不是简单数据类型。如果候选人不知道怎么回答,那么我就可以认定他只是“简单地用到了集合”,而不是“对集合有深入的了解”。

3.6.5 在使用迭代器遍历集合对象时,我们能不能边访问边修改?如果这样做,会有什么问题?

我们在3.2.6部分里讲过这个知识点。如果被问到这个问题,大家可以这样说:第一,会报异常,因为使用迭代器时不能边访问边修改;第二,这种异常其实是种保护机制,因为边遍历边修改会增加出错的机会;第三,如果确实需要这样做,可以使用CopyOnWriteArrayList之类的集合,或者干脆别通过迭代器来访问集合对象。

3.6.6 在使用HashMap时,你有没有重写hashCode和equals方法,如果不重写,会有什么问题?如果候选人对此一脸雾水,那么我会给点提示:如果我们要在HashMap的Key部分放入自定义的类,而不是基本数据结构,那么我们该在这个自定义的类里重写什么方法?

如果大家被问到这个问题,可以好好利用这个机会来展示你对此的深入了解。

要点1,HashMap是基于hash表这个数据结构来实现的,所以其中的get或containsKey的效率相当高(接近于1)。

要点2,描述一下Hash表的数据结构,重点说说如何通过hash算法把待存入的数据和存储位置绑定到一起了,同时还可以说出HashMap表里是通过链地址法来解决冲突。

要点3,hashCode方法其实是对应hash表里的hash算法,由此我们可以计算出待存储元素的存放位置。如果我们不重写,将会用到Object里的hashCode方法,它是返回该对象的内存地址;而如果我们不重写equals方法,那么在冲突的情况下,就无法定位到具体的对象了。总之,如果不重写hashCode和equals方法,在调用containsKey和get方法时,就无法得到“看上去一致”的对象了。

如果面试官(也包括笔者)看到应试者能清晰地说出上述的意思,就认为此人对技术细节非常了解,就有可能减少集合部分(或者乃至Java Core部分)的面试题。如果大家也是这样并在回答其它问题时不犯原则性的错误,那么也可能得到“对技术了解比较透彻”之类的好评。

3.6.7 Collections和Collection有什么差别?

Collections 是一个集合的一个类,其中包含有一些和集合操作相关的静态多态方法。Jave集合里则有另外一个和它非常相似的接口Collection(不带s),它是线性表类集合的父接口,List和Set等接口都是通过实现这个接口来实现的。

3.6.8 如果我们要给自定义的类排序,可以怎么做?

大家可以阅读3.4.1部分,我们可以通过重写Collections.sort的方法来实现。

在3.4部分,我们详细讲了如何通过Collection的方法实现排序和线程安全。请大家找机会,向面试官说出你用过这些方法;因为一旦证明你用过,面试官就会感觉你对集合部分用得比较深入。

3.6.9你有没有用过T,?, super和extends这种泛型?

说实在的,上述泛型在实际的项目里用得还真不多,你如果说没用过,面试官也不会难为你。不过大家可以结合3.5.1部分的知识点,向面试官说明你是怎么把泛型作用到类和方法上,也可以结合3.5.2里描述的copy方法向面试官说明? extends和? super的用法,如此面试官就会认为你对集合部分的知识掌握得很透彻。

Java核心技术及面试指南 集合部分总的面试题归纳以及答案的更多相关文章

  1. Java核心技术及面试指南 IO部分的面试题归纳以及答案

    4.6.1 java中有几种类型的流? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStr ...

  2. Java核心技术及面试指南 异常部分的面试题归纳以及答案

    4.2.4.1 throw和throws有什么差别?异常(Exception)和错误(Error)有什么差别? throw语句表示抛出异常,由方法体内的语句处理.throws语句用在方法声明后面,表示 ...

  3. Java核心技术及面试指南 JDBC部分的面试题总结以及答案

    5.5.1 你最近的项目里用到的是哪个数据?或你用过哪些数据库?或你对哪个数据库最熟悉? 通过这个问题,我们将会确认候选人是否在项目里用过数据库或JDBC. 5.5.2 你有没有建过表?或修改表里的字 ...

  4. Java核心技术及面试指南 数据库方面的面试题归纳以及总结

    5.1.7.1 事务的四大特性是什么? ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库 ...

  5. Java核心技术及面试指南 设计模式部分的面试题总结以及答案

    8.6.4.1请实现一个线程安全的单例模式. 1      public class MailListReader { 2          private static MailListReader ...

  6. Java核心技术及面试指南 面向对象部分的面试题总结以及答案

    问题2.7.1,开放性问题,说一下你对面向对象思想的了解. 要点1,先说基础概念,比如面向对象思想包括封装.继承.多态,然后说些语法,比如可以通过extends继承类.通过implement来实现接口 ...

  7. Java核心技术及面试指南 多线程部分的基本面试题总结以及答案

    7.1.5 (1) 如果某个类已经继承(extends)了一个类,那么让这个类具有多线程的特性? implements runnable类或通过线程池 7.1.5  (2)启动一个线程是用run()还 ...

  8. Java核心技术及面试指南:视频列表

    如下是本书相关内容的视频列表,会动态更新 第一章 1 视频1.1  JDK和JRE和JVM的区别,安装Java开发环境    1.1.1  第2页 2 视频1.2  编写第一个HelloWorld程序 ...

  9. Java核心技术及面试指南的视频讲解和代码下载位置

    都是百度云盘,均无密码 代码下载位置: https://pan.baidu.com/s/1I44ob0vygMxvmj2BoNioAQ 视频讲解位置: https://pan.baidu.com/s/ ...

随机推荐

  1. java -关于包装类自动装箱与拆箱拓展+整形常量池

    关于自动装箱与拆箱 1.包装类与基本数据类型的自动转换,叫装箱和拆箱(类型自动转换) 2.自动装箱拆箱是在编译器,编译器自动配转换方法,实现装箱和拆箱.所以这个过程发生在编译期 3.只有需要相互类型转 ...

  2. PAT A1010.Radix 二分法

    PAT A1010.Radix 链接: https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536 算法 ...

  3. LOL新版符文 怎么查看队友的符文配置?

    LOL怎么看其他玩家符文? 像我这种名字都懒的打的, 直接去WeGame复制昵称. 然后在LOL主界面点生涯, 之后搜索 光头强xian生

  4. arm 执行 交叉编译完成的可执行文件时 出现premission denied 问题

    我用的tftp传过去的文件 然后传完 执行的时候 出现了premission denied (权限不够)得问题 解决方法 就是添加权限  chmod 777 filename

  5. PHP与Excel 笔记

    一:   PHP将数据导出Excel表中(投机型) 二: PHPExcel: Github上可以下载此插件包,用法如下: 前端: //上传阅卷员Excel文件 $("#upload_memb ...

  6. php学习备注笔记

    一: PHP内核相关 http://blog.csdn.net/ywh147/article/details/40188411 [深入PHP内核(二)——SAPI探究] http://www.nowa ...

  7. 收集几个html和element-ui的录入控件

    我希望有一个控件去显示或输入账本的金额 先做一些资料收集,也希望大家给个建议 输入银行账号会设置每四位添加一个空格 https://blog.csdn.net/wkx18330698534/artic ...

  8. Android手机app的adb命令测试电量

    Android手机app电量测试 Android 5.0及以上的设备, 允许我们通过adb命令dump出电量使用统计信息 第一步:手机安装要测试的应用,打开手机开发者模式-USB模式,运行cmd.ex ...

  9. 《笔记篇》非JS方法跳转到一个新页面,主要防止客户端禁止浏览器JS以后的跳转异常

    用非JS方法打开一个新页面,主要防止客户端禁止浏览器JS以后的跳转失效 <meta http-equiv="refresh" content="0; url=htt ...

  10. linux 性能优化

    linux的性能优化: 1.CPU,MEM 2.DISK--RAID 3.网络相关的外设,网卡 linux系统性能分析: top:linux系统的负载,CPU,MEM,SWAP,占用CPU和内存比较的 ...