Java에서 == 및 같음 분석
== 분석
1. 기본 데이터 유형의 경우 비교는 특정 내용이 동일한지 여부이며 메모리 주소와는 관련이 없습니다.
예:
public class Test{ public static void main(String[] args) { int i = 10; double j = 10.0; float m = 10.0f; char k = 10; boolean b = true; System.out.println(i == j); System.out.println(i == m); System.out.println(m == k); System.out.println("*******************"); //System.out.println(i == b); 很明显,布尔型不能和其他基本数据类型比较,编译报错. System.out.println(System.identityHashCode(i)); System.out.println(System.identityHashCode(j)); System.out.println(System.identityHashCode(m)); System.out.println(System.identityHashCode(k)); System.out.println(System.identityHashCode(b)); } }
출력:
true true true ******************* 366712642 1829164700 2018699554 1311053135 118352462
관련 영상 튜토리얼 추천: java 무료 영상 튜토리얼
분석:
①비교 결과와 메모리 주소에 따르면 내용은 같지만 메모리 주소가 , 그러나 반환된 결과는 모두 true입니다. 즉, 비교할 때 변수에 저장된 내용이 동일한지 여부만 확인하고 메모리 주소와는 아무런 관련이 없음을 의미합니다.
②==비교의 양쪽 데이터를 강제로 동일한 유형으로 변환해야 합니다. 예를 들어 int와 double의 비교는 강제로 두 배가 됩니다.
3Boolean형은 int, float, double, char 등의 기본 데이터형과 비교할 수 없으며, 컴파일 시 오류가 발생합니다.
2. 참조 데이터 유형 비교:
public class Test{ public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); String name1 = "琼宝"; String name2 = "琼宝"; System.out.println(name1 == name2); // true System.out.println(System.identityHashCode(name1)); //366712642 System.out.println(System.identityHashCode(name2)); //366712642 System.out.println(t1 == t2); //false System.out.println(System.identityHashCode(t1)); //366712642 System.out.println(System.identityHashCode(t2)); //1829164700 System.out.println(System.identityHashCode(new Test())); //2018699554 System.out.println(System.identityHashCode(new Test())); //1311053135 System.out.println(new Test() == new Test()); } }
출력:
true 366712642 366712642 false 366712642 1829164700 2018699554 1311053135 false
분석:
① 참조 데이터 유형의 경우 두 가지 메모리 문제가 관련되며 비교에는 메모리 주소가
Test t1 = new Test() Test t2 = new Test()
명령문을 실행할 때 두 개의 메모리 조각이 열립니다. 하나는 t1 t2를 저장하기 위한 것이고 다른 하나는 두 개의 새로운 Test()를 저장하기 위한 것입니다. t1과 t2의 메모리 주소가 다른 것은 당연하고, 두 new Test()의 주소도 다르기 때문에 이때 ==를 사용하여 비교하면 결과는 false가 되어야 합니다.
(보충 : t1과 t2에 저장되는 것은 실제로 새로운 Test() 객체가 사용하는 메모리의 첫 번째 주소입니다. )
②String 유형의 경우 내용이 동일하면 메모리 주소도 동일하며, 비교할 때 주소도 살펴봅니다.
객체에 저장된 내용이 동일한지 비교하려면(주소 비교가 아님) ==를 구현할 수 없으며 같음이 필요합니다.
equals 분석
1. 먼저 같음 비교의 예를 살펴보겠습니다.
public class TestEquals { public static void main(String[] args) { TestEquals t1 = new TestEquals(); TestEquals t2 = new TestEquals(); System.out.println(t1.equals(t2)); //false String s1 = new String(); String s2 = new String(); System.out.println(System.identityHashCode(s1)); System.out.println(System.identityHashCode(s2)); System.out.println(System.identityHashCode(new String())); System.out.println(System.identityHashCode(new String())); System.out.println(s1.equals(s2)); // true } } 输出结果: false 366712642 1829164700 2018699554 1311053135 true
2. 분석:
①t1과 t2의 비교는 거짓이고 s1과 s2의 비교는 true입니다. 메소드 재작성 문제에 대해서는 먼저 Object 클래스의 equals 소스 코드를 살펴보십시오.
public boolean equals(Object obj) { return (this == obj); }
② s1.equals(s2)의 경우 이는 s1이고 obj는 s2이며 소스 코드의 비교에서는 다음을 사용합니다. ==, 이는 명백한 참조입니다. 데이터 유형 비교는 s1과 s2의 메모리 주소를 살펴봅니다. 위 분석에서는 이미 두 주소가 서로 다르다는 것을 알고 있으므로 결과는 당연히 거짓입니다.
③s1과 s2의 비교 결과 s2는 true입니다. 이는 String 클래스에서 equals 메소드가 다시 작성되었기 때문입니다. 소스 코드를 참조하세요:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; 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; }
4 이를 object의 equals 소스 코드와 비교하면 String no에서 equals 메소드가 있음을 알 수 있습니다. 이상은 개체의 주소를 비교하지만 두 개체의 내용 또는 두 개체의 속성이 동일한지 확인합니다.
⑤String, Date, File 등과 같은 클래스는 모두 equals 메소드를 다시 작성했습니다.
요약:
1.== 기본 데이터 유형을 비교할 때 비교되는 것은 내용이 동일한지 여부입니다. 참조 데이터 유형을 비교할 때 살펴보는 것은 메모리 주소가 동일한지 여부입니다.
2.equals는 참조 데이터 유형(객체)만 비교할 수 있습니다. 다시 작성하기 전에는 ==를 사용하여 메모리 주소를 비교합니다. 다시 작성한 후에는 객체의 특정 내용과 속성이 일치하는지 여부를 비교합니다.
더 많은 관련 기사와 튜토리얼을 보려면 다음을 방문하세요. Java 프로그래밍 소개
위 내용은 Java에서 == 및 같음 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

자바의 암스트롱 번호 안내 여기에서는 일부 코드와 함께 Java의 Armstrong 번호에 대한 소개를 논의합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다
