java:ArrayList集合与HashSet集合元素重复性探讨
2015-07-22 23:25
501 查看
/*1. 关于hashCode*/ class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } } //对象的HashCode值 class TestHashCode { public static void main(String[] args) { String str1 = "hello"; String str2 = "hi"; String str3 = "hello"; Student s1 = new Student("lisi", 45); Student s2 = new Student("zhangsan", 40); Student s3 = new Student("lisi", 45); //打印hashCode值 打印结果 System.out.println(str1.hashCode()); //99162322 System.out.println(str2.hashCode()); //3329 System.out.println(str3.hashCode()); //99162322 System.out.println(s1.hashCode()); //27134973 System.out.println(s2.hashCode()); //1284693 System.out.println(s3.hashCode()); //31168322 } } /* 上述程序验证了: 1.(hashCode)哈希值与对象的地址有关; 2.不同的对象,其hashCode值不一样; 3.内容相同的String对象,其hashCode()返回值一样。 */ /*2. 当元素没有覆盖hashCode() 和 equals()方法*/ import java.util.*; //定义元素,没有覆盖hashcode() 和 equals()方法 class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String toString() { return name +":" +age; } } class TestAgain { public static void main(String[] args) { //创建ArrayList集合 ArrayList<Student> a = new ArrayList<Student>(); //向集合中添加元素 a.add(new Student("lisi1", 10)); a.add(new Student("lisi2", 20)); a.add(new Student("lisi5", 50)); a.add(new Student("lisi4", 40)); a.add(new Student("lisi2", 20)); System.out.println(a); //打印结果是:[lisi1:10, lisi2:20, lisi5:50, lisi4:40, lisi2:20] //创建HashSet集合 HashSet<Student> hs = new HashSet<Student>(); //向集合中添加元素 hs.add(new Student("lisi1", 10)); hs.add(new Student("lisi2", 20)); hs.add(new Student("lisi5", 50)); hs.add(new Student("lisi4", 40)); hs.add(new Student("lisi2", 20)); System.out.println(hs); //打印结果是:[lisi2:20, lisi1:10, lisi2:20, lisi5:50, lisi4:40] } } /* 元素对象当没有覆写hashCode()和equals()方法时, ArrayList 和 HashSet中的元素都可以重复。 */ /*3. 元素只覆盖了hashCode()方法*/ import java.util.*; //定义元素,只覆盖覆盖hashCode()方法 class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } //覆写hashCode() public int hashCode() { return name.hashCode() + age; } public String toString() { return name +":" +age; } } class TestAgain1 { public static void main(String[] args) { //创建ArrayList集合 ArrayList<Student> a = new ArrayList<Student>(); //向集合中添加元素 a.add(new Student("lisi1", 10)); a.add(new Student("lisi2", 20)); a.add(new Student("lisi5", 50)); a.add(new Student("lisi4", 40)); a.add(new Student("lisi2", 20)); System.out.println(a); //打印结果是:[lisi1:10, lisi2:20, lisi5:50, lisi4:40, lisi2:20] //创建HashSet集合 HashSet<Student> hs = new HashSet<Student>(); //向集合中添加元素 hs.add(new Student("lisi1", 10)); hs.add(new Student("lisi2", 20)); hs.add(new Student("lisi5", 50)); hs.add(new Student("lisi4", 40)); hs.add(new Student("lisi2", 20)); System.out.println(hs); //打印结果是:[lisi2:20, lisi2:20, lisi5:50, lisi4:40, lisi1:10] } } /* 元素对象只覆写hashCode()方法时, ArrayList 和 HashSet中的元素都可以重复。 */ /*4. 覆写hashCode()和equals()方法*/ import java.util.*; //集合元素,覆写HashCode()和equals()方法 class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } //覆写hashCode()方法 public int hashCode() { return name.hashCode() + age; } //覆写equals()方法 public boolean equals(Object obj) { Student s = (Student)obj; if(this.name == s.name && this.age == s.age) return true; else return false; } public String toString() { return name +":" +age; } } class TestAgain3 { public static void main(String[] args) { //创建ArrayList集合 ArrayList<Student> a = new ArrayList<Student>(); //向集合中添加元素 a.add(new Student("lisi1", 10)); a.add(new Student("lisi2", 20)); a.add(new Student("lisi5", 50)); a.add(new Student("lisi4", 40)); a.add(new Student("lisi2", 20)); System.out.println(a); //打印结果是:[lisi1:10, lisi2:20, lisi5:50, lisi4:40, lisi2:20] //创建HashSet集合 HashSet<Student> hs = new HashSet<Student>(); //向集合中添加元素 hs.add(new Student("lisi1", 10)); hs.add(new Student("lisi2", 20)); hs.add(new Student("lisi5", 50)); hs.add(new Student("lisi4", 40)); hs.add(new Student("lisi2", 20)); System.out.println(hs); //打印结果是:[lisi2:20, lisi5:50, lisi4:40, lisi1:10] } } /* 元素对象覆写hashCode()和equals()方法时, ArrayList中的元素可以重复, 而,HashSet中的元素不可以重复了。 总结: 1.ArrayList集合中的元素,无论是否覆写了hashCode()和equals()方法, 都可以重复存在。 2.HashSet集合中的元素,只有同时覆写了hashCode()和equals()方法, 才能保证元素不重复。 3.HashSet判断集合元素的唯一性,首先根据元素的hashCode值,然后在根据equals方法, 如果不覆盖equals方法,会调用Object类的equals方法,是比较两个对象的地址值。
</pre><pre name="code" class="java"><span style="color: rgb(85, 85, 85); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="color: rgb(255, 0, 0);"><span style="white-space:pre"> </span>Java系统首先调用对象的hashCode()方法获得该对象的哈希码表,然后根据哈希吗找到相应的存储区域,最后取得该存储区域内的每个元素与该对象进行equals方法比较</span></span> */
相关文章推荐
- java中时分秒的取得与转换
- java-多线程安全问题
- java的值传递与引用传递试验
- java基础之产生随机数
- java基础之自动装箱和拆箱
- Java编程思想学习笔记——接口
- Java设计模式之基本原则(一)
- java基础之unicode和utf-8和assci之间的关系
- JAVA编程思想_笔记(七)
- JAVA编程思想_笔记(六)
- struts (七) 域模型
- springMVC拦截器配置
- java动态代理
- 2015第30周三Spring常用工具类
- Java IO学习【2】一个关于换行、续写的的小问题
- 项目下.java文件采用不同编码方案编译时的编码问题
- 利用struts实现jsp中的图片上传和预览
- EHcache注解使用(ehcache-spring-annotations)
- Javaweb传参乱码
- 导入java项目时出现红色叹号问题的解决