>  기사  >  Java  >  Java에서 부울과 부울의 차이점은 무엇입니까

Java에서 부울과 부울의 차이점은 무엇입니까

PHPz
PHPz앞으로
2023-05-05 19:40:043063검색

머리말

누군가가 물었습니다. 부울 값에는 true와 false 두 가지 유형만 있지 않나요? 그가 정의한 속성에 null 값이 있는 이유는 무엇입니까?

먼저 boolean이 Java의 기본 데이터 유형이고 Boolean이 Java의 클래스라는 점을 분명히 해야 합니다. 부울 유형은 "0 할당" 단계에서 속성에 false를 할당합니다. Boolean은 "0 값 할당" 단계에서 개체에 null을 할당하는 클래스입니다.

정적 속성인 경우 클래스가 로드될 때 할당됩니다. 일반 클래스 속성인 경우 개체가 인스턴스화될 때 값이 할당됩니다. 이 두 가지 점은 "클래스 로딩 메커니즘"과 "객체 생성 프로세스"를 이해하는 데 도움이 될 수 있습니다.

클래스 로딩 메커니즘:

  • 로딩: 클래스의 전체 이름을 기반으로 클래스의 이진 바이트 스트림을 얻고, 클래스를 메모리에 로드하고, 힙에서 클래스를 나타내는 클래스 객체를 생성합니다. 메소드 영역 데이터 진입

  • 검증: 클래스 파일의 바이트 스트림이 JVM 사양을 준수하는지 확인

  • 준비: 메소드 영역에 클래스의 정적 속성에 대한 메모리를 할당하고 기본값을 초기화합니다. value (boolean의 기본값은 false, Boolean 기본값은 null)

  • 분석: 상수 풀의 기호 참조를 직접 참조로 변환합니다. 이는 개체 참조를 포인터로 변환하는 것으로 이해할 수 있습니다.

  • 초기화: 실제로 클래스의 코드 실행, 정적 속성 할당 및 정적 블록을 시작합니다.

객체 인스턴스화 프로세스:

  • 클래스가 로드되었는지 확인(부모 위임)

  • 객체에 메모리 공간 할당(포인터) 충돌)

  • 0값 초기화(false/null)

  • 객체 헤더 설정(객체 생성 연령 및 기타 정보)

  • 메소드 실행(속성 초기화, 명령문 블록 및 구성 메소드) )

Boolean은 로드만 되었고 아직 인스턴스화되지 않았으며 인스턴스화되기 전에 메모리가 할당되지 않았으므로 null입니다

다음으로 Boolean이 어떻게 boolean을 래핑하는지 이해하기 위해 Boolean의 속성과 구성 방법을 살펴볼 수 있습니다

// final boolean类型的属性,通过构造方法注入值
private final boolean value;

// 构造方法 Boolean a = true 实际上就是调用这个方法
public Boolean(boolean value) {
    this.value = value;
}

// 构造方法
public Boolean(String s) {
    this(parseBoolean(s));
}

다른 속성이나 방법은 직접 확인하시면 됩니다. 모두 비교적 간단합니다

Boolean 사용에는 위험 요소가 있습니다. Alibaba 개발 매뉴얼도 매우 잘 작성되어 있습니다

Java에서 부울과 부울의 차이점은 무엇입니까

간단히 말하면 속성은 다음과 같습니다. boolean으로 정의된 객체에는 값이 있어야 합니다. Boolean 객체 값이 null이면 압축 풀기 과정에서 NPE가 발생합니다.

시나리오를 상상해보세요. 여자친구가 당신에게 묻습니다: 나를 사랑하나요? 그러나 당신은 명확하게 듣지 못했습니다. 부울이면 명확하게 듣지 못했습니다(null)라고 대답할 것입니다. 부울이면 더 이상 사랑하지 않습니다(false)

그 후에는 구타당할 것입니다.

보충: 부울 및 부울 성능 탐색

부울 및 true의 경우

어느 것이 더 나은 성능을 갖는지는 명확하지 않습니다. Big Boolean은 두 개의 정적 객체도 초기화합니다.

소스 코드 스크린샷은 다음과 같습니다. :

Java에서 부울과 부울의 차이점은 무엇입니까

테스트 클래스 작성: 테스트 메소드(큰 부울 유형이 true일 때 시간 가져오기, 작은 불리언 유형이 true일 때 시간 가져오기, 100, 1000, 10000, 100000번을 통과하여 어떤 시간인지 확인) 적고 횟수는 더 많습니다)

테스트 코드는 다음과 같습니다.

public class Test {	
	/**
	 * 方法一
	 * 
	 * @return
	 */
	public static Boolean A() {
		return Boolean.TRUE;
	}
	/**
	 * 方法二
	 * 
	 * @return
	 */
	public static boolean D() {
		return true;
	}
	public static String get() {
		long i = 0L;
		long j = 0L;
		for (int n = 0; n < 100000; n++) {
			long startTime = System.nanoTime();
			D();
			long endTime = System.nanoTime();
			long booleanTime = endTime - startTime;
			
			long start = System.nanoTime();
			A();
			long end = System.nanoTime();
			long booleanca = end - start;
			
			
			if (booleanca > booleanTime) {
				i = i + 1;
			} else {
				j = j + 1;
			}
		}
		return i+" "+j;
	}
	public static void main(String[] args) {
        System.out.println("---100000次的比较结果---->"+get());
	}
}

실행 결과는 다음과 같습니다.

Java에서 부울과 부울의 차이점은 무엇입니까

위 내용은 Java에서 부울과 부울의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제