자바 의 ArrayList reove (Object obj) 방법 에 대한 분석

2642 단어 자바
오늘 bug 를 바 꾸 었 는데 원래 프로그래머 가 쓴 equals 방법 에 문제 가 있 었 고 정말 문제 가 많 았 습 니 다.
Array List 의 reove (Object obj) 방법 도 살 펴 봤 습 니 다. 다음은 reove 방법 입 니 다.

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;
}

이 단락 의 remove 방법 은 특유 의 의미 가 있 습 니 다. list 의 중간 값 이 null 인 요 소 를 지 울 수 있 습 니 다!테스트 코드 는 다음 과 같 습 니 다:

import java.util.ArrayList;

public class TestListNullRemove {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("s1");
list.add("s2");
list.add(null);
list.add("s3");
list.add("s4");

System.out.println("before remove list size:"+list.size());
for(Object obj:list)
System.out.println(obj);
System.out.println();

list.remove(null);

System.out.println("after remove list size:"+list.size());
for(Object obj:list)
System.out.println(obj);
}
}


물론 들 어 오 는 요소 가 null 이 아 닐 때 먼저 요소 의 equals 방법 을 사용 하고 같 을 때 만 fastRemove 방법 을 사용 할 수 있 습 니 다.
다음은 remove 방법 은 주로 fastRemove 방법 을 호출 했 습 니 다. 그러면 fastRemove 방법 은 무엇 을 했 습 니까?fastRemove 방법 으로 하 는 동작 도 의미 가 있 습 니 다. 코드 는 다음 과 같 습 니 다.

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
}

알 수 있 듯 이 Array List 는 하나의 배열 (Array List, 하하) 을 사용 하여 값 을 참조 하 였 습 니 다. 그러나 이 코드 는 소 B 가 있 는 곳 이 두 군데 있 습 니 다. 하 나 는 이동 할 요소 뒤의 요 소 를 직접 배열 로 복사 하여 앞으로 이동 하 는 것 입 니 다 (요소 의 연속 성 유지). 다른 하 나 는 마지막 줄 코드 입 니 다.
4. 567913. 이 코드 의 역할 은 요 소 를 null 로 참조 하 는 것 입 니 다. 이렇게 하 는 목적 은 메모리 누 출 을 피 하 는 것 입 니 다 (그렇지 않 으 면 실제 배열 에 서 는 이 인용 이 있 습 니 다. gc 는 쓰레기 회수 가 불가능 합 니 다. 자바 의 스 택 데이터 구조의 실현 방식 과 유사 합 니 다), perfect!
자바 의 라 이브 러 리 는 큰 보물 이 라 고 해 야 합 니 다. 그러나 자신 이 시간 에 공력 이 부족 하 다 면 코드 는 알 아 볼 수 있 지만 묘 미 를 알 수 있 는 것 은 아 닙 니 다. 자신 이 오래 침 음 했 습 니 다. 지금 은 라 이브 러 리 에 대한 체험 이 점점 깊 어 지고 있 습 니 다. hehe!

좋은 웹페이지 즐겨찾기