Java Integer
와 관련 int
하여 토론이 있습니다 . 전자의 기본값 null
은 후자에 있습니다 0
. 어떻 Boolean
대 boolean
?
내 응용 프로그램의 변수는 0
/ 1
값을 가질 수 있습니다 . 나는 boolean
/ 를 사용 Boolean
하고 싶습니다 int
. 대신 Boolean
/ boolean
를 사용할 수 있습니까 ?
Java Integer
와 관련 int
하여 토론이 있습니다 . 전자의 기본값 null
은 후자에 있습니다 0
. 어떻 Boolean
대 boolean
?
내 응용 프로그램의 변수는 0
/ 1
값을 가질 수 있습니다 . 나는 boolean
/ 를 사용 Boolean
하고 싶습니다 int
. 대신 Boolean
/ boolean
를 사용할 수 있습니까 ?
답변:
예 , 사용할 수 있습니다Boolean
/ boolean
대신 .
첫 번째는 Object이고 두 번째는 기본 유형입니다.
처음에는 더 많은 메소드를 얻을 수 있습니다.
두 번째는 메모리 비용을 고려하여 저렴합니다 . 두 번째는 더 많은 메모리를 절약하므로 계속하십시오.
이제 길을 선택하십시오.
AsyncTask
사용할 수 있습니다 . Boolean
boolean
true
, false
및 null
부울 논리 상태가 2 ( true
및 false
)
Boolean
부울 프리미티브 유형을 래핑 합니다. JDK 5 이상에서 Oracle (또는 Oracle이 구입하기 전에 Sun)은 자동 박스 / 언 박스를 도입 했습니다.
boolean result = Boolean.TRUE;
또는
Boolean result = true;
본질적으로 컴파일러는
Boolean result = Boolean.valueOf(true);
따라서 대답은 그렇습니다.
Boolean
A를 boolean
. 귀하의 경우 Boolean
IS null
와 당신이에 할당하려고 boolean
, 그것은 발생합니다 NullPointerException
런타임에.
Boolean
클래스가 동일한 부울 변수를 참조하는 다른 클래스의 값을 변경 했는데도 왜 값이 항상 거짓입니까? Boolean
우리가 다른 인스턴스 클래스에서 참조 할 수 없다면 / 인수로 전달할 수 없다면 이것의 요점은 무엇 입니까?
AtomicBoolean
차이점 클래스에서 그것을 사용 하고 참조 할 수 있습니다
지금까지 그들이 "자신"에 / 특정 언어 프로그래밍 대신의 장면 뒤에 더 큰 그림을 돌보는에 초점 인공 용어에 집중할 때부터 (제공 답변을 연장하는 비트입니다 프로그래밍 언어를 만드는 , 즉 일을 일반적으로, 형식 안전성과 메모리 고려 사항이 차이를 만듭니다) :
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
3 번째 줄의 Java 코드 (bar)?1:0
는 bar ( boolean )를 암시 적으로 int 로 변환 (캐스팅) 할 수 없음을 보여 줍니다 . JVM 뒤에 구현의 세부 사항을 설명하지 않고 메모리 크기와 같은 낮은 수준의 고려 사항에서 유형 안전보다 값을 선호해야한다고 지적했습니다. 특히 형식 안전성이 검사 형식이 다음과 같은 부울 형식과 같이 진정으로 / 완전히 사용되지 않는 경우
\ in {0,1} 값이면 부울 유형으로 캐스트되고, 그렇지 않으면 예외가 발생합니다.
모두 {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}입니다. 과잉 인 것 같아요? 형식 안전성은 기본 형식의 암시 적 캐스팅이 아니라 사용자 정의 형식에서 매우 중요합니다 (마지막은 첫 번째 형식에도 포함됨).
바이트는 유형 또는 비트가 아닙니다
메모리에서 {0,1} 범위의 변수는 특별히 처리하지 않는 한 (예 : 메모리에 멋지게 포장 됨-8 "부울") 최소 바이트 또는 단어 (레지스터 크기에 따라 xbits)를 차지합니다. 비트를 1 바이트로-앞뒤로).
추가 값 패킹 (예 : 비트 시프트 또는 산술 사용)보다 유형 안전 (특정 유형의 상자에 값을 넣거나 감는 것과 같이)을 선호함으로써 더 많은 메모리를 확보하는 것보다 적은 코드를 작성하는 것을 효과적으로 선택합니다. 반면에 항상 부울보다 가치가없는 모든 변환을 용이하게하는 사용자 정의 사용자 유형을 정의 할 수 있습니다.
키워드와 유형
마지막으로 귀하의 질문은 키워드 와 유형을 비교하는 것 입니다. 유형 (다른 키워드 클래스를 사용하는 일반 복합 사용자 정의 가능 클래스 ) 또는 다른 말로 키워드 ( " 기본 "으로 표시)를 사용하거나 선호함으로써 성능을 얻는 이유 또는 방법을 설명하는 것이 중요하다고 생각합니다.
boolean foo = true;
vs.
Boolean foo = true;
첫 번째 "thing"(유형)은 이유없이 확장 (하위 분류) 할 수 없습니다. 프리미티브 및 랩핑 클래스 의 Java 용어를 효과적으로 인라인 값 (LITERAL 또는 상수 대체로 유추 할 수있는 경우 또는 컴파일러가 값을 래핑하는 경우 대체 할 수있는 경우 컴파일러가 직접 대체하는 상수) 으로 간단히 변환 할 수 있습니다 .
사소한 이유로 인해 최적화가 이루어집니다.
"런타임 캐스팅 작업이 줄어들면 속도가 더 빨라집니다."
그렇기 때문에 실제 타입 추론이 수행 될 때 필요한 경우 모든 타입 정보로 클래스를 래핑 (wrapping) 할 수도 있습니다 (또는 여전히 변환 / 캐스팅).
그래서, 차이 부울 및 부울 에 정확하게 컴파일 및 런타임 (조금 멀리 가고 있지만 거의 instanceof를 대 getClass () ).
마지막으로 오토 박싱은 프리미티브보다 느립니다.
자바가 오토 박싱을 할 수 있다는 사실 은 단지 "구문 설탕"일뿐입니다. 속도를 높이 지 않고 코드를 적게 작성할 수 있습니다. 그게 다야. 유형 정보 컨테이너로 캐스트 및 랩핑은 여전히 수행됩니다. 성능상의 이유로, 유형 안전을 구현하기 위해 유형 정보로 클래스 인스턴스를 작성하는 추가 하우스 키핑을 항상 생략하는 산술을 선택하십시오. 유형 안전 부족은 성능을 얻기 위해 지불하는 가격입니다. 부울 값식이있는 코드의 경우 유형 안전성 (더 적고 따라서 암시 적 코드를 작성하는 경우)은 if-then-else 흐름 제어에 중요합니다.
한 가지 관찰 : (이것은 부작용을 생각할 수 있지만)
부울 이 기본 요소 인 경우 예 또는 아니오라고 말할 수 있습니다.
부울 은 객체입니다 (예 또는 아니오 또는 '모름'을 의미 할 수 있습니다 (예 : null)).
부울 / 부울을 사용할 수 있습니다. 단순함은 갈 길입니다. 특정 API (컬렉션, 스트림 등)가 필요하지 않고 필요한 것으로 예상하지 않는 경우 기본 버전 (부울)을 사용하십시오.
프리미티브를 사용하면 널값을 전달하지 않습니다.
이런 함정에 빠지지 않을 것입니다. 아래 코드는 NullPointerException (from : 부울, 조건부 연산자 및 자동 상자)을 발생시킵니다 .
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;
}
객체가 필요할 때 부울을 사용하십시오. 예 :