HashSet集合:
1.实现了Set接口,基于HsahMap。
2.不保证输出顺序
3.允许使用null值,只能使用一次
4.实现是不同步的
5.不可以添加重复元素
6.相比于List集合,没有索引
------------------------------------------------------------------------
问题1:HashSet不允许添加重复元素,那么系统底层是如何判断元素是否重复的呢?
详情见博客:java中hasCode方法的作用----重复元素判断机制
TreeSet集合:
1.实现了Set接口,基于TreeMap ---- 二叉树存储结构,又叫红黑树
2.可排序的,依据自然排序和比较器
3.不是同步的
4.不可以使用null值,无法比较
5.不可以重复添加
1.对象数组进行排序时,sort一个参数的方法使用的是自然排序,两个参数的使用比较器进行排序。
2.TreeSet无参的构造方法默认使用自然排序来判断元素是否重复,有参的构造方法可以设置TreeSet使
用比较器类来判断重复。
注意:TreeSet添加元素时:元素之间可以比较 -- 即:类型一致并且同时实现自然排序或比较器
TreeSet集合中添加自定义的类对象:那么要求该类必须实现自然排序或者比较器
即要实现comparable接口重写compareTo(Object obj)方法或者通过实现comparator接口来
创建该类的比较器类,重写compare(Object obj1, Object obj2)方法。
问题2:TreeSet不允许添加重复元素,那么如何判断是否为重复元素?
答:首先判断的标准和HashSet不一样,TreeSet添加元素时要进行比较(自然排序或者比较器),根据比较结果来判断是否重复,
如果返回0则代表重复,返回-1则代表不重复。
------------------------------------------------------------------------------------------
主要研究各集合在添加元素时的不同,因为其他操作方式基本一致:
1.添加元素时有什么限制
2.可不可以添加null值
3.添加时的底层实现
---------------------------------------------------------------------------------------
Collection和Collections的区别?
1.Collections可以看做操作集合的工具类和Arrays类似,而Collection是一个接口
面试题:Arrays中有一个将数组转换成List集合的方法asList()方法,
但是转换为list集合后发现只能修改和查询,不能进行增删操作,这是为什么?
答:查看源码发现,他是通过使用内部类的方式新建了一个List的子类ArrayList,该静态内部类ArrayList和
集合ArrayList类不是一个类,但是继承了同一个父类,区别是集合ArrayList重写了父类的所有增删改查
的方法,但是该静态内部类只是重写了父类的增和删的方法,并没有重写父类的add和remove等方法,并且
父类中的这些增和删的方法实现都是直接抛出异常的。
------------------------------------------------------------------------------------------
面试题:Comparable和Comparator的区别:
本质:使用场景上的区别
Comparable:当某个自定义的类或者其他的类不具备排序功能,并且代码可以修改,那么为该类添加排序
功能有两种方式:
1.该类实现Comparable接口,重写compareTo方法
2.定义额外的实现Comparator的比较器类,重写compare方法。
Comparator:当某个类不具有排序功能或者他的排序规则不是我们想要的,并且该类的代码不可修改,
那么我们可以通过定义该类的比较器类来实现我们自己的排序规则。