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()方法。