上一篇http://blog.csdn.net/qq_32059827/article/details/51578158

写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存储规律的。上次存储的是字符串,那么这里看看存储自定义对象是不是也是同样的规律。其实这里有着很多的问题需要讨论。

存储自定义对象,代码写了出来:

  1. import java.util.HashSet;
  2.  
  3. public class HashSetDemo2 {
  4. public static void main(String[] args) {
  5. // 创建集合对象
  6. HashSet<Student> hs = new HashSet<Student>();
  7.  
  8. // 创建学生对象
  9. Student s1 = new Student("林青霞", 27);
  10. Student s2 = new Student("柳岩", 22);
  11. Student s3 = new Student("王祖贤", 30);
  12. Student s4 = new Student("林青霞", 27);
  13. Student s5 = new Student("林青霞", 20);
  14. Student s6 = new Student("范冰冰", 22);
  15.  
  16. // 添加元素
  17. hs.add(s1);
  18. hs.add(s2);
  19. hs.add(s3);
  20. hs.add(s4);
  21. hs.add(s5);
  22. hs.add(s6);
  23.  
  24. // 遍历集合
  25. for (Student s : hs) {
  26. System.out.println(s.getName() + "---" + s.getAge());
  27. }
  28. }
  29. }

下面是Student类:

  1. package cn.itcast_02;
  2.  
  3. /**
  4. * @author Administrator
  5. *
  6. */
  7. public class Student {
  8. private String name;
  9. private int age;
  10.  
  11. public Student() {
  12. super();
  13. }
  14.  
  15. public Student(String name, int age) {
  16. super();
  17. this.name = name;
  18. this.age = age;
  19. }
  20.  
  21. public String getName() {
  22. return name;
  23. }
  24.  
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28.  
  29. public int getAge() {
  30. return age;
  31. }
  32.  
  33. public void setAge(int age) {
  34. this.age = age;
  35. }
  36.  
  37. }

我们猜想运行结果应该是不重复的,即猜想结果应该是:

林青霞---20

柳岩---22

范冰冰---22

林青霞---27

王祖贤---30

即林青霞--27不会出现重复。控制台实际输出:

林青霞---20

柳岩---22

范冰冰---22

林青霞---27

王祖贤---30

林青霞---27

很显然,我们猜错了!而为什么字符串就能不出现重复呢?这是什么原因呢?

解释如下:

通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。

如果类没有重写这两个方法,默认使用的Object()。一般来说仅仅hashCode可能都不会相同,equals也不相同;则会全部添加到集合中去。

 * 例如自定义对象没有重写hashCode()和equals()方法的时候,就全部打印出来。这也是不重复的原因。

 * 而String类(写字符串对象的时候)重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。

因此我们要修改Student类里面的代码,即加入hashCode()和equals()。自动生成即可!

  1. package cn.itcast_02;
  2.  
  3. /**
  4. * @author Administrator
  5. *
  6. */
  7. public class Student {
  8. private String name;
  9. private int age;
  10.  
  11. public Student() {
  12. super();
  13. }
  14.  
  15. public Student(String name, int age) {
  16. super();
  17. this.name = name;
  18. this.age = age;
  19. }
  20.  
  21. public String getName() {
  22. return name;
  23. }
  24.  
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28.  
  29. public int getAge() {
  30. return age;
  31. }
  32.  
  33. public void setAge(int age) {
  34. this.age = age;
  35. }
  36.  
  37. @Override
  38. public int hashCode() {
  39. final int prime = 31;
  40. int result = 1;
  41. result = prime * result + age;
  42. result = prime * result + ((name == null) ? 0 : name.hashCode());
  43. return result;
  44. }
  45.  
  46. @Override
  47. public boolean equals(Object obj) {
  48. System.out.println(this + "---" + obj);
  49. if (this == obj)
  50. return true;
  51. if (obj == null)
  52. return false;
  53. if (getClass() != obj.getClass())
  54. return false;
  55. Student other = (Student) obj;
  56. if (age != other.age)
  57. return false;
  58. if (name == null) {
  59. if (other.name != null)
  60. return false;
  61. } else if (!name.equals(other.name))
  62. return false;
  63. return true;
  64. }
  65.  
  66. }

