JAVA 에서 equals,==hashcode 와 의 차이

(1)==
 자바 에서 데이터 형식 은 두 가지 로 나 뉜 다.
(1)기본 데이터 형식:byte,char,short,int,float,double,long,boolean.기본 데이터 형식 을 비교 할 때==그들의 값 을 비교 합 니 다.
(2)참조 형식(클래스,배열,인터페이스):등호 로 이 세 가지 유형 을 비교 할 때 메모리 에 저 장 된 주 소 를 비교 합 니 다.
        대상 은 더미 에 저 장 된 것 이 고 스 택 에 저 장 된 것 은 대상 의 참조 주소 이기 때문에==비교 할 때 스 택 에 저 장 된 값 을 사용 합 니 다.
실례 1:
	public static void main(String[] args) {
		int int1 = 12;
		int int2 = 12;
		Integer Integer1 = new Integer(12);
		Integer Integer2 = new Integer(12);
		Integer Integer3 = new Integer(127);

		Integer a1 = 127;
		Integer b1 = 127;

		Integer a = 128;
		Integer b = 128;

		String s1 = "str";
		String s2 = "str";
		String str1 = new String("str");
		String str2 = new String("str");
		
		 //int1==int2:true 
		System.out.println("int1==int2:" + (int1 == int2));
		
		//int1==Integer1:true    Integer1     int,   true
		System.out.println("int1==Integer1:" + (int1 == Integer1)); 
		
		//Integer1==Integer2:false          ,           
		System.out.println("Integer1==Integer2:" + (Integer1 == Integer2));
		
		//Integer3==b1:false  Integer3  new     ,b1      127  ,    
		System.out.println("Integer3==b1:" + (Integer3 == b1));
		
		
		//a1==b1:true Integer         -128  -- 127           ,
		// Integer a1   127    ,  Integer b1          ,  new,    
		System.out.println("a1==b1:" + (a1 == b1));
		
		//a==b:false   a1,b1       new
		System.out.println("a==b:" + (a == b));

		//s1==s2:true       String     ,     
		System.out.println("s1==s2:" + (s1 == s2));
		
		//s1==str1:false
		System.out.println("s1==str1:" + (s1 == str1));
		
		//str1==str2:false
		System.out.println("str1==str2:" + (str1 == str2));
	}

