1.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是equals()? 它们有何区别?
Set 里的元素是不能重复的,元素重复与否是使用 equals() 方法进行判断的。
equals() 和 == 方法决定引用值是否指向同一对象 equals() 在类中被覆盖,为的是
当两个分离的对象的内容和类型相配的话,返回真值。
2.两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对?
对。如果对象要保存在 HashSet 或 HashMap 中,它们的 equals 相等,那么,它
们的 hashcode 值就必须相等。
如果不是要保存在 HashSet 或 HashMap,则与 hashcode 没有什么关系了,这时
候 hashcode 不等是可以的,例如 arrayList 存储的对象就不用实现 hashcode,当
然,我们没有理由不实现,通常都会去实现的。
3.heap 和 stack 有什么区别。
Java 的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法
时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,
当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使
用 new 创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部
变量使用 final 修饰后,放在堆中,而不是栈中。
4.Java 集合类框架的基本接口有哪些?
集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选
择以它 自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java 集合
类里面 最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的 Collection。
List:有顺序的 collection,并且可以包含重复元素。
Map:可以把键 (key) 映射到值 (value) 的对象,键不能重复。
5.HashSet 和 TreeSet 有什么区别?
HashSet 是由一个 hash 表来实现的,因此,它的元素是无序的。add(),
remove(),contains()
TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),
remove(),contains() 方法的时间复杂度是 O(logn)。
6. HashSet 的底层实现是什么?
通过看源码知道 HashSet 的实现是依赖于 HashMap 的,HashSet 的值都是存储
在 HashMap 中的。在 HashSet 的构造法中会初始化一个 HashMap 对象,
HashSet 不允许值重复,因此,HashSet 的值是作为 HashMap 的 key 存储在
HashMap 中的,当存储的值已经存在时返回 false。
7. LinkedHashMap 的实现原理?
LinkedHashMap 也是基于 HashMap 实现的,不同的是它定义了一个 Entry
header,这个 header 不是放在 Table 里,它是额外独立出来的。
LinkedHashMap 通过继承 hashMap 中的 Entry, 并添加两个属性 Entry
before,after, 和 header 结合起来组成一个双向链表,来实现按插入顺序或访问顺序
排序。LinkedHashMap 定义了排序模式 accessOrder,该属性为 boolean 型变
量,对于访问顺序,为 true;对于插入顺序,则为 false。一般情况下,不必指定排
序模式,其迭代顺序即为默认为插入顺序。
到这里,也给大家推荐一个架构交流学习群:710373545,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工作和遇到技术瓶颈的码友,在这个群里会有你需要的内容。
8. 为什么集合类没有实现 Cloneable 和 Serializable 接口?
克隆 (cloning) 或者是序列化 (serialization) 的语义和含义是跟具体的实现相关的。
因此,应该 由集合类的具体实现来决定如何被克隆或者是序列化。
9. 什么是迭代器 (Iterator)?
Iterator 接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返
回迭代 器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素, 但是不
可以直接调用集合的 remove(Object Obj) 删除,可以通过迭代器的 remove() 方法
删除。
10. Iterator 和 ListIterator 的区别是什么?
下面列出了他们的区别:
Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List。
Iterator 对集合只能是前向遍历,ListIterator 既可以前向也可以后向。
ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元
素,获取前一个和后一个元素的索引,等等。
11. 数组 (Array) 和列表 (ArrayList) 有什么区别?什么时候应该使用 Array 而不是
ArrayList?
Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
Array 大小是固定的,ArrayList 的大小是动态变化的。
ArrayList 处理固定大小的基本数据类型的时候,这种方式相对比较慢。
12. Java 集合类框架的最佳实践有哪些?
假如元素的大小是固 定的,而且能事先知道,我们就应该用 Array 而不是
ArrayList。
有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,
我们可以设置 初始容量来避免重新计算 hash 值或者是扩容。
为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可
以避免运行时的 ClassCastException。
使用 JDK 提供的不变类 (immutable class) 作为 Map 的键可以避免为我们
自己的类实现 hashCode()和 equals()方法。
编程的时候接口优于实现。
底层的集合实际上是空的情况下,返回长度是 0 的集合或者是数组,不要返
回 null。
13. Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是
equals()?它们有何区别?
Set 里的元素是不能重复的,那么用 iterator() 方法来区分重复与否。equals() 是判
读两个 Set 是否相等
equals() 和 == 方法决定引用值是否指向同一对象 equals() 在类中被覆盖,为的是
当两个分离的对象的内容和类型相配的话,返回真值
14. Comparable 和 Comparator 接口是干什么的?列出它们的区别。
Java 提供了只包含一个 compareTo() 方法的 Comparable 接口。这个方法可以个
给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于
已经存在的对象。
Java 提供了包含 compare() 和 equals() 两个方法的 Comparator 接口。
compare() 方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小
于,等于,大于第二个参数。equals() 方法需要一个对象作为参数,它用来决定输入
参数是否和 comparator 相等。只有当输入参数也是一个 comparator 并且输入参
数和当前 comparator 的排序结果是相同的时 候,这个方法才返回 true。
15. Collection 和 Collections 的区别。
collection 是集合类的上级接口, 继承与它的接口主要是 set 和 list。
collections 类是针对集合类的一个帮助类. 它提供一系列的静态方法对各种集合的搜
索, 排序, 线程安全化等操作。