List.copyOf
List danh sách không thể thay đổi
Bạn đã hỏi:
Có cách nào khác để gán một bản sao của danh sách không
Java 9 đã mang đến các List.of
phương thức sử dụng các chữ để tạo ra một List
lớp cụ thể không xác định được.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Cùng với đó chúng tôi cũng có List.copyOf
. Phương thức này cũng trả về một List
lớp bê tông không xác định.
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
Bằng cách không thể thay đổi được, chúng tôi có nghĩa là số lượng phần tử trong danh sách và tham chiếu đối tượng được giữ trong mỗi vị trí dưới dạng một phần tử, được cố định. Bạn không thể thêm, thả hoặc thay thế các yếu tố. Nhưng đối tượng tham chiếu được giữ trong mỗi phần tử có thể hoặc không thể thay đổi .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Xem mã này chạy trực tiếp tại IdeOne.com .
ngày.toString (): [2020/02/02, 2020/02/03, 2020/02/2016]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Bạn hỏi về tài liệu tham khảo đối tượng. Như những người khác đã nói, nếu bạn tạo một danh sách và gán nó cho hai biến tham chiếu (con trỏ), bạn vẫn chỉ có một danh sách. Cả hai đều chỉ vào cùng một danh sách. Nếu bạn sử dụng một trong hai con trỏ để sửa đổi danh sách, cả hai con trỏ sau đó sẽ thấy các thay đổi, vì chỉ có một danh sách trong bộ nhớ.
Vì vậy, bạn cần phải tạo một bản sao của danh sách. Nếu bạn muốn bản sao đó không thể thay đổi, hãy sử dụng List.copyOf
phương pháp như được thảo luận trong Câu trả lời này. Trong phương pháp này, bạn kết thúc với hai danh sách riêng biệt, mỗi danh sách có các phần tử giữ tham chiếu đến cùng các đối tượng nội dung. Ví dụ, trong ví dụ của chúng tôi ở trên sử dụng String
các đối tượng để thể hiện màu sắc, các đối tượng màu đang trôi nổi trong bộ nhớ ở đâu đó. Hai danh sách giữ con trỏ đến cùng một đối tượng màu. Đây là một sơ đồ.
Danh sách đầu tiên colors
có thể sửa đổi. Điều này có nghĩa là một số phần tử có thể được loại bỏ như đã thấy trong đoạn mã trên, trong đó chúng tôi đã loại bỏ phần tử thứ 3 ban đầu Chartreuse
(chỉ số 2 = thứ 3). Và các yếu tố có thể được thêm vào. Và các yếu tố có thể được thay đổi để trỏ đến một số khác String
như OliveDrab
hoặc CornflowerBlue
.
Ngược lại, bốn yếu tố masterColors
được cố định. Không loại bỏ, không thêm, và không thay thế màu khác. Việc List
thực hiện đó là không thể thay đổi.