보충:
JVM 메모 리 는 네 가지 로 나 뉜 다.1.스 택 구역(stacksegment)-컴 파일 러 에 의 해 자동 으로 분배 되 고 함 수 를 저장 하 는 매개 변수 값,부분 변수의 값 등 구체 적 인 방법 이 실 행 된 후에 시스템 은 JVM 메모리 자원 2,쌓 기 구역(hepsegment)을 자동 으로 방출 한다.보통 프로그래머 에 의 해 분배 되 고 new 가 만 든 대상 과 배열 을 저장 하 며 jvm 은 이 대상 을 정시 에 보지 않 는 다.이 대상 을 가리 키 는 인용 이 없 으 면 3,정적 구역(datasegment)을 회수 합 니 다.전역 변 수 를 저장 하고 정적 변수 와 문자열 상수 를 저장 하 며 방출 하지 않 습 니 다.
4.코드 영역(codesegment)-프로그램 에 있 는 방법 을 저장 하 는 바 이 너 리 코드 이 고 여러 대상 이 하나의 코드 공간 구역 을 공유 합 니 다.
(2):equals()
JAVA 의 모든 클래스 는 Object 라 는 초 클래스 에 계승 되 어 Object 클래스 에서 equals 방법 을 정 의 했 습 니 다.이 방법의 초기 행 위 는 대상 의 메모리 주 소 를 비교 하 는 것 이지 만 일부 라 이브 러 리 에 서 는 String,Integer,Date 와 같은 방법 으로 복사 되 었 습 니 다.이러한 클래스 에서 equals 는 메모리 에 저 장 된 주 소 를 비교 하 는 것 이 아니 라 자신 만 의 실현 이 있 습 니 다. 따라서 복합 데이터 형식 간 에 equals 비 교 를 하고 equals 방법 을 덮어 쓰 지 않 은 상황 에서 그들 간 의 비 교 는 메모리 에 저 장 된 위치의 주소 값 으로 이등 호(==)의 결과 와 같다.복사 되면 복사 요구 에 따라. 【특히 주의]Object 클래스 의 equals 방법 은"=="과 같 습 니 다.차이 가 없습니다.String 류,Integer 류 등 일부 종 류 는 equals 방법 을 다시 써 서 equals 와"==다르다"는 것 입 니 다.따라서 자신 이 종 류 를 만 들 때 Object 의 equals 방법 을 자동 으로 계승 합 니 다.서로 다른 비 교 를 실현 하려 면 equals 방법 을 다시 써 야 합 니 다.
"=="은"equal"보다 운행 속도 가 빠 릅 니 다.왜냐하면"=="은 비교적 참조 일 뿐 입 니 다.
주의 규범:"".equals(str);str.equals(")가 아 닙 니 다.
str 가 비어 있 을 수 있 기 때문에 오류 가 발생 하기 쉬 우 므 로 일반적으로 비교 되 어야 할 상수 가 앞 에 적 혀 있 습 니 다.
보충:equals 방법 으로 이 루어 진 규칙
자 반성:비어 있 지 않 은 인용 값 x,x.equals(x)는 true 로 돌아 가 야 합 니 다. 대칭 성:비 어 있 는 참조 값 x 와 y 에 대해 y.equals(x)가 true 로 돌아 갈 때 x.equals(y)는 true 로 돌아 가 야 합 니 다. 전달 성:비 어 있 는 참조 값 x,y,z 에 대해 x.equals(y)가 true 로 돌아 가 고 y.equals(z)가 true 로 돌아 가면 x.equals(z)는 true 로 돌아 가 야 합 니 다. 
일치 성:빈 인용 값 x 와 y 에 대해 x.equals(y)를 여러 번 호출 하여 true 로 되 돌아 가 거나 false 로 되 돌아 갑 니 다.전 제 는 대상 의 equals 비교 에 사용 되 는 정보 가 수정 되 지 않 았 다 는 것 입 니 다. 
비어 있 지 않 은 인용 값 x,x.equals(null)는 false 로 돌아 가 야 합 니 다. 
(3):hashcode()
Object 클래스 의 hashCode()방법 에 대한 실현.대상 의 Object 클래스 의 해시 코드 값 은 이 대상 의 메모리 주소 와 관련 된 int 값 입 니 다.서로 다른 대상 의 메모리 주 소 는 다르다.이 대상 의 해시 코드 값 을 되 돌려 줍 니 다.이 방법 을 지원 하 는 것 은 해시 표(예 를 들 어 자바 util.Hashtable 이 제공 하 는 해시 표)의 성능 을 향상 시 키 기 위 한 것 입 니 다. hash Code 의 일반적인 협정 은: 자바 응용 프로그램 이 실행 되 는 동안 같은 대상 에 대해 hashCode 방법 을 여러 번 호출 할 때 같은 정 수 를 일치 하 게 되 돌려 야 합 니 다.전 제 는 대상 을 equals 비교 할 때 사용 하 는 정보 가 수정 되 지 않 았 다 는 것 입 니 다.한 프로그램의 한 번 실행 에서 같은 프로그램의 다른 실행 까지 이 정 수 는 일치 할 필요 가 없다. equals(Object)방법 에 따라 두 대상 이 같다 면 이 두 대상 중의 모든 대상 에 대해 hashCode 방법 을 호출 할 때 같은 정수 결 과 를 만들어 야 합 니 다. equals(java.lang.Object)방법 에 따라 두 대상 이 같 지 않 으 면 이 두 대상 중 한 대상 에 대해 hashCode 방법 을 호출 하여 반드시 다른 정수 결 과 를 생 성 하 라 고 요구 하지 않 습 니 다.그러나 프로그래머 는 서로 다른 대상 을 위해 서로 다른 정수 결 과 를 만 들 면 해시 표 의 성능 을 향상 시 킬 수 있다 는 것 을 의식 해 야 한다. 실제로 Object 류 가 정의 하 는 hashCode 방법 은 서로 다른 대상 에 대해 서로 다른 정 수 를 되 돌려 줍 니 다.(이것 은 일반적으로 이 대상 의 내부 주 소 를 하나의 정수 로 바 꾸 는 것 을 통 해 이 루어 지지 만 자바 TM 프로 그래 밍 언어 는 이러한 실현 기술 이 필요 하지 않다.)해시 코드 는 해시 코드 라 고도 부른다.대상 을 얻 은 해시 코드:대상 의 해시 코드 가 양수 의 수치 범위 내 에 고 르 게 흩 어 져 있 도록 요구 합 니 다.대상 을 해시 표 의 선형 표 에 골 고루 분산 시 킬 수 있다.hashCode 방법 은 대상 이 선형 표 에 있 는 위 치 를 확인 하 는 데 사용 된다.고속 접근 요소 입 니 다.equals 는 set 에 있 는 요소 의 유일 성 을 확보 하 는 데 사용 되 며,대상 이 대응 하 는 유형 에 hashCode 를 다시 쓰 는 방법 이 없다 면.만약 두 대상 의 해시 코드 값 이 같다 면 무엇 을 설명 합 니까?두 대상 이 같은 대상 임 을 설명 하고 같은 메모리 영역 을 가리킨다.

좋은 웹페이지 즐겨찾기