创建类构造函数时的.equals()&比较简单的字符串

时间:2016-12-13 03:20:29

标签: java equals

我在java&中的.equals()上创建了一个程序。当我在youtube上看到一些在线视频时遇到一些概念上的问题。搜索了这件事,但没有得到适当的解释。所以伙计们帮我做那件事。

感谢。

package Practice;

public class StringManipulation11 {

    StringManipulation11(String s) {
    }

    public static void main(String[] args) {

        String s = "Good";
        String s1 = "Good";
        String s2 = "Morning";

        String t = new String("Good");
        String t1 = new String("Good");
        String t2 = new String("Morning");

        StringManipulation11 sm = new StringManipulation11("Good");
        StringManipulation11 sm1 = new StringManipulation11("Good");

        System.out.println(s.equals(s1));// true because check content
        System.out.println(s.equals(s2));// false content not match

        System.out.println(t.equals(t1));// true because check content
        System.out.println(s.equals(t));// true because check content

        System.out.println(sm.equals(sm1));// false, but not getting the reason
                                            // why it is false

        /*
         * In this case also the content is same but not getting the proper
         * conclusion why it is false & it is false then why i am getting true
         * in "System.out.println(t.equals(t1))" in this condtion.
         */

        System.out.println(s.equals(sm));

    }
}

4 个答案:

答案 0 :(得分:4)

  

在这种情况下,内容也相同,但没有得到正确的结论,为什么它是假的&这是错误的,为什么我在这种情况下在System.out.println(t.equals(t1))得到真实。

String具有equals(和hashcode)的实现,它逐个字符地比较两个对象。你的类没有这些方法的实现,所以它使用它继承自Object的实现,它比较了引用,即它是真的,实例需要是相同的

这是一个重要的区别,让你的头脑,相同的意味着这两个引用指向完全相同的实例。而等于意味着它们相同或具有相同的内容,但您可以自行决定如何比较内容,请参阅this

答案 1 :(得分:0)

StringManipulation11是扩展对象,如果你没有覆盖equals method默认方法是

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

你可以比较String

中的equals方法
public boolean equals(Object var1) {
        if(this == var1) {
            return true;
        } else {
            if(var1 instanceof String) {
                String var2 = (String)var1;
                int var3 = this.value.length;
                if(var3 == var2.value.length) {
                    char[] var4 = this.value;
                    char[] var5 = var2.value;

                    for(int var6 = 0; var3-- != 0; ++var6) {
                        if(var4[var6] != var5[var6]) {
                            return false;
                        }
                    }

                    return true;
                }
            }

            return false;
        }
    }

答案 2 :(得分:0)

这是String类(Java 8)中equals方法的定义:

public boolean equals(Object anObject)
Compares this string to the specified object. The result is true if and only
if the argument is not null and is a String object that represents the same
sequence of characters as this object.

这意味着当且仅当两个字符串表示相同的字符序列时,此方法才返回true。

在您的情况下,您已定义了一个新类StringManipulation11,默认情况下使用equals类的Object方法。这就是它的定义:

The equals method for class Object implements the most discriminating
possible equivalence relation on objects; that is, for any non-null 
reference values x and y, this method returns true if and only if x and y 
refer to the same object (x == y has the value true).

在您的示例中,您定义了两个不同的对象smsm1。这些变量引用了DIFFERENT对象,这就是equals方法返回false的原因。

答案 3 :(得分:0)

如果要在自己编写的类中检查与loop(list1, list2, i -> i < Math.min(a.size(), b.size()), (e1, e2) -> { doStuff(e1); doStuff(e2); }); 方法的相等性,则必须覆盖Object类的equals()方法。equals()的默认实现继承自{{1}当且仅当两个变量指向同一个对象时才返回true。在你的情况下,sm和sm1对象包含相同的信息,但它们是内存中的不同对象。这就是它返回false的原因。