Java集合之Set接口(下)
一、承接上篇Java集合之Set接口(上),继续对Set接口进行讲解
二、Set接口下的实现类:
2.1、HashSet集合:
2.1.1、HashSet是以HashMap实现的集合,存放的数据是无序的,可以存放null元素,不支持同步,线程不安全;实现同步需要:Collections.synchronizedSet(new HashSet<>())
2.1.2、HashSet中自定义对象去重:
2.1.2.1、去重必备条件:覆盖对象的equals方法;覆盖对象的hashCode方法
示例代码:
2.2、LinkedHashSet集合:
2.2.1、LinkedHashSet是以HashMap和双向链表实现的集合,存放的数据是有序的(存放顺序),可以存放null元素,不支持同步,线程不安全;实现同步需要:Collections.synchronizedSet(new LinkedHashSet<>())
2.2.2、LinkedHashSet的方法与HashSet基本一致
2.3、TreeSet集合:
2.3.1、TreeSet是以TreeMap实现的集合,不可以容纳null元素,存放的数据是有序的(从小到大),不支持同步,线程不安全;实现同步需要:Collections.synchronizedSortedSet(new TreeSet<>())
2.3.2、TreeSet中元素排序方式:
1、数字按照大小排序
2、字母按照字母顺序排序
3、汉字按照Unicode码排序
4、多字母排序是逐一比较共同有的位数,单独有的位数不比较
示例代码:
2.3.3、TreeSet存放自定义对象:自定义对象不能直接添加到treeSet集合中,想要添加到treeSet中必须要遵守一定的条件
2.3.3.1、条件:
1、自定义对象实现Comparable接口;
2、覆盖接口中的compareTo方法
2.3.3.2、compareTo方法返回值问题:
1、如果返回值为0,只添加第一个元素
2、如果返回值为正数,添加所有元素,按照添加顺序显示
3、如果返回值为负数,添加所有元素,按照添加顺序倒序显示
示例代码:
2.3.4、TreeSet集合自定义对象属性排序:
2.3.4.1、自定义对象排序阐述:
1、TreeSet添加元素时会调用compareTo方法,如果该方法返回值为0时,认为添加元素和treeSet集合当中元素相等,则不添加;
如果该方法返回值为正数时,就会放在treeSet集合中元素的右边;如果该方法返回值为负数时,就会放在treeSet集合中元素的左边
2、通过此特性可以对TreeSet集合中添加对象中的某个属性比较大小,从而对TreeSet集合中对象进行排序
示例代码:
2.3.5、TreeSet比较器:自定义比较器对传入TreeSet集合的数据,无论是自定义对象还是包装类对象,都能按照自己的方式去比较,默认情况下比较时会调用传入集合对象的compareTo方法
2.3.5.1、TreeSet比较器实现步骤:
1、自定义比较器实现一个接口Comparator<T>
2、接口中的泛型T为想要比较传入的集合元素类型
3、接口的compare方法进行重写
2.3.5.2、compare方法说明:
1、方法参数:第一个代表当前正在添加的对象,第二个代表集合当中的对象
2、方法返回值:
2.1、如果该方法返回值为0时,认为添加元素和treeSet集合当中元素相等,则不添加
2.2、如果该方法返回值为正数时,就会放在treeSet集合中元素的右边
2.3、如果该方法返回值为负数时,就会放在treeSet集合中元素的左边
2.3.5.3、示例代码: