2013-07-23 23 views
7
khác

Với 2 ArrayList, tôi đã tự hỏi nếu cách tốt nhất từ ​​biến đổi 1st một thành một "bản sao" của một thứ hai là để đi nhưCách tốt nhất để chuyển giá trị từ một ArrayList để

myFirstArray.clear(); 
myFirstArray.addAll(mySecondArray); 

hoặc

myFirstArray = mySecondArray.clone(); 

Sự khác biệt chính giữa hai phương pháp này, có thể thích hợp hơn và có giải pháp "dễ dàng hơn" hoặc "sạch hơn" khác. Cảm ơn mọi mẹo

EDIT: Tôi sử dụng bản sao này để thay thế một mảng mục im hiện đang làm việc với mục tôi lưu trữ mục tôi sẽ làm việc trong vòng tiếp theo. Vào cuối vòng lặp, tôi thay thế currentArrayList của mình bằng futurArrayList của mình và tôi xóa mục futurArraylist của mình để thêm mục mới vào nó (tôi hy vọng nó đủ rõ ràng)

+0

Hãy cẩn thận nếu danh sách của bạn là một loạt các loại tham chiếu bạn có thể kết thúc với danh sách trỏ đến cùng một đối tượng. –

+2

Chỉ là một nhận xét về phong cách: thông thường tên biến của bạn nên bắt đầu bằng chữ thường. Không chỉ cho những người đọc mã, mà còn làm nổi bật cú pháp stackoverflow bị lẫn lộn! –

+0

Mục tiêu của bản sao của bạn là gì? Biết những gì bạn muốn làm sẽ giúp chúng tôi cung cấp cho bạn câu trả lời tốt nhất. –

Trả lời

12

Đầu tiên thay thế nội dung của danh sách theo nội dung khác. Cái thứ hai tạo ra một cá thể ArrayList khác, để lại một thể hiện trước đó bị ảnh hưởng.

Nếu danh sách được tham chiếu bởi một số đối tượng khác và bạn muốn đối tượng kia không bị ảnh hưởng, hãy sử dụng đối tượng thứ hai. Nếu bạn muốn đối tượng khác cũng có nội dung mới, hãy sử dụng đối tượng đầu tiên.

Nếu không có gì khác tham chiếu danh sách, điều đó không quan trọng lắm. Điều thứ hai sẽ làm giảm bộ nhớ được sử dụng trong trường hợp bạn thay thế nội dung của một danh sách lớn bằng một vài yếu tố.

+0

Cảm ơn sự chính xác, Arraylist của tôi thực sự được tham chiếu bởi một đối tượng khác vì vậy addAll có thể thích hợp hơn. – WizLiz

1

Sử dụng rằng:

List<Object> first = ... 
ArrayList<Object> second = new ArrayList<>(first); 

Tôi cũng gợi ý rằng bạn không sử dụng clone() ở tất cả. Tốt hơn là sử dụng một hàm tạo bản sao hoặc một số phương thức của nhà máy. Hãy xem here.

Tất nhiên trong trường hợp của bạn, với ArrayList, nó sẽ hoạt động như mong đợi, bạn sẽ kết thúc với một bản sao của tài liệu tham khảo.

+0

tôi không muốn bản sao tham chiếu. tôi muốn tạo một danh sách mới và chỉnh sửa nó. làm thế nào tôi có thể làm điều đó? –

+0

Nếu bạn muốn có một bản sao sâu của danh sách, bạn phải tạo một bản sao cho từng đối tượng trong danh sách. Tôi đề nghị bạn tạo một hàm tạo bản sao cho các đối tượng của bạn và sau đó chỉ cần lặp lại cái cũ và điền một cái mới. –

1

Trong java, mặc dù bản sao là 'dự định' để tạo bản sao của cùng một đối tượng mà nó không được đảm bảo. Bản sao đi kèm với rất nhiều của nó và buts. Vì vậy, lời khuyên đầu tiên của tôi là không phụ thuộc vào nhái.

Theo mặc định, sao chép java là ‘trường theo bản sao trường’ tức là lớp Object không có ý tưởng về cấu trúc của lớp mà phương thức clone() sẽ được gọi. Vì vậy, JVM khi gọi cho nhân bản, làm những điều sau đây:

  1. Nếu lớp chỉ có các thành viên kiểu dữ liệu cơ bản sau đó là một bản sao hoàn toàn mới của đối tượng sẽ được tạo ra và tham chiếu đến bản sao đối tượng mới sẽ được trả lại.

  2. Nếu lớp chứa thành viên của bất kỳ kiểu lớp thì chỉ có các đối tượng tài liệu tham khảo cho những thành viên được sao chép và do đó các thành viên tham khảo trong cả hai đối tượng ban đầu cũng như các đối tượng nhân bản tham khảo cùng một đối tượng vì những thay đổi đối tượng nhân bản đó cũng có thể nhìn thấy trong bản gốc.

+0

Trong trường hợp của tôi, sao chép chỉ là sự giới thiệu không phải là một vấn đề thực sự bởi vì tôi có ý định sửa đổi những đối tượng để có tham chiếu tương tự là có lợi. Nhưng cảm ơn về độ chính xác – WizLiz

0

Ổi, ổi, ổi!

final List copied = ImmutableList.copyOf(originalList); 
Các vấn đề liên quan