Java面试系列05:Java基础之集合面试问题解答(下)

本文详细对比了HashSet和TreeSet的不同,包括数据结构、存储原理及排序机制。探讨了HashSet的底层实现,LinkedHashMap的工作原理,以及集合类为何未实现Cloneable和Serializable接口。介绍了迭代器的用途和Iterator与ListIterator的区别,比较了Array与ArrayList的特点,分享了Java集合类框架的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12.HashSet 和 TreeSet 有什么区别?

相同点:单例集合,数据不可重复
不同点
1:底层使用的储存数据结构不同:

  1. Hashset底层使用的是HashMap哈希表结构储存。
  2. 而Treeset底层用的是TreeMap树结构储存。

2:储存的数据保存唯一方式不同。

  1. Hashset是通过复写hashCode()方法和equals()方法来保证的。
  2. 而Treeset是通过Compareable接口的compareto方法来保证的。

3:hashset无序 Treeset有序
存储原理:
HashSet: 底层数据结构是哈希表,本质就是哈希值储存。通过判断元素的hashcode方法和equals方法来保证元素的唯一性。当哈希值不同时就直接进行储存。如果相同,会判断一次equals方式是否返回为true ,如果是true 则视为用的同一个元素,不用再储存。 如果是false,这个相同哈希值不同内容的元素会放在同一个桶里(当哈希表中有一个桶结构,每一个桶都有一个哈希值)
Treeset:底层数据结构式一个二叉树,可以对set集合中的元素进行排序,这种结构,可以提高排序性能。根据比较方法的返回值决定的,只要返回的是0,就代表元素重复。

13.HashSet 的底层实现是什么?

参考:
https://blog.youkuaiyun.com/HD243608836/article/details/80214413
https://www.iteye.com/blog/zhangshixi-673143
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成。

14.LinkedHashMap 的实现原理?

参考:
https://blog.youkuaiyun.com/HD243608836/article/details/80214413
“ 查看了LinkedHashMap的构造方法后,发现其因为继承自HashMap,所以其底层实现也是HashMap!!!(呵呵,我已经发现了……怪不得还是得主要研究HashMap啊),然后发现了LinkedHashMap调用父类构造方法初始化时,还顺便设置了变量accessOrder = false,看上面得源码可以知道,这是给了迭代器一个参数,false代表迭代时使用插入得顺序(追根溯源了,真爽)”

15.为什么集合类没有实现 Cloneable 和 Serializable 接口?

克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。

16.什么是迭代器 (Iterator)?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。Java中的Iterator只能单向移动:

        		//使用迭代器 遍历   每个集合对象都有自己的迭代器
        		Iterator<String> it = coll.iterator();
        		//  泛型指的是 迭代出 元素的数据类型
        		while(it.hasNext()){ //判断是否有迭代元素
            			String s = it.next();//获取迭代出的元素
            			System.out.println(s);
        		}

17.Iterator 和 ListIterator 的区别是什么?

链接:https://www.nowcoder.com/questionTerminal/9dbbd35ff35e4e008fdd792c2b539940
来源:牛客网
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

18.数组 (Array) 和列表 (ArrayList) 有什么区别?什么时候应该使用 Array 而不是 ArrayList?

链接:https://www.nowcoder.com/questionTerminal/203b16053654416c905721828160bf96
来源:牛客网
1、存储内容比较: Array 数组可以包含基本类型和对象类型, ArrayList 却只能包含对象类型。 Array 数组在存放的时候一定是同种类型的元素。ArrayList 就不一定了 。
2、空间大小比较: Array 数组的空间大小是固定的,所以需要事前确定合适的空间大小。 ArrayList 的空间是动态增长的,而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。 3.方法上的比较: ArrayList 方法上比 Array 更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。

19.Java 集合类框架的最佳实践有哪些?

来源:牛客网
https://www.nowcoder.com/questionTerminal/0911f7061c5f403f835e1467340d4ab1
在这里插入图片描述

20.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()?它们有何区别?

重复了,看问题8

21.Comparable 和 Comparator 接口是干什么的?列出它们的区别

链接:https://www.nowcoder.com/questionTerminal/99f7d1f4f8374e419a6d6924d35d9530
来源:牛客网

Comparable & Comparator 都是用来实现集合中元素的比较、排序的。
只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
Comparator位于包java.util下,而Comparable位于包 java.lang下 。
Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口) 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序, 这里的自然顺序就是实现Comparable接口设定的排序方式。
Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。 可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。 用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。 比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

22.Collection 和 Collections 的区别。

链接:https://www.nowcoder.com/questionTerminal/f51bc6a206fa48e6af9759c5036462a6
来源:牛客网

1、Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
2、Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值