Java의 데이터 유형은 두 가지 범주로 나눌 수 있습니다.
1. 기본 데이터 유형, 기본 데이터 유형이라고도 합니다. byte, short, char, int, long, float, double, boolean을 비교하려면 이중 등호(==)를 사용하고 해당 값을 비교합니다.
2. 복합 데이터 유형(클래스) (==)을 사용하여 비교하면 메모리의 저장 주소와 비교되므로 동일한 새 객체가 아닌 경우 비교 결과는 true입니다. 결과는 거짓입니다. JAVA의 모든 클래스는 기본 클래스 Object에서 상속됩니다. 이 메서드의 초기 동작은 개체의 메모리 주소를 비교하는 것입니다. 그러나 일부 클래스 라이브러리에서는 이 메서드가 재정의됩니다. , Integer 및 Date, equals는 힙 메모리에 있는 클래스의 저장 주소를 비교하는 대신 이러한 클래스에서 자체 구현을 갖습니다. 복합 데이터 유형 간의 같음 비교의 경우, 같음 메서드를 재정의하지 않고 둘 사이의 비교는 여전히 메모리에 있는 저장 위치의 주소 값을 기반으로 합니다. Object의 같음 메서드도 이중 등호( ==)를 사용하기 때문입니다. 이므로 비교 결과는 이중 등호(==)의 결과와 동일합니다.
다음과 같이 코드 코드를 복사합니다 .
공공클래스 TestString {
publicstaticvoid main(String[] args) {
문자열 s1="월요일";
문자열 s2="월요일";
만약 (s1 == s2)
{
System.out.println("s1 == s2");}
또 다른{
System.out.println("s1 != s2");}
}
}
프로그램을 컴파일하고 실행하면 다음과 같이 출력됩니다. s1 == s2 참고: s1과 s2는 동일한 문자열 개체인 "Monday"를 참조합니다. 2. 프로그램을 약간 변경하면 훨씬 더 이상한 것을 발견할 수 있습니다.
다음과 같이 코드 코드를 복사합니다 .
공공클래스 TestString {
publicstaticvoid main(String[] args)
{
문자열 s1="월요일";
String s2 =new String("월요일");
if (s1 == s2) {System.out.println("s1 == s2");
}
또 다른
{
System.out.println("s1 != s2");
}
if (s1.equals(s2))
{
System.out.println("s1은 s2와 같습니다");
}
또 다른
{
System.out.println("s1은 s2와 같지 않습니다.");
}
}
}
s2에 대한 프로그램 출력을 생성하기 위해 new 연산자를 사용합니다: s1 != s2 s1 = s2 참고: s1과 s2는 각각 두 개의 "월요일" 문자열 개체를 참조합니다.
3. 문자열 버퍼 풀 프로그램이 실행 중일 때 문자열 버퍼 풀을 생성한다는 사실이 밝혀졌습니다. s2 = "Monday"와 같은 표현식을 사용하여 문자열을 생성하면 프로그램은 먼저 문자열에서 동일한 값을 찾습니다. 버퍼 풀 개체, 첫 번째 프로그램에서는 s1이 먼저 풀에 넣어졌으므로 s2가 생성되었을 때 프로그램은 동일한 값을 가진 s1을 발견하고 두 번째 프로그램에서는 s1이 참조하는 개체 "Monday"를 참조했습니다. new 연산자를 사용하여 그는 프로그램에 다음과 같이 명확하게 말합니다. "나는 새로운 것을 원합니다! 이전 것이 아닙니다!" 따라서 새로운 "월요일" Sting 객체가 메모리에 생성됩니다. 가치관은 같지만 위치가 다릅니다. 하나는 수영장에서 수영하고 다른 하나는 해안에서 쉬고 있습니다. 이런, 자원 낭비가 분명합니다. 왜 분명히 동일할 때 분리해야 합니까?
4. 프로그램을 다시 변경하십시오.
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 TestString
{
publicstaticvoid main(String[] args)
{
문자열 s1="월요일";
String s2 =new String("월요일");
s2 = s2.intern();
만약 (s1 == s2)
{
System.out.println("s1 == s2");
}
또 다른
{
System.out.println("s1 != s2");
}
if (s1.equals(s2))
{
System.out.println("s1은 s2와 같습니다");
}
또 다른
{
System.out.println("s1은 s2와 같지 않습니다.");
}
}
}
이번에는 다음을 추가했습니다: s2 = s2.intern(); 프로그램 출력: s1 == s2 s1은 s2입니다. (java.lang.String의 intern() 메소드 "abc".intern() 메소드의 반환 값은 여전히 문자열입니다. " abc", 표면적으로는 이 방법이 아무 쓸모가 없는 것처럼 보이지만 실제로는 작은 트릭을 수행합니다. 즉, 문자열 풀에 "abc"와 같은 문자열이 있는지 확인하고 존재하는 경우 해당 문자열을 반환합니다. 문자열이 존재하지 않으면 이 메서드는 문자열 풀에 "abc"를 추가한 다음 해당 참조를 반환합니다.