1.List接口下都有哪些集合,他们各自有什么特点
ArrayList集合:查询快,增删慢。底层是数组,数组有索引值,所以查询的速度快,但数组要增删需要重新创建一个新数组对象,将其他的元素添加到新数组中
LinkedList集合:查询慢,增删快。底层是链表。链表一个节点包含了一个数据源(存储数组),两个指针域(存储地址),链表中地址不是连续的,每次查询都要从头开始。而增删对链表的整体结构没有影响。
Vector集合:查询快,增删慢
2.Set接口下的集合是如何保证无序不可重复的
Set接口下的集合重写了Object类中的hashCode()和equals()方法,使元素先查询哈希值是否相同,哈希值不同,对象的内容不同,直接存进去。哈希值相同,内容可能相同,也可能不同。内容相同就不存,内容不同就存进去。
3.我们为什么要重写HashCode( )和equals()方法?
因为如果两个对象需要判断是否相同内容,用equals方法比较,比较耗费性能。所以我们对Object类继承过来的hashCode()方法进行覆盖重写,不让他生成地址值,而是根据对象的内容生成hash值,进行比较,比较hash值比equals方法容易的多。
(1)重写Object类中继承过来的hashCode()方法,自定义,根据对象的内容生成的哈希值
(2)我们在进行集合元素存储的时候,比如先HashSet集合添加元素的时候,会先调用hashCode()的方法,生成哈希值,不同对象生成的哈希值可能相同
(3)哈希值不同,对象的内容肯定不同;哈希值相同,对象的内容有可能相同,有可能不同。
(4)比较哈希值如果不同,直接存。如果相同,再调用equals方法进行内容比较
4.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
答:先判断HashCode(),因为Set集合底层是用哈希表,哈希表=数组+链表/红黑树,会先计算元素的哈希值,然后通过哈希值比较,如果链表中没有相同的哈希值,直接存进去。如果有相同的哈希值,在判断equals()方法。
5.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则ComparTo方法
Comparator:相当于一个比较器来比较两个元素
Comparator接口的使用多,因为Comparable只能在类中实现一次ComparaTo(),并不能经常修改类代码实现自己想要的排序。
|