ArrayList의 remove 방법을 간단히 분석하다

13931 단어

ArrayList의 remove 방법을 간단히 분석하다


1,remove 방법으로list 집합의 데이터 삭제 1,Test 클래스에List 집합을 만들고 대상을 추가
ArrayList<Person> list = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
list.add(p1);
list.add(p2);
System.out.println(list.size());//2
String name = list.remove(0);
System.out.println(list.size());//1

2. Person 클래스를 만들고 Object 클래스를 다시 쓰는 equals () 방법
public String id;
public Person(String id) {
this.id = id;
}
// Object equals() 
@Override
public boolean equals(Object obj) {
System.out.println(id);
return super.equals(obj);
}

2. Remove 베이스 코드 1. 베이스 코드에서 Array List의 Remove () 방법은 전송 대상의 equals () 방법을 호출한다
//ArrayList 
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;
}

이 코드를 통해 알 수 있듯이'Object o'는 리모브 방법의 대상을 대표하고 요소 데이터 [index]는list의 대상을 대표한다.Arrary List의remove(Object obj) 방법을 호출하면 실질적으로remove의 대상과list의 대상을 비교하고, 비교하는 방법은 Object 클래스의equals 방법을 호출하여 두 대상의 메모리 주소가 같은지 비교하는 것이다.
2. Person 클래스의 내용을 비교하려면 equals 방법을 다시 써야 한다. 상향 전환 대상에서 Person 대상을 삭제하려면 우리는 원래의 Person 대상의 내용과 똑같은 대상을 만들어야 한다. 그러나 이것은 삭제할 수 없는 것이 분명하다. 왜냐하면 Remove 방법을 사용할 때 Person의 equals 방법을 사용했기 때문이다. Person 클래스는 Object의 equals 방법을 다시 쓰지 않았기 때문이다.그래서 Object의 equals 방법을 호출한 것은 본질적으로 두 대상의 메모리 주소를 비교한 것이고 분명히 다르다.그렇다면 우리 Person 클래스의 내용을 비교하려면 어떻게 해야 하나요?이때, 우리는 Person 클래스에서 Object의 equals 방법을 다시 써야 한다.방법은 다음과 같습니다.
@Override
public boolean equals(Object obj) {
	Person person = (Person) obj;
	return this.id.equals(person.id);
}

3. remove(Object obj) 방법의 세부 보충 데이터 유형 변환 오류 및 해결 방법
ArrayList<Object> list = new ArrayList<>();
list.add(new Person());
list.add(new Dog());
System.out.println(list.size());//2
boolean b = list.remove(new Person());
System.out.println(b);//true
System.out.println(list.size());//1

이 오류는 Object가 모든 클래스의 직접 또는 간접적인 부모 클래스이기 때문에 Person 클래스의 equals 방법은 모든 종류의 매개 변수를 전송할 수 있지만 Person person = (Person) obj를 실행합니다.문을 열 때 Dog 클래스를 Person으로 강제로 변환할 수 없으므로 데이터 유형 변환 오류가 발생합니다.이 문제는 다음과 같이 Person 클래스의 equals 방법에 건장성 판단을 넣어 해결할 수 있다.
@Override
public boolean equals(Object obj) {
	if (!(obj instanceof Person)) {
		throw new ClassCastException(" ");
	}
	Person person = (Person) obj;
	return this.id.equals(person.id);
}

좋은 웹페이지 즐겨찾기