JavaRush /Blog Java /Random-VI /Nghỉ giải lao #176. Điểm giống và khác nhau giữa Array và...

Nghỉ giải lao #176. Điểm giống và khác nhau giữa Array và ArrayList. Cách viết một phương thức bằng() hiệu quả

Xuất bản trong nhóm

Điểm giống và khác nhau giữa Array và ArrayList

Nguồn: Medium Bài viết này tập trung tìm hiểu các khái niệm về Array và ArrayList cũng như sự khác biệt giữa chúng. Nghỉ giải lao #176.  Điểm giống và khác nhau giữa Array và ArrayList.  Cách viết phương thức Equals() hiệu quả - 1

Mảng Java

Mảng là một cấu trúc dữ liệu cho phép bạn lưu trữ một chuỗi các giá trị có cùng loại theo thứ tự. Ví dụ: bạn có thể tạo một mảng ký tự, số, v.v. Điều này áp dụng cho tất cả các kiểu nguyên thủy và thậm chí cả các đối tượng như String . Khi mảng được tạo, chúng ta không thể thay đổi kích thước của nó. Đây là một ví dụ chung về việc khai báo một biến tham chiếu mảng và phân bổ mảng:
dataType[] arrayName = new dataType[numElements];
Nếu chúng ta cố gắng thêm nhiều hơn kích thước của mảng, chúng ta sẽ nhận được ArrayIndexOutOfBoundsException .

Khai báo mảng

Để khai báo một mảng, hãy sử dụng ký tự [] sau kiểu dữ liệu. Chúng chỉ ra rằng biến đó là một tham chiếu đến một mảng. Một biến tham chiếu mảng có thể tham chiếu đến các mảng có kích thước khác nhau. Từ khóa new tạo khoảng trống trong bộ nhớ để lưu trữ một mảng có số phần tử được chỉ định. Một biến tham chiếu mảng được gán để tham chiếu đến mảng mới được phân bổ này. Ví dụ sau khai báo một biến tham chiếu mảng gameScores , phân bổ một mảng gồm bốn số nguyên và gán gameScores để tham chiếu đến mảng được phân bổ.
int[] gameScores = new int[4];
Các phần tử mảng được tự động khởi tạo về giá trị mặc định khi bạn sử dụng từ khóa new để khởi tạo tham chiếu mảng. Giá trị mặc định cho các phần tử của kiểu dữ liệu số nguyên và dấu phẩy động là 0 và giá trị mặc định cho các phần tử Boolean là false . Bạn cũng có thể khai báo một biến tham chiếu mảng mà không cần phân bổ mảng ngay lập tức, sau đó gán biến đó với mảng được phân bổ.
int[] gameScores;

gameScores = new int[4];

Khởi tạo một mảng với các giá trị không mặc định

Bạn có thể khởi tạo các phần tử mảng với các giá trị không mặc định bằng cách chỉ định các giá trị ban đầu trong dấu ngoặc nhọn {} cách nhau bằng dấu phẩy.
int [] myArray = { 5 , 7 , 11 };
Ví dụ trên tạo một mảng gồm 3 phần tử số nguyên có các giá trị 5, 7 và 11. Việc khởi tạo mảng này không yêu cầu sử dụng từ khóa new vì kích thước của mảng được tự động đặt theo số phần tử trong dấu ngoặc nhọn. Đối với các mảng lớn, việc khởi tạo có thể được thực hiện bằng cách trước tiên xác định mảng và sau đó sử dụng vòng lặp để gán các phần tử của mảng. Các phần tử mảng có thể được truy cập bằng cách sử dụng các chỉ mục dựa trên số 0 của chúng.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

Lập danh sách

