programing

Java에서의 부울 vs 부울

goodcopy 2022. 8. 8. 15:59
반응형

Java에서의 부울 vs 부울

에 관한 논의가 있다.Integerint자바어.전자의 기본값은 다음과 같습니다.null후자에서는0.어때.Booleanboolean?

어플리케이션의 변수는0/1가치.사용하고 싶다boolean/Boolean사용하지 않는 것을 선호합니다.int사용할 수 있나요?Boolean/boolean대신?

, 사용할 수 있습니다.Boolean/boolean대신.

첫 번째는 오브젝트, 두 번째는 원시형입니다.

  • 첫 번째 방법에서는 더 많은 방법을 사용할 수 있습니다.

  • 두 번째는 메모리 비용을 생각하면 싸다. 두 번째가 훨씬 더 많은 메모리를 절약할 수 있으므로, 시작하세요.

이제 네 길을 선택해라.

Boolean 는 부울 프리미티브유형을 랩합니다.JDK 5 이상에서는 Oracle(또는 Oracle이 구입하기 전에는 Sun)이 오토박스/언박스를 도입했습니다.이것에 의해, 기본적으로는 이 기능을 사용할 수 있습니다.

boolean result = Boolean.TRUE;

또는

Boolean result = true; 

컴파일러는 기본적으로 그렇게 합니다.

Boolean result = Boolean.valueOf(true);

그래서 당신의 대답은 YES입니다.

저는 답변을 조금 더 길게 하고 있습니다(지금까지 그들은 프로그래밍 언어를 만드는 배경 뒤에 있는 큰 그림(일반적으로 타입 안전성 대 메모리 고려 사항 등)을 고려하는 대신 특정 언어의 프로그래밍에 초점을 맞추고 있기 때문에).

int는 부울이 아닙니다.

고려하다

    boolean bar = true;      
    System.out.printf("Bar is %b\n", bar);
    System.out.printf("Bar is %d\n", (bar)?1:0);
    int baz = 1;       
    System.out.printf("Baz is %d\n", baz);
    System.out.printf("Baz is %b\n", baz);

출력과 함께

    Bar is true
    Bar is 1
    Baz is 1
    Baz is true

세 번째 줄의 Java 코드(bar)?1:0는 막대(캐스팅)를 암묵적으로 int로 변환(캐스팅)할 수 없음을 나타내고 있습니다.JVM의 배후에 있는 실장의 상세를 설명하기 위해서가 아니라, 낮은 레벨의 고려 사항(메모리 사이즈로서)에 대해서는, 타입의 안전성보다 가치를 우선할 필요가 있다는 것을 지적하기 위해서입니다.특히 점검이 다음과 같은 형태로 이루어지는 부울 형식에서처럼 그러한 유형의 안전성이 진정/완전하게 사용되지 않는 경우

값 \in {0,1}인 경우 부울 유형으로 캐스팅하고, 그렇지 않은 경우 예외를 슬로우합니다.

모두 {0,1} < {-2^31, .., 2^31 -1}임을 나타냅니다.과잉 살상 같죠?유형 안전은 기본 요소의 암묵적 캐스팅이 아닌 사용자 정의 유형에서 정말로 중요하다(마지막이 첫 번째에 포함되긴 하지만).

바이트는 유형 또는 비트가 아닙니다.

메모리에서 {0,1} 범위의 변수는 특별히 관리되지 않는 한(예: 메모리에 8비트를 1바이트 앞뒤로 적절하게 채워짐) 여전히 최소 1바이트 또는 워드(레지스터 크기에 따라 x비트)를 차지합니다.

(예를 들어 비트 시프트 또는 산술 사용) 추가 값 패킹보다 (특정 유형의 상자에 값을 넣거나 래핑하는 것과 같은) 타입의 안전성을 선호함으로써 더 많은 메모리를 얻는 것보다 더 적은 코드를 쓰는 것을 효과적으로 선택할 수 있습니다.(반면, 항상 부울보다 가치가 없는 모든 변환을 용이하게 하는 커스텀 사용자 타입을 정의할 수 있습니다.).

키워드 vs. 유형

