543

Tôi muốn làm rõ nếu tôi hiểu điều này một cách chính xác:

  • == -> là so sánh tham chiếu, tức là cả hai đối tượng đều trỏ đến cùng một vị trí bộ nhớ
  • .equals() -> đánh giá để so sánh các giá trị trong các đối tượng

Tôi có đúng theo cách hiểu của tôi không?

|
555

Nói chung, câu trả lời cho câu hỏi của bạn là "có", nhưng ...

  • .equals(...) sẽ chỉ so sánh những gì nó được viết để so sánh, không hơn, không kém.
  • Nếu một lớp không ghi đè phương thức bằng, thì nó mặc định là equals(Object o)phương thức của lớp cha gần nhất đã ghi đè phương thức này.
  • Nếu không có lớp cha nào cung cấp ghi đè, thì nó mặc định là phương thức từ lớp cha cuối cùng, Object và do đó bạn còn lại với Object#equals(Object o)phương thức. Theo API đối tượng, điều này giống như ==; nghĩa là, nó trả về true khi và chỉ khi cả hai biến tham chiếu đến cùng một đối tượng, nếu tham chiếu của chúng là một và giống nhau. Vì vậy, bạn sẽ được kiểm tra cho sự bình đẳng đối tượng và không bình đẳng chức năng .
  • Luôn nhớ ghi đè hashCodenếu bạn ghi đè equalsđể không "phá vỡ hợp đồng". Theo API, kết quả trả về từ hashCode()phương thức cho hai đối tượng phải giống nhau nếu equalsphương thức của chúng cho thấy chúng tương đương nhau. Chuyện ngược lại không hẳn là đúng.
|
97

Đối với lớp String:

Equals () phương pháp so sánh "giá trị" bên trong trường hợp String (trên heap) không phân biệt nếu hai tài liệu tham khảo đối tượng tham khảo với cùng dụ Chuỗi hay không. Nếu bất kỳ hai tham chiếu đối tượng nào của kiểu String tham chiếu đến cùng một thể hiện Chuỗi thì thật tuyệt! Nếu hai tham chiếu đối tượng tham chiếu đến hai trường hợp Chuỗi khác nhau .. thì nó không tạo ra sự khác biệt. Đó là "giá trị" (nghĩa là: nội dung của mảng ký tự) bên trong mỗi thể hiện Chuỗi đang được so sánh.

Mặt khác, toán tử "==" so sánh giá trị của hai tham chiếu đối tượng để xem liệu chúng có tham chiếu đến cùng một thể hiện Chuỗi hay không . Nếu giá trị của cả hai tham chiếu đối tượng "tham chiếu" cùng một thể hiện Chuỗi thì kết quả của biểu thức boolean sẽ là "true" .. duh. Mặt khác, nếu giá trị của cả hai tham chiếu đối tượng "tham chiếu" các trường hợp Chuỗi khác nhau (mặc dù cả hai trường hợp Chuỗi có "giá trị" giống nhau, nghĩa là, nội dung của các mảng ký tự của mỗi phiên bản Chuỗi là như nhau) kết quả của biểu thức boolean sẽ là "false".

Như với bất kỳ lời giải thích, hãy để nó chìm trong.

Tôi hy vọng điều này sẽ làm sáng tỏ mọi thứ một chút.

|
  • 1

    vậy đối với chuỗi == là tham chiếu có bằng aswell không? tức là hoạt động tương tự như đối với các đối tượng khác?

    – Hoàng Cao Phong 14:12:15 20/02/2014
  • 1

    (Necromancy chủ đề, tôi biết ...) Đối với Strings, ==là tham chiếu cũng bằng, vâng, nhưng nó thường hoạt động (như trong hai Strings có cùng nội dung thường sẽ ==dành cho nhau), vì cách Java xử lý Strings. Nó sẽ không luôn luôn, và nó chắc chắn là thực tiễn xấu, nhưng đó là một lỗi phổ biến, đặc biệt là từ những người đến từ các ngôn ngữ khác.

    – Tạ Quang Tú 22:33:54 03/10/2014
  • 1

    Để thêm vào nhận xét của Tonio. Stringxây dựng từ chuỗi ký tự sẽ được thêm vào một cái gì đó gọi là String constant pool, ví dụ String s1 = "someString"; String s2 = "someString;"cả hai s1& s2sẽ chia sẻ cùng một tham chiếu. s1 == s2sẽ trở về đúng Nhưng nếu chúng được xây dựng thông qua String constructor, ví dụ như vậy String s1 = new String("someString"); String s2 = new String("someString");thì chúng sẽ không chia sẻ cùng một tham chiếu. s1 == s2sẽ trả lại sai.

    – Hồ Hiếu Giang 14:25:48 15/11/2017
