부적절한 사용으로 인한 메모리 유출 문제 집합
14475 단어 java 기초
코드 예
package trysome.doYourSelf;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Lokk {
private static class People{
int age;
String name;
People(String name,int age){
this.name=name;
this.age=age;
}
@Override
public int hashCode() {
// People HashCode
return age+name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj==this){
return true;
}
if (obj instanceof People){
return this.hashCode()==obj.hashCode();
}
return false;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
People p1=new People("aa",1);
People p2=new People("aa",2);
Map<People,Integer> map=new HashMap<>();
map.put(p1,111);
map.put(p2,111);
p1.setAge(23);
map.remove(p1);
// 1, 2, p1
System.out.println(map.size());
//
System.out.println(map.toString());
System.out.println("--------------------");
// p1 map
map.put(p1,111);
System.out.println(map.size());// 3,
// :
// {People{age=23, name='aa'}=111, People{age=2, name='aa'}=111, People{age=23, name='aa'}=111}
// 2
System.out.println(map.toString());
System.out.println("--------------------");
//
map.remove(p1);
map.remove(p1);
// {People{age=23, name='aa'}=111, People{age=2, name='aa'}=111}:
System.out.println(map.toString());
Integer re=map.get(p1);
System.out.println(re);// null: , , 。。。
}
}
왜 p1의age 속성을 수정한 후에removep1을 사용할 때 삭제할 수 없습니까?왜 다시 넣을 때 넣을 수 있어요?여기는HashMap의put작업과 관련이 있습니다. 처음 p1을 넣었을 때 p1의age,name 속성("aa",1)에 따라hashcode1을 생성하고hashcode에 따라 해시표의 아래 표시인 index1을 얻어 체인을 끊습니다.p1의age 속성을 수정한 후 p1을 삭제하든지 p1의age,name 속성을 통해hashcode2를 얻어서 해시표의 아래에 있는 index2로 포지셔닝해야 한다. 그러나ag2는 23이다. 즉,hashcode1과hashcode2는 다르기 때문에 포지셔닝된 index2도 다르기 때문에 삭제할 수 없다. index2 위치는 현재 요소가 없다.같은 이치로 p1을 다시 넣을 때 index2에 대응하는 위치를 넣는다. 넣은 후에 index1 위치의 요소가 존재하지만 인용을 잃었기 때문에 얻을 수도 삭제할 수도 없고 메모리 유출이 발생한다.다음에 넣은 것은 p1이 인용하고 있기 때문에 삭제할 수 있습니다.
총괄: 맵에 넣은 키를 변하지 않는 대상으로 하고 무심코 변경된 메모리 유출을 줄인다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 네트워크 프로그래밍의 UDP 서버 및 클라이언트 프로그램서버: 클라이언트: UDP: 클라이언트를 열어 데이터를 받을 때까지 기다린 다음 서버를 열어 데이터를 보냅니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.