개요
이 튜토리얼에서는,우리의 장단점 Java 를 사용하여 기본 형식 및 그들의 감쌌습니다.
Java Type System
Java 에는 Int,boolean 과 같은 프리미티브 및 Integer,Boolean 과 같은 참조 유형으로 구성된 2 배 유형 시스템이 있습니다. 모든 기본 유형은 참조 유형에 해당합니다.
모든 객체는 해당 원시 유형의 단일 값을 포함합니다. 래퍼 클래스를 변경할 수 없다(그래서는 그들의 상태를 변경할 수 없습니면 객체가 건설)과는 최종적이다(그래서 우리는 수 없는 상속에서 그들).
후드,Java 수행한 전환 사이 원시적이고 유형을 참조하는 경우에는 실제 입력에서 다른 선언 one:
Integer j = 1; // autoboxingint i = new Integer(1); // unboxing
프로세스 변환의 기본 유형을 참조 하이라고 autoboxing,반대 과정 unboxing 이라고 합니다.
장점과 단점
의사 결정 무엇을 사용될 무엇을 기반으로 응용 프로그램 성능이 우리는 시도를 달성하는 방법을 많이 사용 가능한 메모리가 사용 가능한 메모리 용량을하고 무엇을 기본값으로 우리가 처리해야 합.
경우 우리는 얼굴의 아무도 그들을,우리는 무시할 수 있습니다 이러한 고려도 가치가있다.
3.1. 단일 항목 메모리 풋 프린트
참조 용으로 프리미티브 유형 변수는 메모리에 다음과 같은 영향을 미칩니다:
- boolean–1 비트
- 바이트 8 비트
- 짧은,char–16 비트
- int,플로트–32 비트
- 오래,더블 64 비트
,실제로 이러한 값에 따라 달라질 수 있습니다 가상 기계를 구현합니다. 예를 들어 Oracle 의 VM 에서 부울 유형은 int 값 0 과 1 에 매핑되므로 여기에 설명 된대로 32 비트가 필요합니다.
이러한 유형의 변수는 스택에 살고 있으므로 빠르게 액세스 할 수 있습니다. 자세한 내용은 Java 메모리 모델에 대한 자습서를 권장합니다.
참조 유형은 객체이며 힙에 살고 상대적으로 액세스 속도가 느립니다. 그들은 원시적 인 대응에 관한 특정 오버 헤드를 가지고 있습니다.
오버 헤드의 구체적인 값은 일반적으로 JVM 특정입니다. 여기,우리는 현재에 대한 결과는 64 비트 가상 기계와 이러한 매개변수:
java 10.0.1 2018-04-17Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
을 얻을 수 있는 객체의 내부 구조를 사용할 수 있습 Java 객체의 레이아웃 도구(보리에있는 다른 튜토리얼을 얻는 방법 개체의 크기).
는 것이 밝혀졌는 단일의 인스턴스에 참조형 이 JVM 에서 차지하는 128 비트를 제외하고 길고 이중을 차지 192 비트는 다음과 같습니다.
- Boolean–128 비트
- Byte–128 비트
- 단,문자는 128 비트
- 정수,Float–128 비트
- 롱, 더블 192 조금
우리가 볼 수있는 단 하나의 변수 Boolean 유로 훨씬 공간으로 128 기본 사람,하나의 정수 변수를 차지하는 만큼 공간으로 네 int 것들입니다.
3.2. 배열에 대한 메모리 풋 프린트
고려중인 유형의 배열을 얼마나 많이 차지하는 메모리를 비교하면 상황이 더욱 흥미로워집니다.
때 우리는 배열을 만들과의 다양한 요소의 수를 각 유형을 위해,우리가 얻을 플롯.
을 보여주는 형식으로 그룹화된 네 개의 가족과 함께 관련하여 어떻게 기억 m(s)에 따라 달라는 요소의 수를 s 의 배열
- 오래,더블:m(s) =128+64s
- ,짧은 문자:m(s)=128+64
- byte,boolean:m(s)=128+64
- 나머지: m(s)=128+64
여기서 대괄호는 표준 천장 기능을 나타냅니다.
놀랍게도 원시 유형 long 및 double 의 배열은 래퍼 클래스가 Long 및 Double 보다 많은 메모리를 소비합니다.
우리는 볼 수 있습 중 하나는 단 하나의 배열 요소는 기본 형식은 거의 항상 더 비싼 제외하고(긴 및 배)보다 해당하는 참조 형식입니다.
3.3. 성능
의 성능 Java 코드가 매우 미묘한 문제,그에 따라 달라 하드웨어에는 코드는 실행에서 컴파일러를 수행할 수 있는 특정 최적화,의 상태에 대한 가상 머신의 활동에서 다른 프로세스에서는 운영 체제입니다.
우리가 이미 언급했듯이,기본 형식 라이브 스택에서는 동안 참조 라이브 유형에 힙. 이것은 객체가 얼마나 빨리 액세스되는지를 결정하는 지배적 인 요소입니다.
하는 방법을 보여 많은 작업에 대한 기본 형식보다 더 빠른 사람들을 위한 랩퍼 클래스를 만들만 요소에 배열하는 모든 요소가 동일 마지막 하나를 제외하고 다음에는 조회를 수행하는 요소:
while (!pivot.equals(elements)) { index++;}
고의 성능을 비교에 대해 이 작업하는 경우 배열 변수를 포함하는 기본 형식과한 경우가 포함되어 있을 경우 객체를 참조 형식입니다.
우리는 잘 알려진 사용 JMH 벤치마킹 도구(참조하십시오 튜토리얼 그것을 사용하는 방법에 대),그 결과 조회 작업의 요약할 수 있 이 차트에서:
도에 대한 간단한 동작,우리가 볼 수있는 그것은 필요한 시간이 더 작업을 수행한 래퍼 클래스입니다.
합산,곱셈 또는 나눗셈과 같은 더 복잡한 연산의 경우 속도의 차이가 급증 할 수 있습니다.
3.4. 기본 값
기본 형식의 기본값은 0 입니다(해당 표현에서,즉 0,0 입니다.숫자 유형의 경우 0d 등),부울 유형의 경우 false,char 유형의 경우\u0000. 래퍼 클래스의 경우 기본값은 null 입니다.
그것이 의미하는 기본 형식을 취득할 수 있에서 값만 그들의 도메인하는 동안 참조 형식을 획득할 수 있는 값(null)에서 어떤 의미에 속하지 않는 자신의 도메인에 있습니다.
록된 것으로 간주되지 않는 것이 좋습을 떠나 변수 초기화되지 않은,때로는 우리가 값을 할당 한 후 그것의 창조이다.
이러한 상황에서,때 기본 형식 변수에 값이 같은지의 유형을 기본적으로 하나,우리는지 여부를 알 수 있어야 변수를 정말로 초기화됩니다.
null 값이 변수가 초기화되지 않았다는 명백한 표시이기 때문에 래퍼 클래스 변수에 그런 문제가 없습니다.
사용법
우리가 보았 듯이 원시 유형은 훨씬 빠르며 훨씬 적은 메모리를 필요로합니다. 따라서 우리는 그것들을 사용하는 것을 선호 할 수도 있습니다.
On the other hand,현재 Java 언어의 사양을 허용하지 않는 사용법의 기본 형식에서 매개 변수화 유형(generics),Java 컬렉션 또는 반합니다.
경우 우리의 응용 프로그램이 필요 컬렉션으로 큰 숫자의 요소가 우리가 고려해야 할 사용하여 배열로 더 경제적인””유형으로 가능한으로,그의 그림에서 음모니다.
결론
이것은 이 튜토리얼에서,우리는 설명하는 개체 자바에서는 느리고 더 큰 메모리 영향의 원시적인 대응을 공부했습니다.
항상 그렇듯이 코드 스 니펫은 GitHub 의 저장소에서 찾을 수 있습니다.
시작을 봄 5 봄 2 부팅을 통해 배울 봄 course:
>>교육 과정을 살펴보세요