53

Có một số khác biệt nhỏ tùy thuộc vào việc bạn đang nói về "nguyên thủy" hay "Loại đối tượng"; điều tương tự có thể được nói nếu bạn đang nói về các thành viên "tĩnh" hoặc "không tĩnh"; bạn cũng có thể trộn tất cả các thứ trên ...

Đây là một ví dụ (bạn có thể chạy nó):

public final class MyEqualityTest
{
    public static void main( String args[] )
    {
        String s1 = new String( "Test" );
        String s2 = new String( "Test" );

        System.out.println( "\n1 - PRIMITIVES ");
        System.out.println( s1 == s2 ); // false
        System.out.println( s1.equals( s2 )); // true

        A a1 = new A();
        A a2 = new A();

        System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
        System.out.println( a1 == a2 ); // false
        System.out.println( a1.s == a2.s ); // true
        System.out.println( a1.s.equals( a2.s ) ); // true

        B b1 = new B();
        B b2 = new B();

        System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
        System.out.println( b1 == b2 ); // false
        System.out.println( b1.getS() == b2.getS() ); // false
        System.out.println( b1.getS().equals( b2.getS() ) ); // true
    }
}

final class A
{
    // static
    public static String s;
    A()
    {
        this.s = new String( "aTest" );
    }
}

final class B
{
    private String s;
    B()
    {
        this.s = new String( "aTest" );
    }

    public String getS()
    {
        return s;
    }

}

Bạn có thể so sánh các giải thích cho "==" (Toán tử đẳng thức) và ".equals (...)" (phương thức trong lớp java.lang.Object) thông qua các liên kết sau:

|
  • 1

    Ví dụ thú vị. Quan điểm khác với các câu trả lời trên. Cảm ơn!

    – Hoàng Cao Phong 15:30:32 11/03/2015
  • 1

    Theo tôi, câu trả lời hay nhất, vì nó rõ ràng hơn các câu trả lời toàn văn khác mà không làm mất lời giải thích (tất nhiên, nếu bạn thực hiện các khái niệm lớp và tĩnh)

    – Tạ Quang Tú 09:31:51 30/08/2017
40

Sự khác biệt giữa == và bằng làm tôi bối rối đôi khi cho đến khi tôi quyết định xem xét kỹ hơn về nó. Nhiều người trong số họ nói rằng để so sánh chuỗi bạn nên sử dụng equalsvà không ==. Hy vọng trong câu trả lời này tôi sẽ có thể nói sự khác biệt.

Cách tốt nhất để trả lời câu hỏi này sẽ là bằng cách tự hỏi một vài câu hỏi. vì vậy hãy bắt đầu:

Đầu ra cho chương trình dưới đây là gì:

String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);

nếu bạn nói,

false
true

Tôi sẽ nói bạn đúng nhưng tại sao bạn lại nói vậy ? và nếu bạn nói đầu ra là,

true
false

Tôi sẽ nói bạn sai nhưng tôi vẫn sẽ hỏi bạn, tại sao bạn nghĩ điều đó đúng?

Ok, chúng ta hãy thử trả lời câu hỏi này:

Đầu ra cho chương trình dưới đây là gì:

String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);

Bây giờ nếu bạn nói,

false
true

Tôi sẽ nói bạn sai nhưng tại sao bây giờ lại sai ? đầu ra chính xác cho chương trình này là

true
false

Hãy so sánh chương trình trên và cố gắng nghĩ về nó.

Được. Bây giờ điều này có thể giúp (xin vui lòng đọc điều này: in địa chỉ của đối tượng - không thể nhưng chúng ta vẫn có thể sử dụng nó.)

String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);

System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));

bạn có thể thử suy nghĩ về đầu ra của ba dòng cuối cùng trong đoạn mã trên không: đối với tôi, ideone đã in nó ra ( bạn có thể kiểm tra mã ở đây ):

