Interfejs List
zawiera dwie metody: -i remove(int)
.
Realizacja remove(Object)
w Javie 6 jest następująca:
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;
}
Realizacja remove(int)
w Javie 6 jest:
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;
}
W pierwszym przykładzie, jesteś rzeczywiście wywołanie remove(int)
metoda, która usuwa obiekt z określonego indeksu. W tym przypadku określono indeks 2, który w rzeczywistości jest wartością "3".
W drugim przykładzie, jesteś wywołanie metody remove(Object)
, ponieważ nie jest to metoda remove(long)
i long
nie zostanie przekształcony w int
. W oparciu o implementację metody remove(Object)
, szuka równości obiektów. Ponieważ twoja lista zawiera obiekty typu Integer
i podajesz Long
, nic jej nie dorówna.
Poniższa metoda jest chyba lepszym przykładem tego, co się dzieje:
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);
}
Wyjście z tego kodu jest:
Removing intNum
List = [1, 2, 3]
List = [1, 2]
Removing longNum
List = [1, 2, 3]
List = [1, 2, 3]
Teraz widać, że list.remove (2) usuwa element z indeksem 2, a nie całkowitą 2, należy dokonać wskaż jawnie rzutować na "int" lub "Integer" lub ryzykujesz tylko wprowadzeniem w błąd. – Neil
To może być miłe pytanie do wywiadu technicznego. – beetstra