首页 > 其他分享 >Object 类详解

Object 类详解

时间:2022-09-23 22:55:42浏览次数:51  
标签:name Object equals System 详解 println public String

1.equals 方法

==和 equals 的对比 [面试题]

​ ==是一个比较运算符

  1. ==:既可以判断基本类型,又可以判断引用类型
  2. ==:如果判断基本类型,判断的是值是否相等。 示例: int i=10; double d=10.0;这两个示例相等
  3. ==∶如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
  4. equals:是Object类中的方法,只能判断引用类型;
  5. 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如lnteger,String【看看String和 Integer的equals源代码】
public class Equals01 {

    public static void main(String[] args) {
        A a = new A();
        A b = a;
        A c = b;
        System.out.println(a == c);//true
        System.out.println(b == c);//true
        B bObj = a;
        System.out.println(bObj == c);//true
        int num1 = 10;
        double num2 = 10.0;
        System.out.println(num1 == num2);//基本数据类型,判断值是否相等

        //equals 方法,源码怎么查看.
        //把光标放在equals方法,直接输入ctrl+b
        //如果你使用不了. 自己配置. 即可使用.

        /*
        //带大家看看Jdk的源码 String类的 equals方法
        //把Object的equals方法重写了,变成了比较两个字符串值是否相同
        public boolean equals(Object anObject) {
        if (this == anObject) {//如果是同一个对象
            return true;//返回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;//如果两个字符串的所有字符都相等,则返回true
            }
        }
        return false;//如果比较的不是字符串,则直接返回false
    }
         */


        "hello".equals("abc");

        //看看Object类的 equals 是
        /*
        //即Object 的equals 方法默认就是比较对象地址是否相同
        //也就是判断两个对象是不是同一个对象.
         public boolean equals(Object obj) {
            return (this == obj);
        }
         */


        /*
        //从源码可以看到 Integer 也重写了Object的equals方法,
        //变成了判断两个值是否相同
        public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }
         */
        Integer integer1 = new Integer(1000);
        Integer integer2 = new Integer(1000);
        System.out.println(integer1 == integer2);//false
        System.out.println(integer1.equals(integer2));//true

        String str1 = new String("yt");
        String str2 = new String("yt");
        System.out.println(str1 == str2);//false
        System.out.println(str1.equals(str2));//true




    }
}

class B {}
class A extends B {}

2.应用实例-如何重写 equals 方法

应用实例: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。

public class EqualsExercise1 {
    public static void main(String[] args) {
        Person person = new Person("xiao",12,'m');
        Person person1 = new Person("xiao",12,'w');
        System.out.println(person.equals(person1));

    }
}
//判断两个Person对象的内容是否相等,
//如果两个Person对象的各个属性值都一样,则返回true,反之false
class Person {
    private String name;
    private int age;
    private char gender;

    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    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;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    //重写Object 的 equals方法
    public boolean equals(Object obj) {
        //判断如果比较的两个对象是同一个对象,则直接返回true
        if(this == obj) {
            return true;
        }
        //类型判断
        if(obj instanceof Person) {//是Person,我们才比较

            //进行 向下转型, 因为我需要得到obj的 各个属性
            Person p = (Person)obj;
            return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
        }
        //如果不是Person ,则直接返回false
        return false;

    }
    
//    public boolean equals(Person person){
//        if (person instanceof Person){
//            if (person.name == this.name && person.age == this.age
//                    && person.gender == this.gender){
//                return true;
//            }
//        }
//        return false;
//    }

}

3.hashCode 方法

1663942069103

5个小结:

  1. 提高具有哈希结构的容器的效率!

  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

  3. 两个引用,如果指向的是不同对象,则哈希值是不一样的

  4. 哈希值主要根据地址号来的! 不能完全将哈希值等价于地址。

5)后面在集合中 hashCode 如果需要的话,也会重写

public class HashCode_ {
    public static void main(String[] args) {

        AA aa = new AA();
        AA aa2 = new AA();
        AA aa3 = aa;
        System.out.println("aa.hashCode()=" + aa.hashCode());
        System.out.println("aa2.hashCode()=" + aa2.hashCode());
        System.out.println("aa3.hashCode()=" + aa3.hashCode());


    }
}
class AA {}

运行结果:

1663942323333

4.toString 方法

  1. 基本介绍

默认返回:全类名+@+哈希值的十六进制,【查看 Object 的 toString 方法】

1663942665847

子类往往重写 toString 方法,用于返回对象的属性信息

  1. 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式.

  2. 当直接输出一个对象时,toString 方法会被默认的调用, 比如 System.out.println(monster); 就会默认调用monster.toString()