false
true
true
false
mango mango
false
true
17225372
17225372
5433634

Oh! Bây giờ bạn thấy nhận dạngHashCode (xoài) bằng với idHashCode (mango2) Nhưng nó không bằng nhận dạngHashCode (mango3)

Mặc dù tất cả các biến chuỗi - xoài, xoài2 và xoài3 - có cùng một giá trị, đó là "xoài", identityHashCode()vẫn không giống nhau cho tất cả.

Bây giờ hãy thử bỏ dòng này // mango2 = "mang";và chạy lại lần này bạn sẽ thấy cả ba identityHashCode()đều khác nhau. Hmm đó là một gợi ý hữu ích

chúng tôi biết rằng nếu hashcode(x)=Nhashcode(y)=N=>x is equal to y

Tôi không chắc làm thế nào java hoạt động nội bộ nhưng tôi cho rằng đây là những gì đã xảy ra khi tôi nói:

mango = "mango";

java đã tạo ra một chuỗi "mango"được chỉ (tham chiếu) bởi biến mangogiống như thế này

mango ----> "mango"

Bây giờ trong dòng tiếp theo khi tôi nói:

mango2 = "mango";

Nó thực sự sử dụng lại cùng một chuỗi "mango"trông giống như thế này

mango ----> "mango" <---- mango2

Cả xoài và xoài2 đều chỉ đến cùng một tham chiếu Bây giờ khi tôi nói

mango3 = new String("mango")

Nó thực sự tạo ra một tham chiếu (chuỗi) hoàn toàn mới cho "xoài". trông giống cái này

mango -----> "mango" <------ mango2

mango3 ------> "mango"

và đó là lý do tại sao khi tôi đưa ra các giá trị cho mango == mango2nó, nó đưa ra true. và khi tôi đưa ra giá trị cho mango3 == mango2nó, nó đưa ra false(ngay cả khi các giá trị là như nhau).

và khi bạn bỏ ghi chú dòng // mango2 = "mang"; Nó thực sự tạo ra một chuỗi "mang" đã biến đồ thị của chúng tôi như thế này:

mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"

Đây là lý do tại sao nhận dạngHashCode không giống nhau cho tất cả.

Hy vọng điều này sẽ giúp các bạn. Trên thực tế, tôi muốn tạo một trường hợp thử nghiệm trong đó == fail và bằng () vượt qua. Xin vui lòng bình luận và cho tôi biết nếu tôi sai.

|
  • 1

    mango == mango2xảy ra bởi vì bạn đã không tạo mango2 như một đối tượng Chuỗi mới và thay vào đó chỉ được tham chiếu trực tiếp "mango"?

    – Hoàng Cao Phong 16:49:12 23/07/2017
  • 1

    ví dụ sai khi sử dụng Chuỗi để xóa nghi ngờ trên == và bằng, Chuỗi khi không được sử dụng với new được đặt vào Chuỗi Pool và bất cứ khi nào cùng một chuỗi được gán cho tham chiếu mới, nó sẽ trỏ đến cùng một chuỗi trong nhóm. Vì vậy, có thể sử dụng một số ví dụ đối tượng tùy chỉnh để so sánh == và .equals ().

    – Tạ Quang Tú 01:35:23 15/06/2018
29

Các == kiểm tra điều hành cho dù hai biến có tài liệu tham khảo tương tự (hay còn gọi là con trỏ đến một địa chỉ bộ nhớ) .

String foo = new String("abc");
String bar = new String("abc");

if(foo==bar)
// False (The objects are not the same)

bar = foo;

if(foo==bar)
// True (Now the objects are the same)

Trong khi phương thức equals () kiểm tra xem hai biến tham chiếu đến các đối tượng có cùng trạng thái (giá trị) hay không .

String foo = new String("abc");
String bar = new String("abc");

if(foo.equals(bar))
// True (The objects are identical but not same)

Chúc mừng :-)

|
  • 1

    Sai rồi. if (foo == bar) điều này nên đúng không sai. Nó sẽ sử dụng lại cùng một chuỗi "adc". Kiểm tra nó trong một hộp cát, nó sẽ trả về đúng cho cả hai.

    – Hoàng Cao Phong 04:39:30 12/04/2017
  • 1

    @JohnathanLogan Tôi đoán là do thực tập chuỗi. Bây giờ tôi đã thay đổi thành "Chuỗi mới (" abc ")". Hy vọng bây giờ sẽ không có bất kỳ vấn đề. Cảm ơn đã thông báo.

    – Tạ Quang Tú 18:28:27 13/04/2017
