Object类是Java中所有类的始祖。如果没有明确的指定继承,则默认继承Object类。在Java中除了基本类型外都是Object类型的对象,包括数组。

1)equals方法 

Object:

 public boolean equals(Object obj) {
        return (this == obj);
    }

在不重写此方法的情况下,默认比较两个对象是否指向同一对象。在实际开发中通常要重写此方法,根据属性来比较二者是否相等。

编写equals(Object other)方法的建议:

  1.  检测this和other是否引用同一个对象,若是,则显然两者相等,返回true。
  2.  检测other是否为null,若是,则返回false。
  3.  检测this和other的Class是否相同,若不是,则返回false。
  4.  根据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类的常用方法的更多相关文章

  1. 【转载】JAVA基础复习与总结<三> Object类的常用方法

    Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类.这里主要总结Object类中的三个常用方法:toString().equ ...

  2. Object类及其常用方法简介

    https://www.cnblogs.com/wxywxy/p/6740277.html Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认 ...

  3. Object类和常用方法

    Object类是java语言的根类,要么是一个类的直接父类,要么就是一个类的间接父类.所有对象(包括数组)都实现这个类的方法. 引用数据类型:类/接口/数组,引用数据类型又称之位对象类,所谓的数组变量 ...

  4. Eclipse的使用与Oblect类的常用方法_DAY11

    一.Java开发工具的使用 A:notepad windows自带的记事本. B:高级记事本 Editplus Notepad++ UE sublime2 C:集成开发工具(IDE) 开发和运行. E ...

  5. Java 常用对象-Object类

    2017-10-31 23:42:08 Object类:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 或者说,每个类都直接或者间 ...

  6. 菜鸡的Java笔记 Object 类

    Object 类        Object类 的主要作用        Object 类的常用方法             内容        虽然有了对象的向上转型,可以解决了参数的统一问题,但是 ...

  7. 包和访问权限修饰符,.单例设计模式,.Object类常用方法,.内部类

    1.包和访问权限修饰符 1.1 包 为什么要导包? 将字节码文件(.class)文件进行分类存放 --->包 其实就是文件夹 import java.util.Arrays; 包的划分规则 方案 ...

  8. AJPFX关于Java Object类常用方法小总结

    java.lang.Object   java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...

  9. 写出java.lang.Object类的六个常用方法

    java是面向对象的语言,而Object类是java中所有类的顶级父类(根类). 每个类都使用Object类作为超类,所有对象(包括数组)都实现这个类的方法,即使一个类没有用extends明确指出继承 ...

随机推荐

  1. requirej入门(二)

    requirejs中的一些基本知识,包括API使用方式等. 基本API require会定义三个变量:define,require,requirejs,其中require === requirejs, ...

  2. socket阻塞与非阻塞情况下的recv、send、read、write返回值 以及epool_wait返回值学习

    https://www.cnblogs.com/longingforlife/p/3289976.html

  3. visual stdio使用

    现在转换使用visual stdio,因为很多和以前的快捷键不同,也不打算换了,这样可移动性应该更好吧. 1.注释代码, 首先按下ctrl + k,然后再按下ctrl + c 2.取消注释,首先按下c ...

  4. 3n+1猜想

    1001. 害死人不偿命的(3n+1)猜想 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Ca ...

  5. Mongodb~连接串的整理

    mongodb连接串可以分为普通开放的,带全局用户名和密码的,为指定数据库指定用户名密码的等. 普通开放连接 mongodb://localhost:27017 带全局用户密码的 mongodb:// ...

  6. linux下Python2.7编译安装PyQt5

    ---作者吴疆,未经允许,严禁转载,违权必究--- ---欢迎指正,需要源码和文件可站内私信联系--- -----------点击此处链接至博客园原文----------- 功能说明:在ubuntu系 ...

  7. 错误处理(Operation Result)方法

    自己开发的公众号,可以领取淘宝内部优惠券 问题 现在有一个FileStorageService类,继承自IStorageService,具体实现如下 public interface IStorage ...

  8. 使用Zxing生成一维码和二维码

    首先引用zxing.dll 到项目中引用 using System; using System.Collections.Generic; using System.Drawing; using Sys ...

  9. 批量删除QQ空间说说

    第一步:用电脑打开浏览器登录你的QQ空间 第二步:点击你的说说栏目 第三步:按下电脑的F12键或者点击右上角的菜单一栏,点击开发者工具 第四步:看到右半边屏幕,找到一个叫Console的菜单,并且点击 ...

  10. windows常用命令行总结

    cmd下的命令行 1.查看当前目录下的子目录 dir   或 dir /b 类似Linux 下的  ls 或者 ls -l 2.盘符切换  d: 3.进入目录 cd [目录名] 退一个目录 cd .. ...