1. Java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

  • Collection
  • List
    • ArrayList
    • LinkedList
    • Vector
    • Stack
  • Set
    • HashSet
    • LinkedHashSet
    • TreeSet
  • Map
  • HashMap
    • LinkedHashMap
  • TreeMap
  • ConcurrentHashMap
  • Hashtable

2. Collection 和 Collections 有什么区别?

  • Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
  • Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。

3. List、Set、Map 之间的区别是什么?

List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。

三者之间的区别,如下表:

4. HashMap 和 Hashtable 有什么区别?

  • 存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
  • 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
  • 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。

5. 如何决定使用 HashMap 还是 TreeMap?

对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

6. 说一下 HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

7. 说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

8. ArrayList 和 LinkedList 的区别是什么?

  • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
  • 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

9. 如何实现数组和 List 之间的转换?

  • 数组转 List:使用 Arrays. asList(array) 进行转换。
  • List 转数组:使用 List 自带的 toArray() 方法。

代码示例:

  1. // list to array

  2. List<String> list = new ArrayList<String>();

  3. list. add("王磊");

  4. list. add("的博客");

  5. list. toArray();

  6. // array to list

  7. String[] array = new String[]{"王磊","的博客"};

  8. Arrays. asList(array);

10. ArrayList 和 Vector 的区别是什么?

  • 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
  • 性能:ArrayList 在性能方面要优于 Vector。
  • 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。

11. Array 和 ArrayList 有何区别?

  • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
  • Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
  • Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

12. 在 Queue 中 poll()和 remove()有什么区别?

  • 相同点:都是返回第一个元素,并在队列中删除返回的对象。
  • 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出 NoSuchElementException 异常。

代码示例:

  1. Queue<String> queue = new LinkedList<String>();

  2. queue. offer("string"); // add

  3. System. out. println(queue. poll());

  4. System. out. println(queue. remove());

  5. System. out. println(queue. size());

13. 哪些集合类是线程安全的?

Vector、Hashtable、Stack 都是线程安全的,而像 HashMap 则是非线程安全的,不过在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。

14. 迭代器 Iterator 是什么?

Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。

15. Iterator 怎么使用?有什么特点?

Iterator 使用代码如下:

  1. List<String> list = new ArrayList<>();

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

  3. while(it. hasNext()){

  4. String obj = it. next();

  5. System. out. println(obj);

  6. }

Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

17. Iterator 和 ListIterator 有什么区别?

  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

18. 怎么确保一个集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

示例代码如下:

  1. List<String> list = new ArrayList<>();

  2. list. add("x");

  3. Collection<String> clist = Collections. unmodifiableCollection(list);

  4. clist. add("y"); // 运行时此行报错

  5. System. out. println(list. size());

Java容器-面试题相关推荐

  1. 10道不得不会的 Java容器 面试题

    博主介绍:

  2. 100道Java中高级面试题汇总+详细拆解

    出自:Java面试题精选 1-10期 [10期]Redis 面试常见问答 [09期]说说hashCode() 和 equals() 之间的关系? [08期]说说Object类下面有几种方法呢? [07 ...

  3. Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本

    Java容器–2021面试题系列教程(附答案解析)–大白话解读–JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 Java ...

  4. Java集合容器面试题重点汇总

    集合容器概述 什么是集合 **集合框架:**用于存储数据的容器. 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构. 任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算 法 ...

  5. Java面试笔试题大汇总三(最全+详细答案)

    Java面试笔试题大汇总一(最全+详细答案):https://www.jianshu.com/p/73b6b3d35676 Java面试笔试题大汇总二(最全+详细答案)https://www.jian ...

  6. 前方高能!金三银四Java高级工程师面试题整理

    前言 面试时间将近两个小时(期间等待二面面试官来面我的时候等了半个多小时)面试官问的东西很多,还挖了好几个坑,一个技术点套着一个技术点的问,一定要做好万全的准备.问了一些基本层面上的技术点都答出来了, ...

  7. Java经典面试题整理及答案详解(四)

    简介: Java经典面试题第四弹来啦!本节小编整理了关于Java开发框架常见的面试题,希望大家多多怜惜,一起进步- 1.SpringMVC返回值,使用SpringMVC的时候我看到两种风格的开发,一种 ...

  8. 最常见的208道Java最新面试题及答案(一)

    今天动力节点java培训机构小编为大家分享"最常见的208道Java最新面试题及答案",本文主要包含十九个模块的java面试题,分别是:Java 基础.容器.多线程.反射.对象拷贝 ...

  9. java web面试_超实用的Java web面试题

    Java web面试题 1.Tomcat的优化经验 答:去掉对web.xml的监视,把jsp提前编辑成Servlet. 有富余物理内存的情况,加大tomcat使用的jvm的内存 2.HTTP请求的GE ...

最新文章

  1. Linux 忘记登录密码?破解系统登陆密码
  2. mysql java orm_ObjectiveSQL(Java ORM) 之 MySQL 实战
  3. jQuery用于请求服务器的函数
  4. Docker学习(一)
  5. 集成电路设计专业视频集(一)
  6. 我来做百科(第一天)
  7. Lintcode 729. 阶乘除法的最后一位数
  8. 【免费】某机构最新3980元机器学习/大数据课程高速下载,限量200份
  9. 第八届开源操作系统年度技术会议(OS2ATC)在京召开, 百位科技菁英到场共鉴“开源协作”
  10. 【转】JavaScript中的this关键字使用的四种调用模式
  11. python svm超参数_为了能早点买房,我用 Python 预测房价走势!
  12. 阿里云云计算 37 PolarDB MySQL的连接
  13. 正交设计 python算法_SPSS统计分析案例:无空白列重复正交试验设计方差分析
  14. 在线rar压缩包解密软件,rar压缩包权限密码多少?
  15. devise 笔记
  16. 开网站需要多少钱,制作一个网页需要多少钱
  17. 惠普HP Officejet K7103 打印机驱动
  18. 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
  19. 第二篇第六章安全疏散
  20. VLR via C# 泛型

热门文章

  1. 一加7pro保存的录音文件在哪一个文件夹?
  2. Oracle 获取月初和月末
  3. Confluence与Jira安装及后期迁移问题记录
  4. PHP execl导出/展示
  5. Java程序员,上班那点事儿
  6. 又一个网页下载者木马
  7. 入侵检测规则匹配算法--单模匹配算法、多模匹配算法、hyperscan
  8. (53)FPGA面试题-利用任务task实现单字节乘法功能(Verilog语言实现)
  9. (24)FPGA减法器设计(第5天)
  10. FPGA时序约束设计经验总结