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 }

 

posted @ 2022-07-29 15:11  小王同学学编程  阅读(39)  评论(0编辑  收藏  举报
levels of contents