12.HashSet 和 TreeSet 有什么区别?
相同点:单例集合,数据不可重复
不同点:
1:底层使用的储存数据结构不同:
- Hashset底层使用的是HashMap哈希表结构储存。
- 而Treeset底层用的是TreeMap树结构储存。
2:储存的数据保存唯一方式不同。
- Hashset是通过复写hashCode()方法和equals()方法来保证的。
- 而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框架。