Java在比较字符串的时候,equals 与== 完全一样呀?
阿神
阿神 2017-04-17 17:36:04
0
9
461

完全一样,比较字符串equals与== 完全没有区别吗?

阿神
阿神

闭关修行中......

membalas semua(9)
Ty80
        String a1="a";
        String a2="a";
        String b1=new String("b");
        String b2=new String("b");
        System.out.println(a1 == a2);
        System.out.println(a1.equals(a2));
        System.out.println(b1 == b2);
        System.out.println(b1.equals(b2));

Keputusan:

true
true
false
true

== membandingkan sama ada pembolehubah yang ditunjuk kepada objek adalah konsisten Sebab mengapa s dan s2 adalah sama adalah kerana jvm mengoptimumkan dan dua pembolehubah menghala ke satu objek.
equal membandingkan sama ada rentetan yang disimpan dalam objek adalah sama.

刘奇

Sesetengah soalan sebenarnya mempunyai jawapan terbaik dalam kod sumber

public boolean equals(Object anObject) {
    //如果引用的是同一个对象,返回真
    if (this == anObject) {
        return true;
    }
    //如果不是String类型的数据,返回假
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        //如果char数组长度不相等,返回假
        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;
刘奇

Operator

== menguji sama ada dua rujukan menghala ke objek yang sama. Jika anda ingin menguji sama ada dua objek berbeza adalah sama, anda mesti menggunakan kaedah equals().

Jika anda berminat untuk mengetahui lebih lanjut, anda boleh membaca artikel yang saya tulis. Panduan Literasi Pantas Java

迷茫

Saya rasa soalan anda sangat bermasalah Bagaimana anda mendapat kesimpulan yang diterangkan dalam teks daripada kod yang anda siarkan?
Saya akan membuat tekaan kasar tentang niat anda dan cuba menjawabnya dengan berat hati.
Di java, kaedah == dan sama adalah berbeza, penerangan ringkas adalah seperti berikut:

  1. ==

    == digunakan untuk menentukan sama ada dua rujukan menghala ke objek yang sama, seperti
    Objek a = new Object();
    Objek b = a;
    a == b; =&gt ; benar

  2. sama

    Kaedah sama digunakan untuk menentukan sama ada dua objek adalah sama. Kaedah ini telah ditakrifkan dalam Objek kelas peringkat atas Pelaksanaan kaedah ini dalam Object menggunakan == untuk membandingkan rujukan untuk kesaksamaan. Jika mana-mana subkelas ingin menggunakan kaedah yang sama, yang terbaik adalah untuk mengatasi kaedah yang sama bagi Objek dan menyediakan logik kesamaan sendiri. Tentukan kelas Orang seperti berikut.

public class Person {
    private String name;
    private int age;
    // ...
    @Override
    public boolean equal(Object o) {
        if(o instanceof Person) {
            return o.getName().equal(name) && o.getAge() == age;
        } else {
            return false;
        }
    }
}
巴扎黑

s dan s2 kedua-duanya adalah rujukan langsung kepada pemalar "12". Pengkompil akan mengoptimumkan kod dan hanya mencipta objek Rentetan "12", yang dirujuk oleh dua pembolehubah, jadi s == s2. Tetapi jika "12" anda yang lain dibuat dengan cara lain, seperti new String("12"), atau "1234".substring(0, 2), anda akan mendapati bahawa == tidak berfungsi dan equals membandingkan kandungannya. Melihat pada kod asal equals anda akan mendapati bahawa ia juga menggunakan == terlebih dahulu untuk membandingkan

yang dirujuk
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;
}
巴扎黑

Ia akan berbeza apabila baru keluar

迷茫

Pertama sekali, kita mesti mempertimbangkan fungsi sama dan ==:
== adalah bersamaan dengan membandingkan rujukan dua objek, manakala kaedah sama ditakrifkan dalam kelas Objek dan telah ditulis semula oleh String kelas. Kod sumber boleh dilihat Dalam analisis di atas, == pertama kali digunakan untuk membandingkan rujukan, dan kemudian kandungannya dibandingkan.
Apabila kita membandingkan dua rentetan, kita kebanyakannya ingin membandingkan kandungan, jadi kita menggunakan kaedah sama. Jika anda menggunakan ==, IDE sebenarnya akan memberikan amaran.

Jadi mengapa kaedah == dan sama anda mempunyai kesan yang sama Ia bergantung pada perbezaan antara menggunakan "=" untuk mencipta objek rentetan dan menggunakan baharu untuk mencipta rentetan.
Saya tidak tahu sama ada anda pernah memahami kumpulan rentetan Pemahaman saya tidak mendalam. Anda boleh melihatnya sendiri jika perlu.
Kali pertama anda menggunakan "=" untuk mencipta objek rentetan, ia akan menyemak sama ada terdapat "12" dalam kolam rentetan Jika tidak, tambahkan satu pada kolam dan kembalikan rujukan kepada s; , didapati terdapat satu dalam kolam, maka rujukan ini diberikan terus kepada s2, jadi rujukan s dan s2 adalah sama, menyebabkan perbandingan == adalah benar.
Anda boleh menggunakan baharu untuk mencipta rentetan dan melihat kesannya:

        String s1 = "12";
        String s2 = "12";
        String s3 = new String("12");

        System.out.println(s1 == s2);//true
        System.out.println(s1.equals(s2));//true
        System.out.println(s1 == s3);//false
        System.out.println(s1.equals(s3));//true

Apabila menggunakan kata kunci baharu untuk mencipta objek rentetan, objek baharu akan dibuat setiap kali dan rujukan akan diberikan kepada pembolehubah.

Peter_Zhu

Semua berkata baik, saya cadangkan anda mencari kolam pemalar rentetan, ia akan memberi anda pemahaman yang mendalam

巴扎黑

Kandungan s1 dan s2 anda adalah sama
Kaedah tugasan anda adalah seperti ini
Pertama, s1 akan meletakkan rentetan "..." ke dalam kumpulan tetap mesin maya JVM 🎜>Apabila menetapkan s2 untuk kali kedua, ia akan terlebih dahulu menentukan sama ada kolam malar mengandungi rentetan ini, dan jika ya, tuding kepadanya.
Jadi walaupun anda menggunakan == ia akan menjadi sama.
Jika anda menggunakan rentetan baharu(123) dalam s2, maka alamat rujukan adalah berbeza dan ia tidak sama.
Kod pada telefon bimbit bukanlah mudah.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan