JAVA는 상자를 풀고

마이크로 채널 공개 번호 :로부터 복각웹 프로젝트 수집

기본 데이터 유형

  특별한 유형의 Java 클래스 (클래스)에서 다른 기본 유형 또는 불리는 내장 타입. 그들은 우리 프로그램에서 가장 자주 사용되는 유형입니다.

  자바는 첫번째 변수 데이터 유형이 먼저 변수를 초기화하는 변수 할당라고 언급해야 선언, 강력한 형식의 언어입니다.

 

자바 기본 유형 세 가지 범주로 나눌 수 있습니다 여덟 가지 기본 유형이 있습니다 :

  문자 유형 char

  부울 boolean

  정수형  byte, short, int,long

  형 부동 소수점  float, double.

컴퓨터 운영 체제를 변경하지 않거나 하드웨어 환경이 변경 자바 숫자 유형은 자신의 범위가 고정되어, 서명 존재하지 않습니다.

사실, 자바, 거기에 여전히 또 다른 기본 타입 void또한 해당 래퍼 클래스를 가지고 있지만, 우리는 직접에서 작동 할 수 없습니다. java.lang.Void

기본 데이터 유형의 이점은 무엇입니까

  우리 모두는 자바 언어로, 알고 new오브젝트가 힙에, 우리가 참조 스택하여 이러한 개체를 사용하여 저장하므로,이 오브젝트 자체가 자원이 소요된다.

  우리는 새로운 자바 객체를 필요로이 변수를 사용할 때마다, 그때, 오히려 복잡 할 경우 유형에 자주 등 INT로 사용했다.

  따라서, 및 C ++로, 자바는 기본 데이터 유형을 제공, 변수 등의 데이터를 새로운 창조의 사용을 필요로하지 않습니다, 그들은 힙에 생성되지 않지만 스택 메모리에 직접 저장되고, 그래서 더 효율적입니다.

 

정수의 범위

  자바는 정수 주로 포함 byte, short, intlong표시된 4 개 개의 디지털 영역은 관련 데이터를 저장할 때 작은에서 대형 바이트의 수가 차지하는 다른 이유 주원인의 범위를 나타내고있다.

  주관식 과학 먼저, 1 바이트 = 8 비트 (비트). 자바는 문자의 정수에 속한다.

  8 비트 디지털 계산에서 첫 모습을 나타낼 수있다 :

  最小值:10000000 (-128)(-2^7)最大值:01111111(127)(2^7-1)

  이 정수 타입,

  • 바이트 : 바이트 1 바이트 -128의 범위에 저장하는 (7 ^ -2) 변수를 초기화 (127) (7-1 ^ 2)로, 바이트 0은 기본 타입이다.

  • 짧은 : 일반적으로 스토리지 2 바이트 -32,768 (-2 ^ 15) 32,767 (2 ^ 15-1), 초기화 변수 short 유형 디폴트 값 0, 짧은 자바 때문에 전환 자체에 대한 이유는 바로 제로 쓸 수 있습니다.

  • INT : 변수 INT 유형 디폴트 값 0으로 초기화 될 때 4 바이트 값 int는 2,147,483,647 (31-1 ^ 2)에 2,147,483,648 (-2 ^ 31)의 범위 내에 저장된다.

  • 긴 롱 저장 8 바이트 -9,223,372,036,854,775,808 범위 (-2 ^ 63)에 9,223,372,036, 854,775,807 (2 (63) -1), 초기화 변수 롱 타입 또는 0L 0L 디폴트 값으로도 할 수있다 제로로 직접 작성합니다.

  • 2 바이트 짧은 숯 INT 긴 부동 1 2 4 8 4 8 

 

수행하는 방법의 범위를 넘어서

  상기 특징, 정수, 각 유형의 표현의 특정 범위를 가지고 있지만, 프로그램의 일부 계산 표현, 즉 오버 플로우의 범위를 초과 될 것이다. 다음 코드로 :

  int i = Integer.MAX_VALUE;int j = Integer.MAX_VALUE;
  int k = i + j;System.out.println("i (" + i + ") + j (" + j + ") = k (" + k + ")");

  출력 : I (2147483647) + J (2147483647) K = (-2)

  이 일이 오버 플로우, 시간이 예외를 throw하지 않는, 어떤 메시지를 표시하지 않고 것입니다. 프로그램에서, 데이터 작업의 동일한 유형을 사용하는 경우 그래서, 우리는 데이터 오버 플로우의 문제에주의를 지불해야합니다.

 

래퍼 클래스

자바는 객체 지향 언어이지만 자바의 기본 데이터 형식은 각 데이터 유형에 기본 설계에 대한 설계 범주에이 문제를 해결하기 위해, 실제 사용에 많은 불편이있는 아닌 객체 지향 8 개 가지 기본 데이터 타입 및 대응하는 클래스로 포장 (래퍼 클래스)로 지칭되도록 그것은 해당 클래스 나타낸다.

java.lang 패키지는 포장, 기본 데이터 타입의 패키징은 아래의 대응 관계 테이블을 위치

기본 데이터 유형 래퍼 클래스
바이트 바이트
부울 부울
짧은 짧은
캐릭터
INT 정수
흙손 흙손
더블 더블

여덟 개 클래스 이름으로, 미래의 정수 및 문자 유형, 다른 여섯 클래스 이름 및 기본 데이터 타입의 같은 클래스, 대문자로 클래스 이름의 첫 글자에 추가한다.

왜 우리는 포장이 필요합니까

우리가 그것을 포장 제공해야하는 이유를 많은 사람들이 자바 이후 효율이 8 개 가지 기본 데이터 유형을 제공을 개선하기 위해, 의심?

문제는, 사실, 이미 자바는 객체 지향 언어이기 때문에, 많은 장소 대신 기본 데이터 형의 객체를 사용해야 답. 예를 들어, 컬렉션에, 우리는 그들에 두 번, 등 형식을 int로 할 수 없습니다. 용기 요소가 제 오브젝트 유형에 설정되어 있기 때문에.

기본 유형은 또한 기능 객체를 만들려면 기본 유형에 해당하는 패키지 유형을 등장는 객체의 속성을 가질 수 있도록, "마무리"및 운영의 기본 유형을 풍부하게하는 속성과 메서드를 추가 .

포장 포장을 풀고

따라서, 기본 데이터 유형 및 포장과 함께, 확실히 당신이 그들 사이를 전환 할 때가있다. 예를 들어, 패키지 형 INT 정수 객체에 기본 데이터 타입 변환.

우리는 포장은 포장의 기본 유형이라고 생각하기 때문에 기본 데이터 형식 변환 과정은 영어 복싱, 복싱의 중국어 번역에 해당하는 래퍼 클래스 포장으로 재생된다.

반대로, 기본 데이터의 패키징 공정은 영어, 풀고의 중국어 번역을 해당 언 박싱, 압축을 푼 변환합니다.

자바 SE5하기 전에 다음 코드에 의해 포장 될 수 있습니다 :

Integer i = new Integer(10);

포장을 풀고 자동 및 자동 포장

자바 SE5에서 개발자의 작업을 줄이기 위해, 자바는 자동 포장 및 자동 기능을 풀기을 제공합니다.

오토 박싱 : 자동으로 해당 기본 데이터 형 포장으로 변환됩니다.

자동 언 박싱 : 래퍼가 자동으로 해당 기본 데이터 유형으로 변환됩니다.

Integer i =10;  //自动装箱int b= i;     //自动拆箱

Integer i=10 또 다른 자바 개발자들에게 수동으로 새 정수 객체를 필요로하지 않는 자동 포장 기능을 제공하기 때문이다, 우리를 도와줍니다. Integer i = new Integer(10);

자동 복싱 및 자동 언 박싱의 원리

끝이 원칙은, 자바는 자동 기능을 어떻게 달성하는 저를 가능하게 무엇이다 지금 자바가 자동으로 기능을 제공 나를 수 있다는 것, 우리는 볼 것이다.

우리는 자동 입력 상자에 다음 코드를 :

public static  void main(String[]args)
{

Integer integer=1; //装箱

int i=integer; //拆箱

}

위의 코드 뒤에 다음 코드를 디 컴파일 할 수 있습니다 :

public static  void main(String[]args)
{

Integer integer=Integer.valueOf(1);

int i=integer.intValue();

}

위에서 알 수있는 바와 같이, 코드 디 컴파일 int로 오토 박싱 통해 Integer.valueOf()방법을 달성하기 위해, 정수 개봉기 자동 통해 integer.intValue달성했다. 독자가 관심이 있다면, 당신은 다음과 같은 규칙을 찾을 수는 8 개 종류가 다시 컴파일됩니다 시도 할 수 있습니다 :

자동 포장으로 래퍼 클래스는 valueOf()되어 감싸서 클래스 객체 자동 푸는 방법을 구현 xxxValue()하였습니다.

 

어떤 장소에 자동으로 입력 상자

우리는 원리를 이해 한 후,보고 어떤 상황에서, 자바는 우리가 자동 입력 상자를 수행하는 데 도움이됩니다. 초기화 및 위에서 언급 한 장면 변수의 할당은 가장 간단하고 쉽게 이해하고, 도입되지 않습니다.

그 시나리오는 무시 될 수에서 우리는 주로 본다.

시나리오, 컬렉션에 기본 데이터 유형

우리는 자바 컬렉션 클래스는 객체 유형을받을 수 있다는 사실을 알고, 다음 코드는 왜이 제공되고 있지?

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i ++)
{

li.add(i);
}

위의 디 컴파일 코드는 다음 코드를 얻을 수있다 :

List<Integer> li = new ArrayList<>();

for (int i = 1; i < 50; i += 2)
{

li.add(Integer.valueOf(i));
}

위, 우리는 우리가 컬렉션 클래스에 기본 데이터 유형을 넣으면, 자동으로 포장됩니다, 그 결론을 내릴 수 있습니다.

두 번째 시나리오, 패키지 유형과 기본 유형의 크기 비교

우리가 Integer 오브젝트의 기본 형식의 크기를 비교할 때 사람은 이제까지 사실, 그것을 비교하는 것입니다, 생각 했습니까? 다음 코드를보고 :

Integer a=1;System.out.println(a==1?"等于":"不等于");

Boolean bool=false;System.out.println(bool?"真":"假");

위의 다음 코드를 코드를 컴파일하려면 :

Integer a=1;System.out.println(a.intValue()==1?"等于":"不等于");

Boolean bool=false;System.out.println(bool.booleanValue?"真":"假");

이것은 기본 데이터 형식을 비교 포장 동작으로 볼 수 있으며, 이는 제 패키징에 기본 데이터 타입의 개봉 후 비교된다.

작업의 시나리오 세 가지 패키지 유형

누군가가 우리가 어떻게, 정수 객체에 네 개의 작업 일 때 생각 했습니까? 다음 코드를보고 :

Integer i = 10;Integer j = 20;
System.out.println(i+j);

다음과 같이 디 컴파일 코드 후입니다 :

Integer i = Integer.valueOf(10);Integer j = Integer.valueOf(20);System.out.println(i.intValue() + j.intValue());

우리는 둘 사이의 포장 작업의 유형을 자동으로 기본 유형으로 압축됩니다 것을 발견했다.

장면 넷 원계 연산자를 사용하여

이 행의 피 묻은 배운 버그 저자가 발생한 후 많은 사람들이 현장의 사례를 모르는 것입니다. 간단한 삼항 연산자 코드를 참조하십시오 :

boolean flag = true;Integer i = 0;int j = 1;int k = flag ? i : j;

많은 사람들이에, 사실, 모르는 int k = flag ? i : j;이 라인, 자동 언 박싱이 발생합니다. 다음과 같이 디 컴파일 코드 후입니다 :

boolean flag = true;Integer i = Integer.valueOf(0);int j = 1;int k = flag ? i.intValue() : j;

이것은 실제의 삼원 조작 구 규격이다 오브젝트가 실질적으로 동작 입력을 푸는 것, 상기 두 번째 및 세 번째 피연산자 기본 타입 및 오브젝트가있는 경우.

예 왜냐하면 flag ? i : j;세 번째 단계 j는 기본형 세그먼트 동안 상기 제 2 세그먼트의 전 포장 자동 푸는 것, 포장의 유형의 목적이다. 이번에는 내가 소중히 경우 null, 너무 오래 NPE가 발생합니다.

장면 다섯, 함수 매개 변수와 반환 값

이것은 직접 코드를 이해하는 것이 더 쉽습니다 :

//自动拆箱public int getNum1(Integer num) { return num;}//自动装箱public Integer getNum2(int num) { return num;}

