Object 클래스 분석(equals 및 hashCode 지식 포인트)
public final native Class>getClass();// java
public native int hashCode();
public boolean equals(Object obj)
protected Object clone();
public String toString();
public final void notify();
public final void notifyAll();
public final void wait(long timeout);
protected void finalized();
1. equals 및 hashCode
문서를 본 후에 우리는 원본 코드를 보았는데hashCode는native 키워드로 수식되었고equals 방법은 메모리 주소를 직접 ==으로 비교한 것을 발견했다.
public boolean equals(Object obj) {
return (this == obj);
}
equals와hashCode는 대상을 표시하는 데 사용되며, 정렬되지 않은 상황에서 두 대상이 같은지 비교할 수 있습니다. (대상 그룹에서 비교기를 사용할 수 있습니다.)
그러면 hashCode 원본에 제시된 주석을 자세히 살펴보겠습니다.
/**
* Returns a hash code value for the object. This method is
* supported for the benefit of hash tables such as those provided by
* {@link java.util.HashMap}.
*
* The general contract of {@code hashCode} is:
*
* - Whenever it is invoked on the same object more than once during
* an execution of a Java application, the {@code hashCode} method
* must consistently return the same integer, provided no information
* used in {@code equals} comparisons on the object is modified.
* This integer need not remain consistent from one execution of an
* application to another execution of the same application.
*
- If two objects are equal according to the {@code equals(Object)}
* method, then calling the {@code hashCode} method on each of
* the two objects must produce the same integer result.
*
- It is not required that if two objects are unequal
* according to the {@link java.lang.Object#equals(java.lang.Object)}
* method, then calling the {@code hashCode} method on each of the
* two objects must produce distinct integer results. However, the
* programmer should be aware that producing distinct integer results
* for unequal objects may improve the performance of hash tables.
*
*
* As much as is reasonably practical, the hashCode method defined by
* class {@code Object} does return distinct integers for distinct
* objects. (This is typically implemented by converting the internal
* address of the object into an integer, but this implementation
* technique is not required by the
* Java™ programming language.)
연신: equals와 ==의 차이: 기본 유형에 있어 ==는 내용을 비교한다.인용 데이터 형식에 대해 말하자면, ==는 주소를 비교한다.인용 데이터 형식(String, Integer,date 등)에 대해 equals와hashCode를 다시 썼는데 비교한 것이 바로 내용이다.인용 데이터 형식에 대해 equals와hashCode를 다시 쓰지 않은 경우 Object의 equals 방법을 적용하고 주소를 비교한다.
재연신: 그럼 스트링이 다시 쓴 equals 원본을 보러 가자.
public boolean equals(Object anObject) {
if (this == anObject) {// ,
return true;
}
if (anObject instanceof String) {// String ,
String anotherString = (String)anObject;
int n = value.length;//value String
if (n == anotherString.value.length) {//
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
OK, 그럼 String은 먼저 두 대상의 주소가 같은지 아닌지를 판단한 다음에 아래로 전환한 다음에 문자 그룹으로 전환해서 뒤에서 앞을 두루 비교한다.
2.toString
/**
* Returns a string representation of the object. In general, the
* {@code toString} method returns a string that
* "textually represents" this object. The result should
* be a concise but informative representation that is easy for a
* person to read.
* It is recommended that all subclasses override this method.
*
* The {@code toString} method for class {@code Object}
* returns a string consisting of the name of the class of which the
* object is an instance, the at-sign character `{@code @}', and
* the unsigned hexadecimal representation of the hash code of the
* object. In other words, this method returns a string equal to the
* value of:
*
*
* getClass().getName() + '@' + Integer.toHexString(hashCode())
*
*
* @return a string representation of the object.
*/
public String toString() {
return getClass().getName() + "@"+ Integer.toHexString(hashCode());
} 대상을 텍스트로 표시 Object는 기본적으로 바이트 코드 파일의 이름 + @ + 메모리 주소의 int 맵 을 되돌려줍니다
clone () 방법
일반 자바의 값은 복제 대상의 인용 (=) 이고 (클래스 초기화 상태가 같지 않음) 얕은 복사입니다.깊이 있는 복사를 실현하려면 (구성원 변수의 초기화 상태도 마찬가지) 구성원 변수가 모두 한 부 복사되어 (가변적인 인용일 경우) '=' 은 얕은 복사에 속한다.따라서 심층 복사는 구성원 변수(가변적인 인용일 경우)를 모두 한 부 복사하고, 얕은 복사는 구성원 변수를 복제하지 않는다.양자의 초기화 정도는 같지 않다.
clone 사용법: 클론의 객체는 Cloneable 인터페이스를 구현해야 합니다 . 클론을 다시 쓰는 방법은public 로 수식하는 것이 가장 좋다.
예: 짧은 복사 Timepublic class Time implements Cloneable{
//
private Date date;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
예: 딥 카피 Timepublic class Time implements Cloneable{
//
private Date date;
@Override
protected Object clone() throws CloneNotSupportedException {
// Time
Time time=(Time)super.clone();
//
time.date=(Date)date.clone();
//
return time;
}
}
wait와 notify 방법
스레드 간 통신 APIwait, notify, notify All()든 모두 감청기 대상(자물쇠 대상)이 호출해야 합니다. 그들은 모두 동기화 코드 블록에서 호출됩니다. 그렇지 않으면 이상이 발생합니다! notify () 는 대기열의 어떤 라인을 깨운다. (어느 라인을 깨울지 알 수 없다.) notify All () 는 대기열의 모든 라인을 깨운다. wait()의 라인이 깨어나면 4가지 경우 스레드 중단 wait()시간 다 됐어요 notify()에 깨어나기 notifyAll()에 깨어나기 wait()의 라인을 호출하면 자물쇠가 풀립니다 몇몇 면접 문제: 왜 wait와 notify가 Object 방법에 있습니까?자물쇠는 대상 자물쇠이기 때문에 라인이 어떤 대상의 자물쇠를 기다리게 하려면 대상이 조작해야 한다
notify 방법이 호출되면 무슨 일이 일어날까요?대기 대기열의 어떤 루틴 주석을 깨웁니다: 즉시 깨우지는 않습니다. notify의synchronized 코드 블록이 실행된 후에야 잠금 대상을 얻을 수 있습니다.
Thread.sleep 및 Object.wait 차이?sleep는 대상 자물쇠의 제어를 방출하지 않고,wait는 제어합니다.
finalize 방법
이것은 GC 이전에 JVM에 호출되는 방법으로 특정한 메모리에 GC를 사용하는데 보통 다시 쓰지 않고 일부 JNI 작업의 gc에 사용된다.
따라서hashCode와 equals는 대상 비교에 사용되고clone은 대상 복제에 사용되며 toString은 대상 표식에 사용되며 notify와wait는 대상 자물쇠와 관련이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.