此时再打印不会出现重复:

王祖贤---30

范冰冰---22

柳岩---22

林青霞---27

林青霞---20

下一篇用一张图,解释桶结构与HashSet存储细节。

《java入门第一季》之HashSet存储自定义对象问题以及注意事项的更多相关文章

  1. JAVA入门第一季(mooc-笔记)

    笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...

  2. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  3. 30.1 HashSet存储自定义对象 未去重解决

    问题: package day30_HashSet; import java.util.HashSet; /* * 通过hashset存储自定义对象,没有进行去重. * * */ public cla ...

  4. 《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一

    上一篇用一个简单的例子,介绍了treeset集合存储的内部过程,这里再完善其存储自定义对象保证唯一. 需求:A:  * 自然排序,按照年龄从小到大排序  *         B:  * 成员变量值都相 ...

  5. 《java入门第一季》之HashSet存储元素保证唯一性的代码及图解

    上一篇介绍了HashSet存储自定义自定义对象时应该注意的问题http://blog.csdn.net/qq_32059827/article/details/51580642, 这一篇对其内部结构稍 ...

  6. Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习

    1. HashSet集合存储自定义对象并遍历.如果对象的成员变量值相同即为同一个对象 注意了: 你使用的是HashSet集合,这个集合的底层是哈希表结构. 而哈希表结构底层依赖:hashCode()和 ...

  7. 《java入门第一季》之集合框架(Collection小儿子Set集合)

    /*  * Collection主要的连个儿子:  * |--List  * 有序(存储顺序和取出顺序一致),可重复  * |--Set  * 无序(存储顺序和取出顺序不一致),唯一  *   * H ...

  8. Java入门第一季——从此投身Java??

    找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季  一.简 ...

  9. 《java入门第一季》之根据小案例体会泛型

    泛型在哪些地方使用呢? * 看API,如果类,接口,抽象类后面跟的有<E>就说要使用泛型.一般来说就是在集合中使用. 下面根据案例,加深体会泛型的作用. 案例一: import java. ...

随机推荐

  1. JVM之Java虚拟机详解

    这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守Java SE 7 规范的典型的 JVM 核心内部组件. 上图显示的组件分两个章节解释.第一章讨论针对每个线程创建的组件,第二章节讨论 ...

  2. Python小代码_6_列表推导式求 100 以内的所有素数

    import math a = [p for p in range(2, 100) if 0 not in [p % d for d in range(2, int(math.sqrt(p)) + 1 ...

  3. Java日志-Log4j2

    Log4j2参考资料 Log4j2 官方配置文档 1. Log4j2基本概念: Logger 在代码中产生日志信息的.比如logger.info("some log message" ...

  4. 20160210.CCPP体系详解(0020天)

    程序片段(01):01.二级指针.c 内容概要:二级指针 #include <stdio.h> #include <stdlib.h> //01.二级指针: // 1.使用场景 ...

  5. RxJava操作符(09-算术/聚合操作&连接操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51692493 本文出自:[openXu的博客] 目录: 算术聚合 Count Concat ...

  6. Xcode Organizational Identifiers

    操作系统(不管是iOS或是OS X)使用bundle标识去唯一标识你的应用.Bundle标识由一个组织id和你App的名字组成. 一般的,组织id是你域名的反转.如果你的域名是example.com那 ...

  7. Scala:数据类型和变量

    http://blog.csdn.net/pipisorry/article/details/52902158 Scala数据类型 Scala 与 Java有着相同的数据类型,下表列出了 Scala ...

  8. springMVC源码分析--HandlerAdapter(一)

    HandlerAdapter的功能实际就是执行我们的具体的Controller.Servlet或者HttpRequestHandler中的方法. 类结构如下:

  9. Python 通过继承实现标准对象的子类

    idict是dict的子类,它的键值和属性是同步的,并且有强大的默认值机制. 例如,假设x是idict的一个实例,且x['a']['b']=12,则有x.a.b=12.反之亦然; 假设'c'不在x的键 ...

  10. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...