Java Comparator interface

cho em hỏi giữa 2 cách dùng Comparator như trong hình thì thường dùng cách nào hơn ạ? có sự khác nhau giữa 2 cách ko? thank mn

1 Like
  • Cách viết riêng ra một class mới là hơn bởi vì khả năng tái sử dụng của nó trong các trường hợp khác.
  • Sự khác nhau đó là: một cái viết trong một class riêng biệt còn cái kia là anonymous class viết trong cùng một class tại nơi sử dụng.nó.
1 Like

Lí do của bạn không thuyết phục lắm, việc nói cái nào hơn cái nào phụ thuộc vào tùy trường hợp cụ thể. Cụ thể ở ví dụ như ảnh thì cách 1 có lợi về mặt hiệu năng hơn cách 2 do cách 1 tái sử dụng object => ít object hơn => ít áp lực tới java GC hơn, còn cách 2 tuy tái sử dụng code trong class nhưng mỗi lần sử dụng lại tạo 1 object khác nhau => nhiều object hơn, đặc biệt là nếu method được gọi nhiều lần => tăng áp lực lên java GC => giảm hiệu năng chung của chương trình

1 Like

mình mới làm quen với java nên không hiểu cho lắm, cách đầu tiên là trong giáo trình, còn cách thứ 2 thì mình tìm hiểu trên gg

Em cũng mới tìm hiểu về Java core nên chưa tính đến chuyện tối ưu hóa thời gian chạy vì em nghĩ mình phải làm được đã sau mới làm tốt :slight_smile:

@Quân: Bạn giải thích không đúng lắm.

  • Cách 1: Trình biên dịch Java vẫn build ra 1 class khác và khởi tạo đối tượng như cách 2.
  • cách 2 tuy tái sử dụng code trong class nhưng mỗi lần sử dụng lại tạo 1 object khác nhau => nhiều object hơn, đặc biệt là nếu method được gọi nhiều lần => tăng áp lực lên java GC => giảm hiệu năng chung của chương trình =====> mình chưa thấy trường hợp sử dụng nào mà cách 2 tạo ra nhiều object hơn cách 1.

Về bản chất cả cách 1 và cách 2 là như nhau. Hàm sort chỉ cần bạn cung cấp bộ so sánh để thực hiện sắp xếp. còn cách bạn viết bộ so sánh như thế nào không quan trọng, nó không làm ảnh hưởng đến tốc độ của hàm sort. Bạn có thể viết Comparator Annonymous class như cách 1, hoặc tách ra như cách 2 hoặc implement Comparable trong Object.

Trong ứng dụng thực tế thì cách viết tách class riêng thường được sử dụng hơn vì có thể tái sử dụng, làm chương trình gọn gàng hơn, dễ bảo trì hơn.

Bài viết này có một vài ví dụ sử dụng bộ so sánh, bạn có thể tham khảo:

Bạn sai rồi, ví dụ:
Cách 1:

class A {
    final Comparator<SomeClass> sclComparator = new Comparator<>(){ implement.... }
    
    public void doWork(List<SomeClass> l){
        Collections.sort(l, sclComparator);
    }
}

Cách 2:

class SomeClassComparator implement Comparator<SomeClass>{
... implement
}

class B {
   public void doWork(List<SomeClass> l){
        Collections.sort(l, new SomeClassComparator());
    }
}

Đúng là compiler sẽ tự tạo 1 class khi build chương trình nhưng về mặt hiệu năng thì cách thứ 2 sẽ kém hơn do tạo ra nhiều object không cần thiết.
Bạn nói đúng ở điểm:

Hàm sort chỉ cần bạn cung cấp bộ so sánh để thực hiện sắp xếp. còn cách bạn viết bộ so sánh như thế nào không quan trọng, nó không làm ảnh hưởng đến tốc độ của hàm sort

Tuy nhiên mình không đề cập đến bản thân hàm sort vì cho dù dùng cách nào tạo Comparator thì tốc độ sort cũng như nhau cả. Cái mình nói đến hiệu năng tổng thể của cả chương trình. Cách 2 sẽ tạo ra nhiều short live object => tăng áp lực lên bộ dọn rác (garbage collector) nếu method doWork được gọi tới nhiều lần => GC nhiều hơn => chương trình chậm hơn. Đó là chưa kể việc tạo thêm 1 object cũng tốn thời gian (mặc dù rất nhỏ)
Bạn có thể tham khảo ở đây để hiểu thêm về cách java quản lí bộ nhớ: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
hoặc ở đây:
https://techmaster.vn/posts/34343/garbage-collector-cua-java

2 Likes

Do cách bạn sử dụng không đúng thôi.
Nếu hàm doWork được nhiều lần thì bạn khởi tạo comparator như cách 1. Cách viết của bạn ở 2 cách khác nhau nên bạn mới thấy là nó khác.
Ví dụ cách 2 viết lại như sau:
class B {
Comparator sclComparator = new SomeClassComparator();
public void doWork(List l){
Collections.sort(l, sclComparator );
}
}

Bạn vui lòng nhìn kĩ hình ảnh mà bạn kia post, mình nói cách 2 chính là nói cách 2 trong hình ảnh minh họa, còn như cách 2 mà bạn post lại quy về cách 1 có khai báo class tường minh

1 Like

Thực ra thì thời gian tạo ra 1 short lived object với thời gian sort cái collection chênh lệch quá lớn nên 2 cách hiệu năng cũng không khác gì nhau mấy.

Theo mình, mình vẫn nghiêng về việc sử dụng một class riêng để sau này có thể maintain và develop dễ dàng hơn. Nếu có trường hợp phải gọi Obj nhiều lần làm giảm performance chung, thì mình nghĩ vẫn có rất nhiều cách để khắc phục.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?