欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于String重写的equals方法

程序员文章站 2022-04-15 23:44:05
...

想了想自己也想尝试写写博客,分享自己作为初学者的一些学习心得,才刚刚学习没几天,闲谈而已,请大佬多多指教,第一:关于String重写的equals方法;

1.String 类为啥要重写equals方法;
首先,任何类的父类都是object类,所以String类也是继承了object类。那么为啥String要重写equals方法呢;
首先我们看看object类里面的equals方法.

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

然后我们在看看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;
    }

可以看到object类里面的equals只使用了 == 作为判断,而String类里面先是if (this == anObject) 作为判断,如果不为true再继续把String类型转换成char数组,依次遍历进行逐个字节的比对。那么为什么要这么做呢?
我们先看看以下代码:

		String str1 = "小红";//此处小红为常量,存放于常量池中
		String str2 = "小红";//此处小红为常量,同样存放于常量池中
		String str3 = new String("小红");
		String str4 = new String("小红");
		
		System.out.println(str1 == str2);//true
		System.out.println(str2 == str3);//false
		System.out.println(str3 == str4);//false
		System.out.println(str3.equals(str2));//true
		System.out.println(str2.equals(str3));//true
		System.out.println(str3.equals(str4));//true

接下来再看java的一个我自己画的内存图
关于String重写的equals方法
通过图片可以看到,每个对象都是在堆里面独自开辟一个空间,并且类的每个对象独享一份类的属性;然后再把对象的地址赋值给引用,也就是图片中箭头所指。
而我们常用的“==”就是对地址进行比较,所以才会出现
System.out.println(str1 == str2);//true
System.out.println(str2 == str3);//false
System.out.println(str3 == str4);//false
而我们需要比较的两个的值是否相同,所以String类就重写了equals方法,也就是上边我们看到的首先比较地址是都相同,相同就返回true,不同就把值取出转换成char[],逐个字节进行比较。
值得一提的是,当我们写实体类也要重写equals方法,就是为了我们在进行比较时,避免出现相同情况。

以上为自己的一些理解,如有错误之处,请各位大佬多多指教;

相关标签: equals