12

Bạn sẽ phải ghi đè hàm bằng (cùng với các hàm khác) để sử dụng hàm này với các lớp tùy chỉnh.

Phương thức equals so sánh các đối tượng.

Các ==nhà điều hành nhị phân so sánh địa chỉ bộ nhớ.

|
6

Cả == và .equals () đều đề cập đến cùng một đối tượng nếu bạn không ghi đè .equals ().

Đó là mong muốn của bạn những gì bạn muốn làm một khi bạn ghi đè .equals (). Bạn có thể so sánh trạng thái của đối tượng gọi với trạng thái được truyền qua hoặc bạn chỉ có thể gọi super.equals ()

|
5

Toán tử ==:

== là một toán tử quan hệ trong Java được sử dụng để so sánh hai toán hạng. Nó được sử dụng để xác định xem hai toán hạng có bằng nhau hay không. Sử dụng toán tử ==, bạn có thể so sánh bất kỳ loại nguyên thủy nào như int, char, float và Booleans. Sau khi so sánh, toán tử == trả về giá trị boolean. Nếu hai toán hạng bằng nhau, toán tử == trả về giá trị thực. Tuy nhiên, nếu hai toán hạng không bằng nhau, nó sẽ trả về giá trị sai. Khi được sử dụng với các đối tượng, toán tử == so sánh hai tham chiếu đối tượng và xác định xem chúng có tham chiếu đến cùng một thể hiện hay không.

Phương thức .equals ()

Equals () là một phương thức có sẵn trong lớp String được sử dụng để so sánh hai chuỗi và xác định xem chúng có bằng nhau không. Phương thức này trả về giá trị boolean là kết quả của phép so sánh. Nếu hai chuỗi chứa các ký tự giống nhau theo cùng một thứ tự, phương thức equals () trả về true. Nếu không, nó trả về một giá trị sai.

|
5

==là một toán tửequals()là một phương thức .

Các toán tử thường được sử dụng để so sánh kiểu nguyên thủy và do đó ==được sử dụng để so sánh địa chỉ bộ nhớ và equals()phương thức được sử dụng để so sánh các đối tượng .

|
5
 String w1 ="Sarat";
 String w2 ="Sarat";
 String w3 = new String("Sarat");

 System.out.println(w1.hashCode());   //3254818
 System.out.println(w2.hashCode());   //3254818
 System.out.println(w3.hashCode());   //3254818

 System.out.println(System.identityHashCode(w1)); //prints 705927765
 System.out.println(System.identityHashCode(w2)); //prints 705927765
 System.out.println(System.identityHashCode(w3)); //prints 366712642


 if(w1==w2)   //  (705927765==705927765)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints true

 if(w2==w3)   //  (705927765==366712642)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints false


 if(w2.equals(w3))   //  (Content of 705927765== Content of 366712642)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints true
|
5

Chỉ cần nhớ rằng .equals(...)phải được thực hiện bởi lớp bạn đang cố gắng so sánh. Mặt khác, không có nhiều điểm; phiên bản của phương thức cho lớp Object thực hiện tương tự như thao tác so sánh: Object # bằng .

Lần duy nhất bạn thực sự muốn sử dụng toán tử so sánh cho các đối tượng là khi bạn so sánh Enums. Điều này là do chỉ có một phiên bản của giá trị Enum tại một thời điểm. Ví dụ, đưa ra enum

enum FooEnum {A, B, C}

Bạn sẽ không bao giờ có nhiều hơn một ví dụ Acùng một lúc và tương tự cho BC. Điều này có nghĩa là bạn thực sự có thể viết một phương thức như vậy:

public boolean compareFoos(FooEnum x, FooEnum y)
{
    return (x == y);
}

Và bạn sẽ không có vấn đề gì.

|
3

Sự khác biệt chính giữa == và bằng () là

1) == được sử dụng để so sánh nguyên thủy.

Ví dụ :

        String string1 = "Ravi";
        String string2 = "Ravi";
        String string3 = new String("Ravi");
        String string4 = new String("Prakash");

        System.out.println(string1 == string2); // true because same reference in string pool
        System.out.println(string1 == string3); // false

