今天我们继续了集合的学习,请根据自己的理解回答下面问题:
1.Set接口下的集合是如何保证无序不可重复的
HashSet由哈希表保证唯一性(通过重写hashcode()和equals)
无序,因为它没有索引,不能通过索引遍历
每次取出的顺序都有可能是不同的
(哈希表是一个元素是链表/红黑树的数组,初始长度是16,扩容因子是0.75,
当数组的一个元素的链表长度超过8时,该条链表会被转换为红黑树结构,提高查询效率)
TreeSet底层数据结构是具有自平衡的红黑二叉树,保证了唯一性,
其可以按照一定的规则排序。
没有索引,不能通过索引遍历。
2.我们为什么要重写HashCode( )和equals()方法?
保证集合元素的唯一性。
默认new的不同对象的hashcode()都不一样,所以要重写对象的hashcode()。
即使hashcode()相同,对象内容也会不同,所以要重写对象的equals()方法。
3.数据在存入Set集合的时候,是先判断HashCode()还是先判断equals(),为什么?
先判断HashCode(),如果哈希值不同,则不再判断equals() 直接添加元素;
如果哈希值相同,再判断equals(),如果equals()也相同,则为同一个元素,不添加。
4.Comparable和Comparator两个接口的区别,哪种接口使用的多,为什么?
Comparable是在类中实现,根据其元素的自然排序进行排序
Comparator是在构造方法中实现,创建集合的时候根据指定的比较器进行排序
通常使用Comparator,便于维护代码,提高代码的复用性,因为标准类制作完成后,不要轻易去修改类中的代码。
5.什么是泛型?使用泛型有什么好处?
泛型本质就是参数化类型。通常用T表示,指代各种参数类型
使用泛型,可以把运行时期的问题提前到了编译时期
避免了强制类型转换,可以简化代码,提取出通用的方案。
|