자동 입력 상자 및 캐시

또한 자바 SE 자동 입력 상자 및 버퍼 관련 기능을 제공합니다,의는 다음 코드를 살펴 보자, 출력을 추측 :

public static void main(String... strings) {
Integer integer1 = 3;
Integer integer2 = 3;

if (integer1 == integer2)
System.out.println("integer1 == integer2");

else

System.out.println("integer1 != integer2");

Integer integer3 = 300;
Integer integer4 = 300;

if (integer3 == integer4)
System.out.println("integer3 == integer4");

else

System.out.println("integer3 != integer4");

}

우리는 일반적으로 위의 두 가지 판단의 결과가 거짓 있다고 생각합니다. 비교의 값이 동일하지만,하지만, 비교 대상이며, 객체 참조가 동일하지 않습니다, 그래서 두 사람은 생각하기 때문에 판단이 잘못된 경우 그.

자바에서 == 비교 대상 응용 프로그램이며, 값이 비교 동일하다.

그래서,이 예에서, 다른 개체가 다른 참조가, 그렇게 할 때 비교는 false를 돌려줍니다. 호기심 여기서 두 개의 유사한 조건이 다른 판단 부울 값을 반환합니다.

실제 출력 위의 코드 :

integer1 == integer2integer3 != integer4

그 이유는 캐시와 정수 메커니즘입니다. 자바 5에서 작동 정수에 우리는 메모리를 절약하고 성능을 향상시킬 수있는 새로운 기능을 소개합니다. 정수 오브젝트는 동일한 오브젝트 참조를 사용하여 캐시 및 재사용을 구현한다.

127에 전체 값 범위 -128에 적용합니다.

 

자동 포장에만 적합합니다. 적용되지 않는 객체를 생성하는 생성자를 사용합니다.

우리는 직접 개체를 다시 만들 것이 아니라, 캐시에 객체를 사용, 수는 -128 ~ 127 사이의 자동 포장의 필요성을 인 경우 때 알아야합니다.

상기 127 -128 사이 캐시 자바 독 지원 자동 포장 공정의 상세한 설명. (127)의 최대 값은 수 -XX:AutoBoxCacheMax=size변형 될 수있다.

실제로,이 함수에 +127 자바 5 -128 고정 범위를 도입 할 때. 나중에 자바 6, 당신은 수있는 java.lang.Integer.IntegerCache.high최대 값을 설정합니다.

이것은 우리가 응용 프로그램의 실제 상황을 조정할 수있는 유연성의 성능을 향상시킬 수 있습니다. 결국 -128 127 범위를 선택하는 이유는 무엇인가? 이 범위의 숫자가 가장 널리 사용되기 때문이다.  이 과정에서 정수의 첫 번째 사용은 또한 캐시를 초기화하는 몇 가지 여분의 시간이 걸립니다.

다음과 같이 Java 언어 사양 (JLS) 복싱 변환 섹션에서 제공합니다 :

변수 P의 값이있는 경우 :

-128至127之间的整数(§3.10.1)
true 和 false的布尔值 (§3.10.3)
‘\u0000’至 ‘\u007f’之间的字符(§3.10.4)

상기 범위 내에서, p 형 패키지 두 물체 A와 B가하는 == B를 A와 B를 사용하여 직접 측정 할 수있는 경우 동일하다.

질문 상자는 자동 해체를 제공합니다

물론, 자동 입력 상자는 입력 상자를 필요로 할 때 결국에 대해 신경 쓸 필요가 더 이상 에너지 개발자 절약, 좋은 기능입니다. 그러나 그는 또한 몇 가지 문제를 소개합니다.

수치 비교를 감싸 목적은, 간단하게 사용할 수 없습니다 ==수는 -128에서 127 사이가 될 수 있지만,하지만,이 범위를 벗어난 여전히 사용할 필요가 equals비교를.

 

앞서 언급 한 바와 같이, 일부 장면은 저를있게 자동으로뿐만 아니라 말했다 것이다 인해 자동 언 박싱, 포장 클래스 객체가 null의 경우, 다음은 개봉 때 자동으로 NPE가 발생 할 수 있습니다.

 

항목 상자 작업의 많은 수에 대한 루프 경우, 많은 자원을 낭비합니다.

추천

출처www.cnblogs.com/heyjia/p/11328460.html