java中的Set接口实现类的遍历

Set接口实现类主要是:HashSet,LinkedHashSet【二者,可以看看java集合.xmind文件】,TreeSet【没有学到】

  一. HashSet类的遍历:

 1 public class SetBianLiTest {
 2     public static void main(String[] args) {
 3         // HashSet的遍历
 4         // 重点:添加的对象,如果是自定义的对象,需要重写hashCode()和equals()方法。
 5         // 此处,可以将HashSet的源码好好看看。
 6         Set set = new HashSet();
 7         set.add("hello");
 8         set.add("world");
 9         set.add("hello");
10         set.add(new String("hello"));
11         set.add(true);
12         set.add(new Person0("大白",20));
13         set.add(new Person0("大白",20));
14 
15         System.out.println("===迭代器遍历===");
16         // 第一种遍历方式:生成迭代器
17         Iterator iterator = set.iterator();
18         while (iterator.hasNext()) {
19             Object obj =  iterator.next();
20             System.out.println(obj);
21         }
22 
23         System.out.println("===增强for遍历===");
24         // 第二种方式:增强for循环
25         for (Object o : set) {
26             System.out.println(o);
27         }
28         
29     }
30 }
31 
32 class Person0 {
33     private String name;
34     private int age;
35 
36     public Person0(String name, int age) {
37         this.name = name;
38         this.age = age;
39     }
40 
41     @Override
42     public boolean equals(Object o) {
43         if (this == o) return true;
44         if (o == null || getClass() != o.getClass()) return false;
45         Person0 person0 = (Person0) o;
46         return age == person0.age && name.equals(person0.name);
47     }
48 
49     @Override
50     public int hashCode() {
51         return Objects.hash(name, age);
52     }
53 
54     @Override
55     public String toString() {
56         return "Person0{" +
57                 "name='" + name + '\'' +
58                 ", age=" + age +
59                 '}';
60     }
61 }

  二. LinkedHashSet类的遍历

 1 public class SetBianLiTest {
 2     public static void main(String[] args) {
 3         // HashSet的遍历
 4         // 重点:添加的对象,如果是自定义的对象,需要重写hashCode()和equals()方法。
 5         // 此处,可以将HashSet的源码好好看看。
 6         Set set = new LinkedHashSet();
 7         set.add("hello");
 8         set.add("world");
 9         set.add("hello");
10         set.add(new String("hello"));
11         set.add(true);
12         set.add(new Person0("大白",20));
13         set.add(new Person0("大白",20));
14 
15         System.out.println("===迭代器遍历===");
16         // 第一种遍历方式:生成迭代器
17         Iterator iterator = set.iterator();
18         while (iterator.hasNext()) {
19             Object obj =  iterator.next();
20             System.out.println(obj);
21         }
22 
23         System.out.println("===增强for遍历===");
24         // 第二种方式:增强for循环
25         for (Object o : set) {
26             System.out.println(o);
27         }
28 
29     }
30 }
31 
32 class Person0 {
33     private String name;
34     private int age;
35 
36     public Person0(String name, int age) {
37         this.name = name;
38         this.age = age;
39     }
40 
41     @Override
42     public boolean equals(Object o) {
43         if (this == o) return true;
44         if (o == null || getClass() != o.getClass()) return false;
45         Person0 person0 = (Person0) o;
46         return age == person0.age && name.equals(person0.name);
47     }
48 
49     @Override
50     public int hashCode() {
51         return Objects.hash(name, age);
52     }
53 
54     @Override
55     public String toString() {
56         return "Person0{" +
57                 "name='" + name + '\'' +
58                 ", age=" + age +
59                 '}';
60     }
61 }

  注意:二者的区别,HashSet遍历是与添加顺序无关的,而LinkedHashSet遍历取决与添加的顺序。

    添加对象是自定义对象时,一定要在自定义类中重写hashCode()和equals()方法。

posted @ 2023-01-01 21:24  zwGitOne  阅读(94)  评论(0编辑  收藏  举报