「JavaSE 重新出发」05.01.02 hashCode 方法、toString 方法
hashCode 方法
- 散列码(hash code)是由对象导出的一个整形值(可以是负数)。其是没有规律的,如果x与y是两个不同的对象,则x.hashCode()与y.hashCode()基本上不会相同。
- hashCode 方法定义在 Object 类中,因此每个对象都有一个默认的散列码方法,其返回结果是对象的存储地址。
一个例子:
```java
String string1 = "hiwangzi";
StringBuilder stringBuilder1 = new StringBuilder(string1);
System.out.println(string1.hashCode() + " " + stringBuilder1.hashCode());String string2 = new String("hiwangzi");
StringBuilder stringBuilder2 = new StringBuilder(string2);
System.out.println(string2.hashCode() + " " + stringBuilder2.hashCode());
输出结果:
-1232882509 1975012498
-1232882509 1808253012
```
可以看到,String对象的散列码是相同的,这是因为字符串的散列码是由内容导出的;而StringBuffer对象散列码不同,这是因为StringBuffer类没有定义hashCode()方法,它的散列码是由默认的Object类的默认hashCode()方法导出的对象存储地址。- 如果重新定义 equals 方法,就必须重新定义 hashCode 方法,以便于可以将对象插入到散列表中。
- 可以调用 Objects.hash 方法并提供多个参数得到散列码(这种做法比较好):
java public int hashCode(){ return Objects.hash(name, salary, hireDay); }
equals 与 hashCode 定义必须一致,即 x.equals(y) 与 x.hashCode() == y.hashCode() 结果一致。
toString 方法
- 绝大多数的 toString 方法都遵循这样的格式:类的名字,随后一对方括号括起来的域值。
java public String toString(){ return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; }
「JavaSE 重新出发」05.01.02 hashCode 方法、toString 方法的更多相关文章
- 「JavaSE 重新出发」05.03.02 在运行时使用反射分析对象
在编写程序时,如果知道想要查看的域名和类型,查看指定的域是一个很容易的事,而利用反射机制可以查看在编译时还不清楚的对象域. java Employee tank = new Employee(&quo ...
- 「JavaSE 重新出发」05.01.01 equals 方法
equals 方法示例 // 代码来自<Java核心技术 卷I>P167 // 父类 public class Employee{ ... public boolean equals(Ob ...
- 「JavaSE 重新出发」05.01 继承
继承 一个对象变量可以指示多种实际类型的现象被称为多态(polymorphism). 在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding). 如果是private方法 ...
- 「JavaSE 重新出发」05.02 泛型数组列表、包装类
泛型数组列表 ArrayList 是一个采用类型参数(type parameter)的泛型类(generic class). java ArrayList<Employee> staff ...
- 「JavaSE 重新出发」05.03.01 利用反射分析类
在 java.lang.reflect 包中有三个类 Field, Method 和 Constructor 分别用于描述类的域.方法和构造器. Class 类中的 getFields, getMet ...
- 「JavaSE 重新出发」05.03.03 使用反射编写泛型数组代码
Employee[] a = new Employee[100]; // ... // array is full a = Arrays.copyOf(a, 2 * a.length); 如何编写这样 ...
- 「JavaSE 重新出发」05.03 反射
能够分析类能力的程序称为反射(reflection). 反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵 Java 代码的程序. 反射机制可以用 ...
- 「JavaSE 重新出发」02.01 基本数据类型
基本数据类型 1. 整型 注意:Java 没有任何无符号(unsigned)形式的 int.long.short 或 byte 类型. 不同进制的表示形式: 十六进制数值有一个前缀0x或0X(如0xC ...
- 「JavaSE 重新出发」02. 数据类型与运算符
「TOC」 Java 程序基本要求 Java 数据类型 基本数据类型 复合数据类型 运算符 逻辑运算符 位运算符 运算符优先级 Java 程序基本要求 public class : 一个 Java 文 ...
随机推荐
- 01--vim常用快捷键
Linux中vim编辑器的功能非常强大,许多常用快捷键用起来非常方便,这里将我学vim入门时学的一些常用的快捷键分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉 ...
- CSS text-transform 属性 控制控制文本的大小写
值 描述 none 默认.定义带有小写字母和大写字母的标准的文本. capitalize 文本中的每个单词以大写字母开头. uppercase 定义仅有大写字母. lowercase 定义无大写字母, ...
- vc++如何创建程序-构造函数02
1.若忘记了赋值,出现运行结果是很大的负值(因为我们定义的x与y这两个成员变量存储在内存中是一个随机的值) 当我们调用时,随机输出. //包含输入输出的头文件#include<iostream. ...
- Shoot the Bullet ZOJ - 3229有上下界网络流
Code: #include<cstdio> #include<algorithm> #include<vector> #include<queue> ...
- 路飞学城Python-Day171
Evernote Export 线性结构: python的列表操作 列表是如何存储的:顺序存储的,是一块连续的内存,内存是一堆格子,列表是一串连续的编号 32位机器上一个整数占4个字节 数组和列表有2 ...
- jmeter出现乱码怎么解决
本文是抄袭安大叔的性能 如果想在性能获得更好的发展 请添加公众号:测试那点事 大叔的群号:435092293 大叔曾经担任百度技术总监 很牛逼 相信大叔知道了不会怪我 毕竟我是你的学 ...
- NTP学习路线
NTP了解路线 基础 ntp配置中的tinker参数? ntp的同步方式slew step的区别? restrict含义?restrict -6 default ignore含义? fudge 127 ...
- [USACO4.2] 草地排水 Drainage Ditches (最大流)
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...
- 用于检测进程的shell脚本
用于检测进程的shell脚本 2010-07-07 10:38:08| 分类: Centos |字号 订阅 脚本一: #!/bin/sh program=XXXX #进程名 sn=`ps - ...
- buntu Rhythmbox解决中文乱码
Ubuntu Rhythmbox解决中文乱码 在这里介绍的是一个解决方法,修改变量. 在终端输入: gedit ~/.profile 在最后加入下面内容: exportGST_ID3_TAG_ENCO ...