Object类的常用方法
Object类是Java中所有类的始祖。如果没有明确的指定继承,则默认继承Object类。在Java中除了基本类型外都是Object类型的对象,包括数组。
1)equals方法
Object:
public boolean equals(Object obj) {
return (this == obj);
}
在不重写此方法的情况下,默认比较两个对象是否指向同一对象。在实际开发中通常要重写此方法,根据属性来比较二者是否相等。
编写equals(Object other)方法的建议:
- 检测this和other是否引用同一个对象,若是,则显然两者相等,返回true。
- 检测other是否为null,若是,则返回false。
- 检测this和other的Class是否相同,若不是,则返回false。
- 根据this和other的属性是否都相同,若是,则返回true,否则,返回false。
Demo:
@Override
public boolean equals(Object obj) {
System.out.println(this);
if(this == obj){
return true;
}
if(obj == null){
return false;
}
if(this.getClass() != obj.getClass()){
return false;
}
//确认obj是Employee的非空对象
Employee other = (Employee) obj;
return Objects.equals(this.name,other.name) && this.salary == other.salary
&& Objects.equals(this.hireDay,other.hireDay);
}
这是String的equals():
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
由此可以看出字符串的equals方法是先检测二者引用,再检测二者字符串的长度,最后再逐字符比较得出结果。
2)hashCode方法:
hash code即散列码是由对象导出的一个整型值。每个对象都有个hash code,默认是该对象的存储地址。因此两个不同的对象,其hash code一般是不同的,除非重写此方法。
String的hashCode():
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
由此可以看出,只要String的值相同,即使不是同一个对象,其hash code也是相同的。
若想自己重写hashCode(),则可以考虑使用Objects.hash(Object ... object),此方法的参数是该类的属性,由此方法可以返回 一个散列码。
如果存在一个数组类型的域,可以使用Arrays.hashCode()返回散列码。
3)toString方法:
toString方法返回表示对象值得字符串。
Object的toString方法:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
显然,其返回值是类名+@+十六进制的hash code。
若重写toString(0方法,则大多数类都遵循这种格式:类名+一堆方括号括起来的域值。
Demo:
@Override
public String toString() {
return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
}
另外,当打印对象时,就是打印该对象toString()的返回值。而且,当对象与一个字符串通过“+”连接时,Java会自动的调用toString()。
补充:数组也是对象,但无法重写toString(),可以使用Arrays.toString()来打印数组。
Object类的常用方法的更多相关文章
- 【转载】JAVA基础复习与总结<三> Object类的常用方法
Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类.这里主要总结Object类中的三个常用方法:toString().equ ...
- Object类及其常用方法简介
https://www.cnblogs.com/wxywxy/p/6740277.html Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认 ...
- Object类和常用方法
Object类是java语言的根类,要么是一个类的直接父类,要么就是一个类的间接父类.所有对象(包括数组)都实现这个类的方法. 引用数据类型:类/接口/数组,引用数据类型又称之位对象类,所谓的数组变量 ...
- Eclipse的使用与Oblect类的常用方法_DAY11
一.Java开发工具的使用 A:notepad windows自带的记事本. B:高级记事本 Editplus Notepad++ UE sublime2 C:集成开发工具(IDE) 开发和运行. E ...
- Java 常用对象-Object类
2017-10-31 23:42:08 Object类:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 或者说,每个类都直接或者间 ...
- 菜鸡的Java笔记 Object 类
Object 类 Object类 的主要作用 Object 类的常用方法 内容 虽然有了对象的向上转型,可以解决了参数的统一问题,但是 ...
- 包和访问权限修饰符,.单例设计模式,.Object类常用方法,.内部类
1.包和访问权限修饰符 1.1 包 为什么要导包? 将字节码文件(.class)文件进行分类存放 --->包 其实就是文件夹 import java.util.Arrays; 包的划分规则 方案 ...
- AJPFX关于Java Object类常用方法小总结
java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...
- 写出java.lang.Object类的六个常用方法
java是面向对象的语言,而Object类是java中所有类的顶级父类(根类). 每个类都使用Object类作为超类,所有对象(包括数组)都实现这个类的方法,即使一个类没有用extends明确指出继承 ...
随机推荐
- oracle count(*) 和count(列)性能
一直以为oracle中count(列)比count(*) 快,这篇文件解释了一下: http://blog.csdn.net/szstephenzhou/article/details/8446481
- JavaSE---多线程---线程的生命周期
1.线程的生命周期:新建.就绪.运行.阻塞.死亡 2.运行状态线程进入阻塞: 1.1 调用sleep方法主动放弃: 1.2 调用线程的suspend方法将线程挂起,不推荐使用: 1.3 线程调用一个阻 ...
- jdk源码分析——java.lang.Boolean
1.Boolean类里面的2个静态变量. Boolean类,直接声明了2个静态变量,TRUE 和 FALSE,指向2个对象. public static final Boolean TRU ...
- 17965 幸运之星(优先做) 约瑟夫环问题O(n)
17965 幸运之星(优先做) 时间限制:100MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 每年新年派对的最后 ...
- 在PHP中使用全局变量的几种方法
简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的.一些常见的全局数据有:程序设定类.数据库连接类.用户资料等等.有很多方法能够使这些数据 ...
- Spring Boot实战(3) Spring高级话题
1. Spring Aware Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的.即你可以将你的容器替换成别的容器. 实际项目中,不可避免地会用到Spring容 ...
- IT方面书籍下载整理
最近翻看Redis相关的中文书籍时,发现了很多错误,包括翻译错误及理论错误,因此想搜集一些相关的外文书籍看看.以下几个链接,内容大同小异,均可免费下载相关的英文书籍PDF版,内容涵盖了IT的方方面面. ...
- OAuth2.0和企业内部统一登录,token验证方式,OAuth2.0的 Authorization code grant 和 Implicit grant区别
统一登录是个很多应用系统都要考虑的问题,多个项目的话最好前期进行统一设计,否则后面改造兼容很麻烦: cas认证的方式:新公司都是老项目,用的是cas认证的方式,比较重而且依赖较多,winform的项目 ...
- JS获取前一个页面
document.referrer 可以得到上一个点击超连接进来的页面URL注意:只能访问服务器上页面使用,打开本地文件无效(为空字符串)
- [转]C#利用委托跨线程更新UI数据
在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态.比较好的方式是用委托实现, ...