标签:
HashSet:存储字符串并遍历
问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。
步骤:
首先比较哈希值
如果相同,继续走,比较地址值或者走equals()
如果不同,就直接添加到集合中
按照方法的步骤来说:
先看hashCode()值是否相同
相同:继续走equals()方法
返回true: 说明元素重复,就不添加
返回false:说明元素不重复,就添加到集合
不同:就直接把元素添加到集合
如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。
而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。
1 import java.util.HashSet; 2 public class HashSetDemo { 3 public static void main(String[] args) { 4 // 创建集合对象 5 HashSet<String> hs = new HashSet<String>(); 6 7 // 创建并添加元素 8 hs.add("hello"); 9 hs.add("world"); 10 hs.add("java"); 11 hs.add("world"); 12 13 // 遍历集合 14 for (String s : hs) { 15 System.out.println(s); 16 } 17 } 18 } 19 20
需求:存储自定义对象,并保证元素的唯一性
要求:如果两个对象的成员变量值都相同,则为同一个元素。
目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
1 import java.util.HashSet; 2 public class HashSetDemo2 { 3 public static void main(String[] args) { 4 // 创建集合对象 5 HashSet<Student> hs = new HashSet<Student>(); 6 7 // 创建学生对象 8 Student s1 = new Student("林青霞", 27); 9 Student s2 = new Student("柳岩", 22); 10 Student s3 = new Student("王祖贤", 30); 11 Student s4 = new Student("林青霞", 27); 12 Student s5 = new Student("林青霞", 20); 13 Student s6 = new Student("范冰冰", 22); 14 15 // 添加元素 16 hs.add(s1); 17 hs.add(s2); 18 hs.add(s3); 19 hs.add(s4); 20 hs.add(s5); 21 hs.add(s6); 22 23 // 遍历集合 24 for (Student s : hs) { 25 System.out.println(s.getName() + "---" + s.getAge()); 26 } 27 } 28 }
标签:
原文地址:http://www.cnblogs.com/LZL-student/p/5901525.html