Một ArrayList là một danh sách có thứ tự các phần tử thuộc loại tham chiếu có thể thay đổi kích thước. Nó cũng là một lớp trong gói java.util thuộc Khung sưu tập Java. ArrayList cung cấp cho chúng ta các mảng động và tự động xử lý việc thay đổi kích thước của chúng. Khi bạn thêm các phần tử vào ArrayList, kích thước bộ nhớ của nó sẽ tự động tăng lên. Bạn có thể sử dụng ArrayList bằng cách sử dụng import java.util.ArrayList; . Chúng ta cũng có thể tạo một cá thể ArrayList bằng câu lệnh sau:
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList có thể tăng kích thước để chứa các phần tử mà nó cần. ArrayList không hỗ trợ các kiểu nguyên thủy như int mà hỗ trợ các kiểu tham chiếu như Integer . Một lỗi phổ biến ở những người mới bắt đầu là khai báo ArrayList thuộc loại nguyên thủy, chẳng hạn như int , như trong ArrayList<int> myVals . Điều này dẫn đến lỗi biên dịch: “loại không mong đợi, được tìm thấy: int, bắt buộc: tham chiếu”. Ví dụ: Hãy tạo một đối tượng ArrayList có tên là xe ô tô , đối tượng này sẽ lưu trữ các chuỗi:
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Để thêm các phần tử vào ArrayList , hãy sử dụng phương thức add() . Để truy cập một phần tử của ArrayList , phương thức get() được sử dụng .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
Sự khác biệt giữa mảng dựng sẵn và ArrayList trong Java là trong trường hợp đầu tiên, kích thước của mảng không thể thay đổi (nếu bạn muốn thêm hoặc xóa các phần tử vào/khỏi mảng, bạn cần tạo một mảng mới ). Trong khi đó, trong ArrayList , các phần tử có thể được thêm và xóa bất kỳ lúc nào.

Điểm tương đồng giữa Array và ArrayList

  • ArrayArrayList được sử dụng để lưu trữ các phần tử.
  • ArrayArrayList có thể lưu trữ giá trị null.
  • Cả hai quá trình xảy ra trong thời gian không đổi.
  • Chúng có thể có giá trị trùng lặp.
  • ArrayArrayList không đảm bảo sự hiện diện của các phần tử được sắp xếp.

Sự khác biệt chính giữa Array và ArrayList

Sự khác biệt chính giữa một mảng ( Array ) và ArrayList là bản chất tĩnh của một mảng và bản chất động của ArrayList . Sau khi tạo, bạn không thể thay đổi kích thước của mảng, trong khi ArrayList có thể thay đổi kích thước của nó nếu cần. Một điểm khác biệt quan trọng nữa là mảng là một chức năng cơ bản do Java cung cấp. Mặt khác, ArrayList là một phần của khung bộ sưu tập trong Java. Chúng ta có thể truy cập các phần tử của mảng bằng dấu ngoặc vuông trong đó chúng ta có thể chỉ định một chỉ mục. Mặc dù có một tập hợp các phương thức để truy cập các phần tử của ArrayList và thay đổi chúng. Mặc dù khác nhau nhưng cả hai vẫn có thể so sánh được ở các khía cạnh khác. Cả hai cấu trúc dữ liệu này trong Java đều dựa trên các chỉ mục và cho phép bạn lưu trữ các đối tượng. Ngoài ra, chúng cho phép giá trị null và trùng lặp. Nếu bạn biết trước kích thước của các đối tượng thì tốt hơn nên sử dụng mảng. Nhưng nếu bạn không chắc chắn về kích thước thì thay vào đó bạn nên sử dụng ArrayList .

Cách viết một phương thức bằng() hiệu quả

Nguồn: Medium Bài đăng này sẽ giúp bạn hiểu rõ hơn về cách sử dụng phương thức Equals() khi làm việc với mã Java. Nếu chúng ta nói về phương thức mặc định bằng () và không có bất kỳ triển khai nào, thì về nhiều mặt, nó tương tự như thao tác == . Đó là, phương pháp này so sánh các đối tượng. Ví dụ: bằng() so sánh hai chuỗi và trả về true nếu các chuỗi bằng nhau và trả về false nếu không. Xin lưu ý rằng toán tử == không được khuyến nghị để so sánh các đối tượng trong Java. Lý do là khi so sánh các đối tượng, == sẽ chỉ trả về true nếu các tham chiếu trỏ tới cùng một đối tượng. Cách dễ nhất để tránh vấn đề là không ghi đè phương thức bằng , trong trường hợp đó mỗi phiên bản của lớp chỉ bằng chính nó. Bạn chỉ cần ghi đè bằng khi lớp có khái niệm về đẳng thức logic khác với nhận dạng đơn giản của đối tượng và siêu lớp chưa ghi đè đẳng thức. Vì vậy, khi sử dụng phương thức Equals() , bạn cần tìm hiểu xem các tham chiếu đối tượng có tương đương về mặt logic hay không và liệu chúng có tham chiếu đến cùng một đối tượng hay không.

