2013-08-30 43 views
15

Nếu tôi không nhầm, ArrayList chứa giá trị của các vị trí bộ nhớ trong đó các biến mà bạn đã thêm vào Danh sách được lưu trữ. Vì vậy, giả thiết của tôi là khi bạn gọi phương thức ArrayList.clear() nó chỉ giải phóng các giá trị nói trên (của các vị trí bộ nhớ) nhưng không giải phóng các vị trí bộ nhớ đó. Tôi sẽ cố gắng để minh họa điều này bằng một ví dụ:Phương thức ArrayList.clear() có giải phóng bộ nhớ không?

Hãy nói rằng bạn đã có tình trạng hiện tại của bộ nhớ:

[Memory location] (type of variable) *value* 

[1000] (int) 32 

[1002] (int) 12 

[1003] (float) 2.5 

Và bạn thêm chúng vào danh sách myList, vì vậy nó có chứa con trỏ đến 1000, 1002, 1003 vị trí bộ nhớ.

Khi bạn gọi myList.clear() các con trỏ sẽ bị vô hiệu hóa, nhưng các vị trí bộ nhớ 1000, 1002, 1003 sẽ vẫn chứa các giá trị đã cho trước đó. Liệu tôi có sai?

+2

http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which-one-will-be-better có thể giúp bạn –

+2

Lưu ý rằng 'ArrayList' không bao giờ chứa nguyên thủy như 'int', nhưng các đối tượng như' Integer'. Điều này kết thúc là khá quan trọng đối với câu trả lời. –

Trả lời

7

Bạn đúng vì bộ nhớ bị xóa bởi bộ thu gom rác không đồng bộ và không trực tiếp bởi các chức năng thư viện đó. clear sẽ chỉ null tất cả chúng ra và cập nhật trạng thái ArrayList tương ứng.

Nếu bất kỳ hoặc tất cả các yếu tố đó không được tham chiếu bởi bất kỳ phần nào khác của mã, chúng sẽ đủ điều kiện thu gom rác và có thể bị hủy + không phân bổ bất kỳ lúc nào ngay sau khi cuộc gọi đó kết thúc .

+0

Cảm ơn tôi sẽ đảm bảo rằng tôi tự chăm sóc các biến bị loại bỏ :) Chúc mừng và avatar đẹp – NitroNbg

+0

@NitroNbg, Sẽ không cần phải tự làm bất cứ điều gì, miễn là chúng không được tham chiếu, chúng sẽ được phân bổ. Và cảm ơn :) –

5

clear chỉ null phần tử mảng sao

public void clear() { 
    modCount++; 
    for (int i = 0; i < size; i++) 
     elementData[i] = null; 
    size = 0; 
} 

nhưng nếu chúng ta gọi là ArrayList.trimToSizeafter clear ủng hộ mảng sẽ giảm

public void trimToSize() { 
    modCount++; 
    int oldCapacity = elementData.length; 
    if (size < oldCapacity) { 
     elementData = Arrays.copyOf(elementData, size); 
    } 
} 
+0

Điều này kết thúc, trong bối cảnh của câu hỏi, lãng phí không gian không nó? Vì nó bây giờ không chỉ là các phần tử đã bị xóa, mà còn là bản thân mảng Array nằm trong phần giới hạn của GC –

3

Không, It wont xóa memory.After bạn clear().

Xem mã nguồn của rõ ràng()

public void More ...clear() { 
474   modCount++; 
475 
476   // Let gc do its work 
477   for (int i = 0; i < size; i++) 
478    elementData[i] = null; 
479 
480   size = 0; 
481  } 

Phương pháp này là làm cho các yếu tố hội đủ điều kiện cho Collector.Not rác làm sạch chúng ngay lập tức. Sau khi chạy GC, chúng đã biến mất.

1

Câu trả lời cho câu hỏi của bạn, nó sẽ KHÔNG giải phóng bộ nhớ. Nó sẽ chỉ loại bỏ tất cả các tham chiếu đối tượng. Bây giờ các đối tượng này có thể hoặc không thể được thu thập bởi bộ gom rác tùy thuộc vào cách chúng được tham chiếu ở những nơi khác. Ví dụ, Object 1 đề cập -> Object 2 ArrayList đề cập -> Object 2 ArrayList đề cập -> Object 3

Trong trường hợp này, sau khi Arraylist.clear(), đối tượng 3 sẽ được hưởng dọn dẹp nhưng không phải đối tượng 2.