마지막으로 키워드 대 유형 비교 문제입니다.타입(다른 키워드 클래스를 사용하는 일반적인 복합 사용자 정의 클래스)보다 키워드("primitive"로 표시됨)를 사용/선호함으로써 성능을 얻는 이유와 방법을 설명하는 것이 중요하다고 생각합니다.

boolean foo = true;

대.

Boolean foo = true;

첫 번째 "thing"(type)은 확장(서브클래스)할 수 없으며 이유 없이 확장할 수 없습니다.원시 클래스와 래핑 클래스의 효과적인 Java 용어는 인라인 값(치환 추론이 가능할 때마다 컴파일러에 의해 직접 대체되는 리터럴 또는 상수)으로 간단히 변환할 수 있습니다. 그렇지 않으면 값을 래핑하는 데 폴백합니다.

최적화는 사소한 일로 인해 실현됩니다.

"런타임 캐스팅 작업 감소 => 속도 향상"

따라서 실제 유형 추론이 수행될 때 필요한 경우 모든 유형 정보가 포함된 래핑 클래스를 인스턴스화(또는 변환/캐스팅)하게 될 수 있습니다.

따라서 부울과 부울의 차이는 컴파일과 런타임있습니다(약간 멀지만 instance of vs. getClass()와 거의 비슷합니다).

마지막으로, 자동 박스는 기본 기능보다 느립니다.

자바가 오토박싱을 할 수 있다는 사실은 단지 "통사적인 설탕"일 뿐이다.아무것도 고속화하지 않고 코드를 적게 쓸 수 있습니다.바로 그겁니다.유형 정보 용기에 대한 주조 및 래핑은 여전히 수행됩니다.성능상의 이유로 항상 유형 정보를 사용하여 클래스 인스턴스를 만드는 추가 하우스키핑을 건너뛰는 산술을 선택하여 유형 안전을 구현합니다.안전성이 부족하다는 것은 성능을 얻기 위해 지불하는 대가입니다.부울 값 표현식을 가진 코드의 경우 안전성이 중요합니다(작성 횟수가 적어 암묵적인 코드인 경우). 예를 들어 if-then-else 흐름 제어에 중요합니다.

부울 상수를 사용할 수 있습니다.Boolean.TRUE그리고.Boolean.FALSE대신0그리고.1. 유형별로 변수를 생성할 수 있습니다.boolean당신이 원하는 게 원시적인 거라면요이렇게 하면 새로 생성할 필요가 없습니다.Boolean물건들.

한 가지 관찰: (부작용을 생각할 수 있지만)

boolean이 프리미티브인 경우 yes 또는 no 중 하나를 선택할 수 있습니다.

Boolean은 객체입니다(예 또는 아니오 또는 '모름' 즉 null을 나타낼 수 있습니다).

기본적으로 부울은 원시 데이터 유형을 나타냅니다. 부울은 참조 데이터 유형을 나타냅니다.이 이야기는 Java가 순수하게 객체 지향적이기를 원할 때 시작되며 원시 데이터 유형을 과도하게 사용하기 위해 래퍼 클래스 개념을 제공합니다.

boolean b1;
Boolean b2;

b1그리고.b2같지 않다.

부울 / 부울을 사용할 수 있습니다.단순함이 최선의 방법이다.특정 API(Collections, Streams 등)가 필요하지 않고 필요할 것으로 예상되지 않는 경우 기본 버전(boolean)을 사용하십시오.

  1. 프리미티브를 사용하면 null 값을 전달하지 않음을 보증합니다.
    넌 이런 함정에 빠지지 않을 거야아래 코드는 Null Pointer를 슬로우합니다.예외(발신: Bohans, 조건부 연산자 및 자동 상자):

    public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }

  2. 오브젝트가 필요한 경우 부울을 사용합니다.예:

    • 불란의 물줄기
    • 선택적.
    • 불란 수집품

Boolean스레드 세이프이기 때문에, 이 요소와 회답에 기재되어 있는 다른 모든 요소를 고려할 수 있습니다.

언급URL : https://stackoverflow.com/questions/3728616/boolean-vs-boolean-in-java

반응형