public class ToString_ {
    public static void main(String[] args) {


        /*
        Object的toString() 源码
        (1)getClass().getName() 类的全类名(包名+类名 )
        (2)Integer.toHexString(hashCode()) 将对象的hashCode值转成16进制字符串
        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
         */

        Monster monster = new Monster("小妖怪", "巡山的", 1000);
        System.out.println(monster.toString() + " hashcode=" + monster.hashCode());

        System.out.println("==当直接输出一个对象时,toString 方法会被默认的调用==");
        System.out.println(monster); //等价 monster.toString()



    }
}

class Monster {
    private String name;
    private String job;
    private double sal;

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    //重写toString方法, 输出对象的属性
    //使用快捷键即可 alt+insert -> toString
    @Override
    public String toString() { //重写后,一般是把对象的属性值输出,当然程序员也可以自己定制
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("fin..");
    }
}

5.finalize 方法

  1. 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作;

  2. 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize 方法。

  3. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测试:Car [name]

注意:我们在实际开发中,几乎不会运用 finalize , 所以更多就是为了应付面试.

//演示 Finalize的用法
public class Finalize_ {
    public static void main(String[] args) {

        Car bmw = new Car("宝马");
        //这时 car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象, 在销毁对象前,会调用该对象的finalize方法
        //,程序员就可以在 finalize中,写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开文件..)
        //,如果程序员不重写 finalize,那么就会调用 Object类的 finalize, 即默认处理
        //,如果程序员重写了finalize, 就可以实现自己的逻辑
        bmw = null;
        System.gc();//主动调用垃圾回收器

        System.out.println("程序退出了....");
    }
}
class Car {
    private String name;
    //属性, 资源。。
    public Car(String name) {
        this.name = name;
    }
    //重写finalize
    @Override
    protected void finalize() throws Throwable {
        System.out.println("我们销毁 汽车" + name );
        System.out.println("释放了某些资源...");

    }
}

标签:name,Object,equals,System,详解,println,public,String
From: https://www.cnblogs.com/y-tao/p/16724596.html

相关文章

  • 基于SX1278/SX1276芯片的LoRa技术知识详解
    载波频率:载波频率就是没有调制数据的纯射频信号,用来载送信号的频率,在这个频率的基础上进行移频键控的调制输出无线信号,通常说发射频率就是指载波频率。lora扩频因子:扩频......
  • Oracle中使用游标详解
    一、使用游标对于DML语句和单行selectinto,oracle自动分配隐形游标。处理select返回多行语句,可以使用显式游标。使用显示游标处理多行数据,也可使用SELECT..BULKCOLLE......
  • 计算机基础详解
    计算机基础详解一、计算机五大组成部分详解1.控制器控制计算机各个硬件的工作。#类似于人的大脑2.运算器负责数学运算和逻辑运算,是整个计算机的核心所在。#类似......
  • Loadrunner参数化详解
    1、为什么要进行参数化滥大街的说法:为了更加真实的模拟真实场景正确说法:●数据库或应用程序需对值进行了唯一性校验;●避免缓存造成的性能测......
  • java常用类:Object类
    Object类超类、基类,所有类的直接或间接父类任何类,如果没有书写extends显示继承某个类,都默认继承Object类,否则为间接继承Object类中所定义的方法,是所有对象都具备......
  • 003_Readiness gates详解
    一、使用kubectlgetpods-owide可以看到有一列字段为"READINESSGATES"详解如下:FEATURESTATE: Kubernetesv1.14[stable]Yourapplicationcaninjectextrafe......
  • C# String和StringBuilder的区别及性能详解
    String在C#中其实是不可变的,每次操作字符串变量增加或减少时,都会重新分配内存。试想一下,如果创建一个循环10000次的字符串加减操作,每次循环都将一个字符连接到字符串,这样内......
  • Object.keys的‘诡异’特性,你值得收藏!
    先从‘诡异’的问题入手例1:纯Number类型的属性constobj={1:1,6:6,3:3,2:2}console.log('keys',Object.keys(obj))//['1','2','3','6']......
  • JS数据类型 之 Symbol详解
    1、Symbol概述ES6引入的一种新的原始数据类型Symbol,表示独一无二的值。它属于JavaScript语言的原生数据类型之一,其他数据类型是:undefined、null、Boolean、String、Numb......
  • JS 使用sessionStorage存取对象时显示[object object]的解决
    使用sessionStorage进行数据存取,如果数据是对象,则提取时为[objectobject],基于此问题,解决方法如下: 保存数据时window.sessionStorage.setItem("key",JSON.stringify(v......