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

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

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

import java.util.HashSet;

public class HashSetDemo2 {
public static void main(String[] args) {
// 创建集合对象
HashSet<Student> hs = new HashSet<Student>(); // 创建学生对象
Student s1 = new Student("林青霞", 27);
Student s2 = new Student("柳岩", 22);
Student s3 = new Student("王祖贤", 30);
Student s4 = new Student("林青霞", 27);
Student s5 = new Student("林青霞", 20);
Student s6 = new Student("范冰冰", 22); // 添加元素
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
hs.add(s6); // 遍历集合
for (Student s : hs) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}

下面是Student类:

package cn.itcast_02;

/**
* @author Administrator
*
*/
public class Student {
private String name;
private int age; public Student() {
super();
} public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }

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

林青霞---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()。自动生成即可!

package cn.itcast_02;

/**
* @author Administrator
*
*/
public class Student {
private String name;
private int age; public Student() {
super();
} public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
System.out.println(this + "---" + obj);
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }

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

王祖贤---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. 网络硬盘NFS

    NFS是网络文件系统,用于计算机间共享文件系统,由sun公司1985年推出的协议,现在已经被广泛使用.一般来说,所有的linux发型版都支持NFS.nfs是一个服务器,客户端的架构,建立一个nfs的服 ...

  2. 解决nodejs中json序列化时Date类型为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 zhupengfei@DESKTOP-HJASOE3 MINGW64 /d/MyProject/exp2 $ node ...

  3. IE下iframe跨域session和cookie失效问题的解决方案

    http://blog.csdn.net/wauit/article/details/9875157

  4. Go 语言变量

    变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关键字: ...

  5. 给大家安利一个学习angular2的视频网站

    本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 视频地址: https://egghead.io/courses/angular-2-fundamen ...

  6. 使用DB查询分析器实现异构数据源中数据表的相互访问

    1  引言   硕士程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本<DB Query A ...

  7. 安卓高级8 SurfaceView (1)

    文章转载:http://www.cnblogs.com/xuling/archive/2011/06/06/android.html 首先我们先来看下官方API对SurfaceView的介绍 Surf ...

  8. Android自定义底部带有动画的Dialog

    Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...

  9. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52835829 前言:上篇中,&l ...

  10. apply函数用法

    procedure:  (apply proc arg1 ... args)  Proc must be a procedure and args must be a list. Calls proc ...