Thuộc tính của phương thức bằng

Mỗi phương thức bằng thực hiện một quan hệ tương đương . Nó có các tính chất sau:
  • Phản xạ : Đối với mọi giá trị tham chiếu không null x, x.equals (x) phải trả về true .

  • Đối xứng : Đối với mọi giá trị tham chiếu không null​​x y , x.equals(y) chỉ phải trả về true nếu y.equals(x) trả về true .

  • Transitive : Đối với mọi giá trị tham chiếu không null ​​x , y , z , nếu x.equals(y) trả về true y.equals(z) trả về true thì x.equals(z) cũng phải trả về true .

  • Nhất quán : Đối với mọi giá trị tham chiếu không null ​​x y, nhiều lệnh gọi đến x.equals(y) phải trả về true hoặc nhất quán trả về false .

  • Không có giá trị rỗng : Đối với mọi giá trị tham chiếu không có giá trị x, x.equals (null) phải trả về false .

Chúng ta hãy xem xét kỹ hơn từng thuộc tính:

Tính phản xạ:

Một đối tượng phải bằng chính nó. Để xác minh điều này, hãy thêm một phiên bản của lớp của bạn vào bộ sưu tập. Phương thức chứa có thể chỉ ra rằng bộ sưu tập không chứa phiên bản bạn vừa thêm.

Đối diện:

Hai đối tượng (chúng có thể thuộc các lớp khác nhau) phải bằng nhau.

Tiếp theo:

Đừng viết một phương thức bằng phụ thuộc vào tài nguyên không đáng tin cậy/không ổn định.

Khác không:

Luôn trả về true nếu đối tượng được truyền cho bằngnull .

Hãy tóm tắt:

Đây là công thức cho phương pháp chất lượng tương đương :
  1. Sử dụng toán tử == để kiểm tra xem một đối số có phải là tham chiếu đến đối tượng này hay không.

  2. Sử dụng toán tử instanceof để kiểm tra xem đối số có đúng loại hay không.

  3. Truyền đối số đến đúng loại.

  4. Đối với mỗi trường “quan trọng” trong một lớp, hãy kiểm tra xem trường đối số đó có khớp với trường tương ứng của đối tượng đó hay không:

    • Đối với các trường nguyên thủy: có loại không phải là float hoặc double , hãy sử dụng toán tử == để so sánh.
    • Đối với các trường tham chiếu đối tượng: gọi phương thức bằng theo cách đệ quy; đối với các trường dấu phẩy động, hãy sử dụng phương thức tĩnh Float.compare(float, float); và đối với các trường kép, hãy sử dụng Double.compare(double, double) .
    • Đối với trường mảng: Áp dụng các nguyên tắc này cho từng phần tử. Nếu mọi phần tử trong trường mảng đều có ý nghĩa, hãy sử dụng một trong các phương thức Arrays.equals() .
    • Một số trường tham chiếu đối tượng có thể chứa giá trị null . Để tránh ném ra NullPointerException , hãy kiểm tra sự bằng nhau của các trường như vậy bằng cách sử dụng phương thức tĩnh Objects.equals(Object, Object) .
  5. Khi bạn viết xong phương thức bằng , hãy tự hỏi mình ba câu hỏi: Nó có đối xứng không? Nó có tính chất chuyển tiếp không? Anh ấy có nhất quán không?

Và hãy nhớ, luôn ghi đè hashCode khi ghi đè bằng .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION