HashSet 和 TreeSet 有什么区别
- HashSet 不能保证元素的排列顺序,只能放入一个null,底层采用HashMap,采用哈希表实现;向集合中插入元素,先比较hashCode方法,在比较equals方法,若为false,则可以插入。
- TreeSet 数据是排列好的,使用TreeMap实现,采用二叉树(红黑树)的数据结构,可以获取有序的序列,必须实现Comparable接口,使用compareTo方法,当往Set插入一个元素时候,调用compareTo方法,根据返回的结果,决定插入的位置。
TreeSet是SortedSet接口的唯一实现类,支持2种排序,默认是自然排序(按照升序排列),还有定制排序
HashSet 的底层实现
底层是哈希表,特点:存储快
Hashset存储元素时,调用元素hashCode方法得到元素的哈希值,通过元素的哈希值经过位移等运算,就可以算出元素在哈希表中的存储位置。
1.如果算出的元素存储的位置没有任何元素存储,就直接存储在该位置上;
2.存在其他元素,调用equals方法比较,返回true,不允许添加。
LinkedHashMap 的实现原理
在HashMap存储结构的基础上,使用双向链表记录添加元素的顺序,按照插入的顺序从头部或者从尾部迭代,是有序的,多维护了一个双向链表,性能差点。
为什么集合类没有实现 Cloneable 和 Serializable 接口?
- 集合类如果没有必要考虑克隆和串行化等一堆额外的特性,就不是纯粹的接口了;实现类都实现了这些接口,串行化和克隆也常用。
什么是迭代器 (Iterator)?
为了方便处理集合中的元素,java出现了一个对象,该对象提供了一些方法处理集合中的元素,该对象就叫迭代器。迭代器就是专门取出集合元素的对象,但是该对象比较特殊,不能直接创建对象,以内部类的形式存在于集合类的内部,取出方式的细节进行了封装。每一个容器都有取出元素的功能,功能都一样,只不过实现的具体方式不同(数据结构不一样),所以对共性的取出进行了抽取,出现了Iterator接口。
Iterator 和 ListIterator 的区别是什么?
相同点: 1.都可以遍历集合元素使用;2.集合中提供的内部方法
不同点: 1.Iterator不能对集合进行添加,修改操作;可以在所有集合中使用;2.ListIterator只能在list类型中使用,有add方法,可以定位当前索引的位置,可以进行set方法修改。