Trong lớp Cấu trúc dữ liệu của tôi, chúng tôi đã nghiên cứu lớp Java ArrayList và cách nó phát triển mảng cơ bản khi người dùng thêm nhiều phần tử hơn. Điều đó được hiểu. Tuy nhiên, tôi không thể tìm ra cách chính xác lớp này giải phóng bộ nhớ khi có nhiều phần tử bị loại bỏ khỏi danh sách. Nhìn vào nguồn, có ba phương pháp loại bỏ các phần tử:Java: Cách ArrayList quản lý bộ nhớ
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
}
Không ai trong số đó giảm mảng dữ liệu. Tôi thậm chí còn bắt đầu đặt câu hỏi nếu bộ nhớ miễn phí lên bao giờ xảy ra, nhưng các thử nghiệm thực nghiệm cho thấy rằng nó. Vì vậy, phải có một số cách khác nó được thực hiện, nhưng ở đâu và như thế nào? Tôi đã kiểm tra các lớp cha mẹ cũng như không thành công.
Vui lòng định dạng lại mã của bạn. Stackoverflow không hiểu [code], vui lòng chỉnh sửa bài đăng của bạn, chọn đoạn mã và nhấn nút "Mã" để định dạng nó. – Behrang
Vâng, đây là bài đăng đầu tiên của tôi và tôi đang trong quá trình tìm hiểu cách sử dụng định dạng. Có người đã giúp tôi mặc dù :) – cka3o4nik