2) bằng () được sử dụng để so sánh các đối tượng. Ví dụ :

        System.out.println(string1.equals(string2)); // true equals() comparison of values in the objects
        System.out.println(string1.equals(string3)); // true
        System.out.println(string1.equals(string4)); // false
|
3

Khi bạn đánh giá mã, rất rõ ràng rằng (==) so sánh theo địa chỉ bộ nhớ, trong khi bằng (Object o) so sánh hashCode () của các thể hiện. Đó là lý do tại sao người ta nói không phá vỡ hợp đồng giữa bằng () và hashCode () nếu bạn không gặp phải những bất ngờ sau này.

    String s1 = new String("Ali");
    String s2 = new String("Veli");
    String s3 = new String("Ali");

    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    System.out.println(s3.hashCode());


    System.out.println("(s1==s2):" + (s1 == s2));
    System.out.println("(s1==s3):" + (s1 == s3));


    System.out.println("s1.equals(s2):" + (s1.equals(s2)));
    System.out.println("s1.equal(s3):" + (s1.equals(s3)));


    /*Output 
    96670     
    3615852
    96670
    (s1==s2):false
    (s1==s3):false
    s1.equals(s2):false
    s1.equal(s3):true
    */
|
3

Cũng lưu ý rằng .equals()thông thường có chứa ==để kiểm tra vì đây là điều đầu tiên bạn muốn kiểm tra nếu bạn muốn kiểm tra nếu hai đối tượng bằng nhau.

==thực sự nhìn vào các giá trị cho các kiểu nguyên thủy, cho các đối tượng mà nó kiểm tra tham chiếu.

|
2

Có thể đáng để thêm rằng đối với các đối tượng trình bao cho các kiểu nguyên thủy - tức là Int, Long, Double - == sẽ trả về true nếu hai giá trị bằng nhau.

Long a = 10L;
Long b = 10L;

if (a == b) {
    System.out.println("Wrapped primitives behave like values");
}

Ngược lại, đặt hai Long trên vào hai ArrayLists riêng biệt, bằng nhau sẽ thấy chúng giống nhau, nhưng == không.

ArrayList<Long> c = new ArrayList<>();
ArrayList<Long> d = new ArrayList<>();

c.add(a);
d.add(b);
if (c == d) System.out.println("No way!");
if (c.equals(d)) System.out.println("Yes, this is true.");
|
2
public class StringPool {

public static void main(String[] args) {

    String s1 = "Cat";// will create reference in string pool of heap memory
    String s2 = "Cat";
    String s3 = new String("Cat");//will create a object in heap memory

    // Using == will give us true because same reference in string pool

    if (s1 == s2) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

    // Using == with reference and Object will give us False

    if (s1 == s3) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

    // Using .equals method which refers to value

    if (s1.equals(s3)) {
        System.out.println("true");
    } else {
        System.out.println("False");
    }

    }
  }

---- Kết quả ----- đúng sai đúng

|
2

Toán tử == luôn tham chiếu được so sánh. Nhưng trong trường hợp

phương thức bằng ()

nó phụ thuộc vào việc thực hiện nếu chúng ta bị ghi đè bằng phương thức so với phương thức so sánh đối tượng trên cơ sở thực hiện được đưa ra trong phương thức ghi đè.

 class A
 {
   int id;
   String str;

     public A(int id,String str)
     {
       this.id=id;
       this.str=str;
     }

    public static void main(String arg[])
    {
      A obj=new A(101,"sam");
      A obj1=new A(101,"sam");

      obj.equals(obj1)//fasle
      obj==obj1 // fasle
    }
 }

trong mã ở trên, cả hai đối tượng obj và obj1 đều chứa cùng một dữ liệu nhưng tham chiếu không giống nhau nên bằng trả về false và == cũng được. nhưng nếu chúng ta ghi đè phương thức bằng

 class A
 {
   int id;
   String str;

     public A(int id,String str)
     {
       this.id=id;
       this.str=str;
     }
    public boolean equals(Object obj)
    {
       A a1=(A)obj;
      return this.id==a1.id;
    }

    public static void main(String arg[])
    {
      A obj=new A(101,"sam");
      A obj1=new A(101,"sam");

      obj.equals(obj1)//true
      obj==obj1 // fasle
    }
 }

