一、Set 接口
Set接口没有提供Collection接口额外的方法,但实现Set接口的集合类中的元素是不可重复的
二、HashSet 集合类
--HashSet不保存元素的加入顺序。
--HashSet根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到。
--向HashSet中添加元素时,系统为保证不重复,先比较hashCode( ) ,如果相同,再比较equals(),如果还相同,则认为是同一个对象,不再加入,add(...)返回false,
--[Demo] 要存入HashSet集合的自定义类型的对象通常需要重写hashCode()和equals()方法。
--同一个对象的hash值一定相同,同一个hash值不一定是同一个对象,甚至可能是不同类的对象。
HashSet 存对象,重写hashCode()和equals()方法例子
public class Person { private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } //重写hashCode()方法 @Override public int hashCode() { return this.name.hashCode() + this.age;//因为age是整型可以转成hashCode,也可以不转 } //重写equals()方法 @Override public boolean equals(Object obj) { //= p // this.name 参数.name // this.age 参数.age // 如果 obj 是null 就直接返回 false 就不用去判断是否有本类创建对象了 if(obj == null){ return false; } // 如果 地址相同的话 就不需要挨个比较属性 直接返回true if(obj == this){ return true; } if(obj instanceof Person){ Person paramter = (Person)obj; if(this.name.equals(paramter.name) && this.age == paramter.age){ return true; } } return false; } }
import java.util.HashSet; public class Test11 { public static void main(String[] args) { HashSethashSet = new HashSet<>(); hashSet.add(new Person("张三", 12)); hashSet.add(new Person("张三", 12)); hashSet.add(new Person("张三", 14)); hashSet.add(new Person("李四", 12)); System.out.println(hashSet); } }
执行结果:
[Person [name=张三, age=12], Person [name=张三, age=14], Person [name=李四, age=12]]
三、TreeSet 集合类
--TreeSet使用红黑树结构对加入的元素进行排序存放,输出时也会按排序后的顺序, 所以放入TreeSet中元素必须是”可排序的”
--加入TreeSet集合中的javabean类本身要实现Comparable ['kɑmpərəbl]接口
--自定义一个实现Comparator['kɑmpə,retɚ]接口的比较器实现类,在创建TreeSet对象时,将自定义比较器传入构造方法
--如果加入的类”不可比较”,则add()方法在运行时会报错
所有"可排序"的类都必须实现java.lang.Comparable接口
实现该接口中的唯一方法: public int compareTo(Object obj); 该方法如果
(this:新加入对象;obj:集合中已经存在的对象)
--返回 0,表示 this == obj,不加入集合
--返回正数,表示 this > obj,this较大放后面
--返回负数,表示 this < obj,this较小放前面
实现Comparable接口例子
package chapter.three; import java.text.CollationKey; import java.text.Collator; public class Person implements Comparable{ private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Person o) { //先年龄升序,再名字排序 if (this.age > o.age) { return 1; }else if (this.age < o.age) { return -1; }else { //即可排序汉字,也可以其他,防止汉字排序出错 CollationKey key1 = Collator.getInstance().getCollationKey(this.name); CollationKey key2 = Collator.getInstance().getCollationKey(o.name); int num = key1.compareTo(key2); if (num > 0) { return 1; }else if (num < 0) { return -1; }else { return 0;//返回0则不加入集合 }
//如果这里是最后比较,可以只写这一句语句就可以return o1.getName().compareTo(o2.getName()); } } }
import java.util.HashSet; import java.util.TreeSet; public class Test11 { public static void main(String[] args) { TreeSettreeSet = new TreeSet<>(); treeSet.add(new Person("张三", 14)); treeSet.add(new Person("李四", 12)); treeSet.add(new Person("赵六", 12)); treeSet.add(new Person("王五", 19)); for (Person person : treeSet) { System.out.println(person); } } }
执行结果:
Person [name=李四, age=12] Person [name=赵六, age=12] Person [name=张三, age=14] Person [name=王五, age=19]
自定义一个实现Comparator接口的比较器实现类
import java.text.CollationKey; import java.text.Collator; public class Person/* implements Comparable*/{ private String name; private int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
//自定义比较类 import java.text.CollationKey; import java.text.Collator; import java.util.Comparator; public class MyComparator implements Comparator{ @Override public int compare(Person o1, Person o2) { //先年龄升序,再名字排序 if (o1.getAge() > o2.getAge()) { return 1; }else if (o1.getAge() < o2.getAge()) { return -1; }else { //即可排序汉字,也可以其他,防止汉字排序出错 CollationKey key1 = Collator.getInstance().getCollationKey(o1.getName()); CollationKey key2 = Collator.getInstance().getCollationKey(o2.getName()); int num = key1.compareTo(key2); if (num > 0) { return 1; }else if (num < 0) { return -1; }else { return 0;//返回0则不加入集合 } } } }
import java.util.TreeSet; public class Test11 { public static void main(String[] args) { TreeSettreeSet = new TreeSet<>(new MyComparator()); treeSet.add(new Person("张三", 14)); treeSet.add(new Person("李四", 12)); treeSet.add(new Person("赵六", 12)); treeSet.add(new Person("王五", 19)); for (Person person : treeSet) { System.out.println(person); } } }
执行结果:
Person [name=李四, age=12] Person [name=赵六, age=12] Person [name=张三, age=14] Person [name=王五, age=19]