Giao diện List
chứa hai phương thức remove()
- remove(Object)
và remove(int)
.
Việc thực hiện remove(Object)
trong Java 6 như sau:
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;
}
Việc thực hiện remove(int)
trong Java 6 là:
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;
}
Trong ví dụ đầu tiên của bạn, bạn đang thực sự gọi remove(int)
, loại bỏ đối tượng tại chỉ mục được chỉ định. Trong trường hợp này, bạn đã chỉ định chỉ mục 2, thực tế là giá trị "3".
Trong ví dụ thứ hai, bạn đang gọi phương thức remove(Object)
, vì không có phương thức remove(long)
và long
sẽ không được chuyển đổi thành int
. Dựa trên việc thực hiện phương thức remove(Object)
, nó sẽ tìm đối tượng bình đẳng. Vì danh sách của bạn chứa các đối tượng thuộc loại Integer
và bạn đang cung cấp Long
, sẽ không có đối tượng nào khớp với nó.
Các phương pháp sau đây có lẽ là một ví dụ tốt hơn về những gì đang xảy ra:
public static void main(String[] args) {
ArrayList<Integer> list;
System.out.println("Removing intNum");
int intNum = 2;
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
System.out.println("List = " + list);
list.remove(intNum);
System.out.println("List = " + list);
System.out.println("Removing longNum");
long longNum = 2;
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
System.out.println("List = " + list);
list.remove(longNum);
System.out.println("List = " + list);
}
Kết quả của mã này là:
Removing intNum
List = [1, 2, 3]
List = [1, 2]
Removing longNum
List = [1, 2, 3]
List = [1, 2, 3]
Bây giờ bạn thấy rằng yếu tố list.remove (2) là loại bỏ tại chỉ số 2 và không số nguyên 2, bạn nên tạo một điểm đến rõ ràng chuyển sang "int" hoặc "Integer" hoặc bạn chỉ có nguy cơ gây nhầm lẫn cho bản thân. – Neil
Đây có thể là một câu hỏi hay cho một cuộc phỏng vấn kỹ thuật. – beetstra