java 通用对象_java中对所有对象都通用的方法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
覆盖equals时请遵守通用约定
我们知道equals要实现的是逻辑上的相等。站在数学的角度来看,两个事物相等的条件,有如下几个:
1.自反性:对于任何非null的引用值x,x.equals(x)必须返回true.
2.对称性:对于非空的引用值x,y,当且仅当x.equals(y)返回true时,y.equals(x)必须返回true.
3.传递性:对于任何非null的引用值x,y,z,如果x.equals(y)=true,y.equals(z)=true,那么x.equals(z)也必须返回true。
4.一致性:对于任何非null的引用值x,y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或一致地返回false.
5.对于非null的引用值x,x.equals(null)必须返回false.
2
覆盖equals时总要覆盖hashCode
我们来看下面的例子:
public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
public PhoneNumber(int areaCode, int prefix, int lineNumber) {
rangeCheck(areaCode, 999, "area code");
rangeCheck(prefix, 999, "prefix");
rangeCheck(lineNumber, 9999, "line numb er");
this.areaCode = (short)areaCode;
this.prefix = (short)prefix;
this.lineNumber = (short)lineNumber;
}
private static void rangeCheck(int arg, int ma x, String name) {
if (arg < 0 || arg > max) {
throw new IllegalArgumentException(na me + ": " + arg);
}
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof PhoneNumber)) {
return false;
}
PhoneNumber pNumber = (PhoneNumber) o;
return (pNumber.lineNumber == lineNumb er) && (pNumber.prefix == prefix) && (p Number.areaCode == areaCode);
}
}
测试代码:
public static void hashCodePhoneNumber() {
Map map = new H ashMap();
PhoneNumber phoneNumber = new Phon eNumber(707, 867, 9876);
map.put(phoneNumber, "Jenny");
System.out.println(map.get(new PhoneNu mber(707, 867, 9876)));
System.out.println(map.get(phoneNumbe r));
}
输出的结果:
null
Jenny
我们可以这样来理解上面的map.put()。如果我们不去覆盖hashCode,那么当我们使用map.put时,我们是把这些PhoneNumber对象放在各个不同的盒子里,而我们去map.get()的时候,只是去某一个盒子里去找(当然,如果map.get()和map.put()中的对象是同一个的话,当然可以找到)。
而如果我们覆盖了hashCode方法,这时,如果通过hashCode计算出来的值是相等的,就会放在同一个盒子里。这样,只要我们对象中保存的值是完全一致的,就会找到这个key所对应的value。不知道你发现没有,这个hashCode有点类似于分类,这样在数据量比较大的情况下就会大大提高效率。
我们可以通过以下两种方法来覆盖hashCode方法:
方法一
@Override
public int hashCode() {
return 42;
}
方法二
@Override
public int hashCode() {
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}
首先两种方法都可以。通过上面的分析,从效率的角度来考虑,当然是第二种方法更为恰当。所以在覆盖了equlas的同时,别忘了去覆盖hashCode.
3
始终覆盖toString方法
如果我们不去覆盖类的toString()方法,后果就是当我们需要去打印这个类的对象时,会有一些并非是我们想要的那种。类似这样的:com.java.effective.samples.PhoneNumber@12a7e3
有时我们不希望打印出这样的对象,那我们就要去覆盖它们的toString方法了。在这个方法里,我们可以按照我们自己的意愿来给类添加toString方法。对于PhoneNumber,我们可以这样来写:
@Override
public String toString() {
String result = "";
result += (areaCode + "-");
result += (prefix + "-");
result += (lineNumber);
return result;
}
理博软件,高薪就业的摇篮
java 通用对象_java中对所有对象都通用的方法相关推荐
- java如果把字符串转成对象_Java中的重复对象:不仅仅是字符串
当Java应用程序消耗大量内存时,它本身就会出现问题,并可能导致GC压力增加和GC暂停时间过长.在我之前的一篇文章中,我讨论了Java中常见的内存浪费源:重复字符串.两个 java.lang.Stri ...
- java 组合对象_Java 中组合模型之对象结构模式的详解
Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 ...
- java堆栈异常_Java中获得异常堆栈使用轨迹的方法是。
Java中获得异常堆栈使用轨迹的方法是. 答:fillinStack() 中国大学MOOC: 互联网金融品牌建设能增加客户对企业的依赖度,促使客户重复使用某个企业产品或服务,从而产生一定的客户黏性 答 ...
- java 当月最后一天_java中取得当月最后一天的四种方法
java中取得当月最后一天的四种方法 第一种,使用Calendar的roll方法,在限制某个日期字段不改变的形式下,改变其他日期字段的值. 第二种,使用Calendar的getActualMaximu ...
- java取子串_Java中获取子字符串的几种方法示例
首先假如有这样一串字符串: String s = "共 100 页, 1 2 3 4..."; 假如我想把"100"给取出来,该如何做? 方法一: 采用spli ...
- java中的map对象_java中遍历Map对象的四种方式
import java.util.HashMap; import java.util.Map; /** * 遍历Map对象 * @author xiaosongsong: * @CreateTime ...
- java 数组排序论文_Java中运用数组的四种排序方法
标签: <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; 2 public class Test2{ public static void m ...
- java properties用法_java中Properties文件加载和使用方法
一.Properties简介 Properties 类继承自HashTable,提供的方法很像Map的实现类HashMap.它在 Java 编程的早期就有了,并且几乎没有什么变化.J2SE 的 Tig ...
- java设置行间距_Java中调整字距与行距的方法 其一(以DrawString为例)
今天要谈的是如何在Java中调整字距与行距,当然,这里谈的主要是针对swing与awt里的字距与行距. 调整字距与行距看起来似乎是个很简单的问题,大概可以直接调用某个内置的方法来操作,紫雾我最开始也是 ...
最新文章
- java与c/c++之间的数据交互-----jni点滴
- Xcode调用栈时小图标代表什么意思
- 电机控制应用中的电磁兼容性设计与测试标准
- luogu cover
- 厉害了!一文看懂各大互联网支付系统整体架构
- rtmp服务器与播放器的交互
- matplotlib(六)三维作图
- 机器成为家人!华为发布2025十大趋势展望...
- java中printreader类_Java基本字符流输入输出类的使用
- 2021年 RSA 大会:产品发布概览(第1天)
- 服务质量--成功的关键因素!
- 1到100的偶数之和是多少_什么白酒适合收藏,收藏多久出手,茅台五粮液老酒价格是多少?...
- e2e_cli遇坑记录
- vs如何运行外部 C++ 文件
- 渗透神器----Windows10 渗透工具包
- 全志平台BSP裁剪(2)附件一 General setup配置说明
- 浅谈cookie中的SameSite属性
- chrome 浏览器升级后接口无法正常访问
- 删除文件显示正在使用无法删除该怎么办?
- 让div填满剩下的空间
热门文章
- (转)使用CGLIB实现AOP功能与AOP概念解释
- BZOJ2646 : neerc2011 flight
- 第一次执行时没有问题,重复执行会出错、GP循环
- 从浏览器中下载文件如何修改默认保存位置
- emr系统 php,完整电子病历系统c#源码
- windows apche php mysql zend_Windows XP上安装配置 Apache+PHP+Mysql+Zend
- c语言结构体 单科成绩排序,【查错】怎样让结构体其他信息(姓名)对应关键值(成绩)排序输出...
- python的数据库应用,Python数据库应用
- 信息学奥赛一本通 1965:【14NOIP普及组】珠心算测验 | 洛谷 P2141 [NOIP2014 普及组] 珠心算测验
- 信息学奥赛一本通(1239:统计数字)