biết kiểm tra nó sẽ trả về đúng và sai cho cùng một trường hợp chỉ có chúng tôi ghi đè

bằng phương pháp.

nó so sánh đối tượng trên cơ sở nội dung (id) của đối tượng

nhưng ==

vẫn so sánh tài liệu tham khảo của đối tượng.

|
2

==có thể được sử dụng trong nhiều loại đối tượng nhưng bạn có thể sử dụng Object.equalscho bất kỳ loại nào, đặc biệt là Chuỗi và Google Map Markers.

|
0

Do Java không hỗ trợ quá tải toán tử, == hành xử giống hệt nhau cho mọi đối tượng nhưng bằng () là phương thức, có thể được ghi đè trong Java và logic để so sánh các đối tượng có thể được thay đổi dựa trên các quy tắc nghiệp vụ.

Sự khác biệt chính giữa == và bằng trong Java là "==" được sử dụng để so sánh các nguyên hàm trong khi phương thức equals () được khuyến nghị để kiểm tra sự bằng nhau của các đối tượng.

So sánh chuỗi là một kịch bản phổ biến của việc sử dụng cả hai phương thức == và bằng. Do lớp java.lang.String ghi đè bằng phương thức, Nó trả về true nếu hai đối tượng String chứa cùng một nội dung nhưng == sẽ chỉ trả về true nếu hai tham chiếu được trỏ đến cùng một đối tượng.

Dưới đây là một ví dụ về việc so sánh hai Chuỗi trong Java về phương trình bằng cách sử dụng phương thức == và equals () sẽ xóa một số nghi ngờ:

public class TEstT{

    public static void main(String[] args) {

String text1 = new String("apple");
String text2 = new String("apple");

//since two strings are different object result should be false
boolean result = text1 == text2;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = text1.equals(text2);
System.out.println("Comparing two Strings with same content using equals method: " + result);

text2 = text1;
//since both text2 and text1d reference variable are pointing to same object
//"==" should return true
result = (text1 == text2);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

}
}
|
0

Về cơ bản, ==so sánh nếu hai đối tượng có cùng tham chiếu trên heap, vì vậy trừ khi hai tham chiếu được liên kết với cùng một đối tượng, so sánh này sẽ sai.

equals()là một phương thức được kế thừa từ Objectlớp. Phương thức này theo mặc định so sánh nếu hai đối tượng có cùng tham chiếu. Nó có nghĩa là:

object1.equals(object2) <=> object1 == object2

Tuy nhiên, nếu bạn muốn thiết lập sự bình đẳng giữa hai đối tượng của cùng một lớp, bạn nên ghi đè phương thức này. Nó cũng rất quan trọng để ghi đè phương thức hashCode()nếu bạn có overriden equals().

Triển khai hashCode()khi thiết lập đẳng thức là một phần của Hợp đồng đối tượng Java. Nếu bạn đang làm việc với các bộ sưu tập và bạn chưa triển khai hashCode(), Những điều tồi tệ có thể xảy ra:

HashMap<Cat, String> cats = new HashMap<>();
Cat cat = new Cat("molly");
cats.put(cat, "This is a cool cat");
System.out.println(cats.get(new Cat("molly"));

nullsẽ được in sau khi thực thi mã trước đó nếu bạn chưa triển khai hashCode().

|
0

Nhóm String (còn gọi là interning ) và nhóm Integer làm mờ sự khác biệt hơn nữa và có thể cho phép bạn sử dụng ==cho các đối tượng trong một số trường hợp thay vì.equals

Điều này có thể cung cấp cho bạn hiệu suất cao hơn (?), Với chi phí phức tạp hơn.

Ví dụ:

assert "ab" == "a" + "b";

Integer i = 1;
Integer j = i;
assert i == j;

Sự đánh đổi phức tạp: những điều sau đây có thể làm bạn ngạc nhiên:

assert new String("a") != new String("a");

Integer i = 128;
Integer j = 128;
assert i != j;

Tôi khuyên bạn nên tránh xa tối ưu hóa vi mô như vậy và luôn luôn sử dụng .equalscho các đối tượng và ==cho các nguyên thủy:

assert (new String("a")).equals(new String("a"));

Integer i = 128;
Integer j = 128;
assert i.equals(j);
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.