set系列集合、Collection体系的总结
1. Set集合
2 import java.util.LinkedHashSet; 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 public class SetDemo1 { 7 public static void main(String[] args) { 8 9 // 无索引不能使用普通for循环遍历, 也不能通过索引来获取元素 10 11 // 1. HashSet: 无序, 不重复, 无索引 12 // 一行经典代码 13 Set<String> set1 = new HashSet<>(); 14 set1.add("java"); 15 set1.add("hello"); 16 set1.add("scala"); 17 set1.add("hello"); 18 set1.add("mysql"); 19 set1.add("hello"); 20 System.out.println(set1); 21 22 // 2. LinkedHashSet: 有序, 不重复, 无索引
//底层数据结构依然是哈希表,只是每一个元素又额外的多了一个双链表的机制记录存储的顺序 23 Set<String> set2 = new LinkedHashSet<>(); 24 set2.add("java"); 25 set2.add("hello"); 26 set2.add("scala"); 27 set2.add("hello"); 28 set2.add("mysql"); 29 set2.add("hello"); 30 System.out.println(set2); 31 32 // 3. Tree: 排序, 不重复, 无索引。 Integer,Double官方默认按照大小进行升序排序,对于字符串:默认按照首字符的编号升序排序
// 想要使用TreeSet存储自定义类型,需要制定排序规则
33 Set<String> set3 = new TreeSet<>(); 34 set3.add("java"); 35 set3.add("hello"); 36 set3.add("scala"); 37 set3.add("hello"); 38 set3.add("mysql"); 39 set3.add("hello"); 40 System.out.println(set3); 41 } 42 }
哈希值:是JDK根据对象的地址,按照某种规则算出来的int类型的数值。
hashCode() :返回对象的哈希值。
对象的哈希值特点:同一个对多次调用hashCode()方法返回的哈希值是相同的。
默认情况下,不同对象的哈希值是不同的。
去重复
如果希望Set集合认为两个内容相同的对象是重复的应该怎么办:重写对象的hashCode和equals方法。
1 import java.util.Objects; 2 3 public class student { 4 private String name; 5 private int age; 6 private char sex; 7 8 public student(String name, int age, char sex) { 9 this.name = name; 10 this.age = age; 11 this.sex = sex; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public int getAge() { 23 return age; 24 } 25 26 public void setAge(int age) { 27 this.age = age; 28 } 29 30 public char getSex() { 31 return sex; 32 } 33 34 public void setSex(char sex) { 35 this.sex = sex; 36 } 37 38 @Override 39 public boolean equals(Object o) { 40 if (this == o) { 41 return true; 42 } 43 if (o == null || getClass() != o.getClass()) { 44 return false; 45 } 46 student student = (student) o; 47 return age == student.age && sex == student.sex && Objects.equals(name, student.name); 48 } 49 50 @Override 51 public int hashCode() { 52 return Objects.hash(name, age, sex); 53 } 54 55 @Override 56 public String toString() { 57 return "student{" + 58 "name='" + name + '\'' + 59 ", age=" + age + 60 ", sex=" + sex + 61 '}'; 62 } 63 }
1 import java.util.HashSet; 2 3 /** 4 * 让set集合把重复内容的对象去掉一个(去重复) 5 */ 6 public class setDemo3 { 7 public static void main(String[] args) { 8 9 // set集合去重复的原因。先判断哈希值,在判断equals 10 HashSet<student> set1 = new HashSet<>(); 11 student s1 = new student("wl", 22, '男'); 12 student s2 = new student("phx", 23, '女'); 13 student s3 = new student("phx", 23, '女'); 14 15 set1.add(s1); 16 set1.add(s2); 17 set1.add(s3);
21 // 重写hashcode方法 22 23 System.out.println(s1.hashCode()); 24 //s2 , s3 哈希值一样 25 System.out.println(s2.hashCode()); 26 System.out.println(s3.hashCode()); 27 System.out.println(set1); 28 } 29 }
TreeSet集合自定义
方式一:让自定义的类实现Comparable接口重写里面的compareTo方法来定制比较规则。
方式二:TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。
如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序。
1 public class Apple implements Comparable<Apple> { 2 private String name; 3 private String color; 4 private double price; 5 private int weight; 6 7 public Apple(String name, String color, double price, int weight) { 8 this.name = name; 9 this.color = color; 10 this.price = price; 11 this.weight = weight; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public String getColor() { 23 return color; 24 } 25 26 public void setColor(String color) { 27 this.color = color; 28 } 29 30 public double getPrice() { 31 return price; 32 } 33 34 public void setPrice(double price) { 35 this.price = price; 36 } 37 38 public int getWeight() { 39 return weight; 40 } 41 42 public void setWeight(int weight) { 43 this.weight = weight; 44 } 45 46 @Override 47 public String toString() { 48 return "Apple{" + 49 "name='" + name + '\'' + 50 ", color='" + color + '\'' + 51 ", price=" + price + 52 ", weight=" + weight + 53 '}'; 54 } 55 56 /** 57 * 方式一:类自定义比较规则 58 * @param o the object to be compared. 59 * @return 60 */ 61 @Override 62 public int compareTo(Apple o) { 63 // 按照重量比较 64 65 //这个会去掉重复的值 66 //return this.weight - o.weight; 67 return this.weight - o.weight >= 0 ? 1 : -1; 68 } 69 }
1 import java.util.Comparator; 2 import java.util.Set; 3 import java.util.TreeSet; 4 5 /** 6 * 如何自定义类型的对象进行制定规则排序 7 */ 8 public class setDemo4 { 9 public static void main(String[] args) { 10 11 Set<Apple> set = new TreeSet<>(new Comparator<Apple>() { 12 // 方式二:集合自带比较器对象进行规则定制 13 //如果两种方式都有用会用集合自带的, 优先使用集合自带的 14 @Override 15 public int compare(Apple o1, Apple o2) { 16 17 return o2.getWeight() - o1.getWeight(); 18 } 19 }); 20 21 set.add(new Apple("红富士", "红色", 15.2, 500)); 22 set.add(new Apple("青苹果", "绿色", 9.9, 600)); 23 set.add(new Apple("白苹果", "白色", 8.8, 600)); 24 System.out.println(set); 25 } 26 }