• JAVA之equals方法与tostring方法


     equals本意:

    即在Object对象中定义的equals()方法有什么样的意义。

    equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。

    Object类中的equals方法内部使用的就是==比较运算符。

    在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。

    如下代码演示:

     1 public class Person {
     2     private String name;
     3     private int age;
     4     Person(){
     5         
     6     }
     7     Person(String name,int age){
     8         this.name=name;
     9         this.age=age;
    10     }
    11 
    12     public boolean equals(Object obj) {//Object obj=new Person();
    13         //调用子类都有的成员,需要向下转型
    14         if(obj==null){
    15             return false;
    16         }
    17         if(obj==this){
    18             return true;
    19         }
    20         if(obj instanceof Person ){
    21             Person p=(Person)obj;
    22             return this.age==p.age;
    23         }
    24         return false;
    25     }

    注意:

    在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型,

    在调用对象的属性时,一定要进行类型转换,在转换之前必须进行类型判断。

    toString方法

    toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值

     1 public class Demo01 {
     2 
     3     public static void main(String[] args) {
     4         Person p1=new Person("熊大",2);
     5         Person p2=new Person("熊二",2);
     6         ArrayList<String> list=new ArrayList<String>();
     7         System.out.println(p1==p2);
     8         System.out.println(p1.equals(list));
     9         System.out.println(p1);//默认打印tostring()   子类方法重写后  就变成子类重写方法
    10         System.out.println(p2);
    11     }

     String类

    创建的相同String数组地址是一样的,在运行str时已经存在abc字符串数组,

    所以运行str2的时候会先去找这个数组存不存在,如果已经有了则他的地址直接拿过来用

    所以str与str2的地址与内容都是一样的

    1     public static void main(String[] args) {
    2         String str="abc";
    3         //str="efg";
    4         //String str1=new String("abc");
    5         String str2="abc";
    6         System.out.println(str==str2);
    7         System.out.println(str.equals(str2));
    8     }

    图解:

    当运行str的时候,在堆里分配一个数组地址,分为三块,这个地址给到str,

    在运行str1的时候,也分配一个地址,因为内容一样 所以str的地址直接给到str1,

    所以str与str1比较的时候,他们地址不一样而内容是一样的

    1 public static void main(String[] args) {
    2         String str="abc";
    3         //str="efg";
    4         String str1=new String("abc");
    5         //String str2="abc";
    6         System.out.println(str==str1);
    7         System.out.println(str.equals(str1));
    8     }

    图解:

    插一段string的构造方法

    1     public static void main(String[] args) {
    2         //字节数组走的是GBK编码表(正数走ascII表,负数就是汉字(两个字节一个汉字))
    3         byte[] bytes={97,98,99,100};
    4         String str=new String(bytes);
    5         String str2=new String(bytes,1,2);
    6         System.out.println(str2);
    7         System.out.println(str);//abcd
    8     }

    下面是详细ascII码表:

    48—0,65—A,97—a

  • 相关阅读:
    【C++札记】友元
    【C++札记】const关键字
    【C++札记】实现C++的string类
    【C++札记】拷贝构造函数,浅拷贝和深拷贝
    【C++札记】内联函数
    【C++札记】函数重载
    文章博客导航
    【C++札记】标准输入与输出
    毕业季,学子们又把翟天临推上了热搜!
    【底层原理】高级开发必须懂的"字节对齐"
  • 原文地址:https://www.cnblogs.com/2734156755z/p/9381090.html
Copyright © 2020-2023  润新知