Java의 비교 문제는 매우 기본적이고 혼동하기 쉽습니다. 오늘 저는 모든 사람의 학습 및 인터뷰에 도움이되기를 희망하면서 몇 가지 오류가 발생하기 쉬운 포인트의보다 자세한 요약 및 배치를 요약하고 구성 할 것입니다.
1. ==와 equals ()의 차이
우선, 우리는 ==와 equals ()의 차이점을 알아야합니다. == 부호는 항상 주소 값과 비교됩니다. 기본 데이터 유형의 경우 == 비교는 실제로 변수 값이 같고 참조 데이터 유형의 경우 주소 값을 비교합니다. 여기에 특별한주의를 기울여야 할 것은 문자열 유형이며, 당연한 것으로 받아들이는 것이 쉽고 실수를 쉽게합니다. equals () 메소드는 객체 클래스의 메소드입니다. Java의 모든 클래스는 기본적으로 객체 클래스를 상속하므로 클래스 객체는 equals () 메소드를 갖습니다. 객체 클래스의 equals () 메소드는 아래 그림에 나와 있습니다.
소스 코드에서 볼 수 있듯이 객체 클래스의 equals () 메소드의 기본 레이어도 ==를 사용하므로 실제로 주소 값입니다. 따라서 다른 비교를 위해 equals () 메소드를 사용하려면 equals () 메소드를 무시해야합니다.
2. 기본 데이터 유형 및 포장 유형
우리는 바이트, 짧은, int, long, boolean, char, double 및 float가 기본 데이터 유형이며, 선언하는 변수는 스택 메모리에 저장된다는 것을 알고 있습니다. 해당 포장 유형 (바이트, 짧은 정수, 길고 부울, 문자, 이중)에 의해 정의 된 변수는 힙 메모리에 존재합니다. 기본 데이터 유형의 경우 비교는 비교적 간단합니다. 그러나 포장 유형의 경우 약간 다릅니다.
먼저, 동등한 지 여부를 결정하려면 다음 코드의 실행 결과를 참조하십시오.
package dailytest; import org.junit.test;/*** Java의 비교 요약* @author yrr*/public class javacomparetest {/*** 정수 유형 판단은*/@test public void test01 () {int n3 = 48; System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n8); /false.out.println (n7 == n3); System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- system.println ()는 n2.intvalue () n6); nullpointexception}/*** 긴 유형 판단은 동일합니다*/@test public void test02 () {// 여기서 긴 정의를 사용할 때 L 또는 L이 필요하지 않지만 Long을 사용할 때는 오류 가보고됩니다. System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- n1); System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- system.out.println (n4 == n6); // long.intValue () 메소드를 사용할 때는 nullpointexception을 방지하기 위해 null인지 확인하기 위해주의를 기울여야합니다}}위의 실행 결과의 경우 다음과 같은 설명이 이루어집니다.
먼저, 새로운 방법의 경우 정수 또는 긴 개체를 선언합니다. 새 객체가 힙에 공간을 열기 때문에,이 둘의 값이 동일하더라도 == 주소 값을 비교하므로 거짓이 반환됩니다. 기본 데이터 유형의 래퍼 클래스의 경우 equals () 메소드가 다시 작성되고 숫자 크기가 비교되므로 equals () 메소드를 사용하여 숫자 크기에 따라 판단 할 수 있습니다. 정수 변수를 Int 변수와 비교하는 문제와 관련하여 비교 값은 숫자 크기를 기반으로합니다. 이는 비교할 때 정수 유형이 자동으로 풀리고 int 유형으로 변환되기 때문입니다. 처음 세 포인트에 대한 설명은 모든 포장 유형에 적용됩니다. 직접 할당 방법의 경우 값이 48 인 두 정수 변수는 == 부호로 판단되지만 값이 128 인 경우 거짓입니다. 맨 아래에서 정수 n1 = 48;의 경우 직접 할당 방법은 실제로 정수를 호출하기 때문입니다. value () 메소드. 아래 그림과 같이 integer.value () 메소드의 소스 코드를 간단히 살펴볼 수 있습니다.
우리는 여기에 if 판단이 있음을 알 수 있습니다. 입력 I가 [-128, 127]의 범위 내에 있으면 IntegerCache 어레이에서 직접 반환됩니다. 따라서이 범위의 값의 경우이 배열에 해당하는 주소 값이 반환되므로 == 부호를 사용하여 참 판단이 반환됩니다. 이 범위 내에 있지 않은 것은 새로운 객체이므로 거짓이 반환됩니다. 이 결론은 바이트, 짧은, 정수 및 긴 유형 (관심이있는 경우 해당 값 () 메소드의 소스 코드를 확인할 수 있습니다.).
크기 비교를 위해>, <, <=,> =를 사용하는 데 아무런 문제가 없으며 자동으로 Unboxed가됩니다. 그러나 우리는 일반적으로 다음 두 가지 방법을 사용하여 크기를 비교하는 것이 좋습니다.
xxxValue () 메소드를 호출하여 비교를 위해 기본 데이터 유형으로 변환하십시오. 래퍼 클래스에서는 비교 () 메소드가 다시 작성됩니다. Compareto () 소스 코드를 살펴보면 실제로 기본 사용량이 자동으로 Unboxing을 통해 해당 기본 데이터 유형으로 변환 된 다음 비교 함을 알 수 있습니다.
2. Java 객체의 비교
위의 소개를 통해 객체를 비교하는 것이 더 쉽습니다. 원칙은 동일합니다.
1. 문자열 유형 비교
문자열 유형은 직접>, <=,> = 및 <직접 사용할 수 없으며 컴파일 예외를보고합니다.
package dailytest; import org.junit.test;/*** java* @author yrr*/public class javacomparetest {@test public void test03 () {string s1 = new String ( "123"); 문자열 s2 = 새 문자열 ( "123"); System.out.println (S1 == S2); // false system.out.println (s1.equals (s2)); 문자열 s3 = "234"; 문자열 s4 = "234"; System.out.println (S3 == S4); // true system.out.println (s3.equals (s4)); // true //system.out.println(s1 <= s3); // 연산자 <는 인수 유형에 대해 정의되지 않았습니다. //진실 }}2. 클래스 객체 비교
클래스 객체의 결론은 동일하지만 기본 데이터 유형 및 문자열 유형과 비교하여 조금 더 복잡합니다.
특정 규칙에 따르면, 두 객체가 동일한지 여부를 결정하려면 Equals () 메소드를 판단 된 클래스에서 다시 작성해야합니다. 예제 코드는 다음과 같습니다.
package dailytest; import org.junit.test;/*** java* @author yrr*/public class javacomparetest {@test public void test04 () {person p1 = new Person ( "yrr", 18); 사람 P2 = 새로운 사람 ( "YRR", 18); System.out.println (p1 == p2); // false system.out.println (p2.equals (p1)); // true}} 클래스 개인 {개인 문자열 이름; 개인 정수 시대; 공개 사람 () {} 공개 사람 (문자열 이름, 정수 시대) {this.name = 이름; this.age = age; } public String getName () {return name; } public integer getage () {return age; } @override public boolean equals (Object obj) {person person = (person) obj; return name.equals (person.getname ()) && age.equals (person.getage ()); }}그리고 두 객체의 크기를 비교하려면 (일반적인 인터뷰 질문이기도합니다) 두 가지 방법이 있습니다.
비교 가능한 클래스는 비교 가능한 인터페이스를 구현하고 비교기 인터페이스를 구현하는 클래스를 정의하거나 내부 클래스를 사용하여 compare () 메소드를 재정의하는 클래스를 정의하기 위해 비교 () 메소드를 무시합니다. 이 차이를 통해 두 가지의 장점과 단점도 분명합니다. 전자는 간단하지만 비교 클래스의 수정이 필요하지만 후자는 원래 코드를 수정할 필요가 없으며, 이는 더 유연합니다.
첫 번째 방법 인 샘플 코드는 다음과 같습니다.
package dailytest; import org.junit.test;/*** java* @author yrr*/public class javacomparetest {@test public void test5 () {person p1 = new Person ( "yrr", 18); 사람 P2 = 새로운 사람 ( "WX", 19); System.out.println (p1.compareto (p2) <0); }} 클래스 사람이 비슷한 <person> {개인 문자열 이름을 구현합니다. 개인 정수 시대; 공개 사람 () {} 공개 사람 (문자열 이름, 정수 시대) {this.name = 이름; this.age = age; } public integer getage () {return age; } @override public int compareto (person o) {return this.getage () - o.getage (); }}두 번째 방법 인 샘플 코드는 다음과 같습니다.
패키지 비교기; import java.util.arrays; import java.util.comparator; public class mycomparator {public static void main (string [] args) {user [] new user [] {새 사용자 ( "U1001", 25), 새 사용자 ( "U1002", 20), 새로운 사용자 ( "U1003", 21)}; arrays.sort (user, new comparator <user> () {@override public int compart (user o1, user o2) {return o1.getage () -soggetage () getage ();}}); for (int i = 0; i <user.length; i ++) {user user = user [i]; System.out.println (user.getid () + "" + user.getage ()); }}} 클래스 사용자 {private String id; 사적인 int 연령; 공개 사용자 (문자열 ID, int age) {this.id = id; this.age = age; } public int getage () {반환 연령; } public void 설정 (int Age) {this.age = age; } public String getId () {return id; } public void setId (String id) {this.id = id; }}위는 이번에 내가 말한 Java 비교 질문의 관련 내용입니다. 다른 질문이 있으면 아래의 의견 영역에서 논의 할 수 있습니다. 지원해 주셔서 감사합니다.