포장 류 와 기본 데이터 유형의 차이
5900 단어 자바 이론
장점:
단점:
장점:
둘 의 차이:
1. 성명 방식 이 다 르 고 기본 유형 은 new 키 워드 를 적용 하지 않 으 며 포장 유형 은 new 키 워드 를 사용 하여 더미 에서 저장 공간 을 분배 해 야 합 니 다.2. 저장 방식 과 위치 가 다 르 기 때문에 기본 적 인 유형 은 변 수 를 스 택 에 직접 저장 하 는 것 이 고 포장 유형 은 대상 을 쌓 아 놓 은 다음 에 인용 을 통 해 사용 하 는 것 이다.3. 초기 값 이 다 르 고 기본 유형의 초기 값 은 int 가 0 이 며 boolean 은 false 이 며 포장 유형의 초기 값 은 null 4 이 고 사용 방식 이 다 르 며 기본 유형 은 직접 할당 하면 됩 니 다. 포장 유형 은 Collection, Map 과 같이 집합 할 때 사 용 됩 니 다.5. 포장 류 는 모두 Number 인 터 페 이 스 를 계승 하여 Compareble 인 터 페 이 스 를 실현 한다.
자동 포장 과 자동 분해
자바 에서 데이터 형식 은 두 가지 로 나 눌 수 있 습 니 다. Primitive Type (원본 형식) 과 Reference Type (참조 형식) 입 니 다.기본 형식의 수 치 는 대상 이 아니 며 대상 의 toString (), hashCode (), getClass (), equals () 등 방법 을 호출 할 수 없습니다.
자동 포장 은 자바 가 자동 으로 원본 형식 값 을 대응 하 는 대상 으로 바 꾸 는 것 이다. 예 를 들 어 int 값 을 Integer 대상 으로 바 꾸 는 과정 을 포장 이 라 고 한다.반대로 Integer 대상 을 int 값 으로 바 꾸 는 과정 을 해체 라 고 합 니 다.이곳 의 포장 과 분해 상 자 는 자동 으로 진행 되 는 비인간 적 인 전환 이기 때문에 자동 포장 과 분해 라 고 부른다.
자동 포장 및 분해 사용 장면
자동 으로 상 자 를 포장 할 때 컴 파일 러 는 value Of 를 호출 하여 원본 형식 값 을 대상 으로 변환 하고, 자동 으로 상 자 를 분해 할 때 컴 파일 러 는 intValue (), doubleValue () 등 과 유사 한 방법 으로 대상 을 원본 형식 값 으로 변환 합 니 다.
/** **/
ArrayList intList = new ArrayList();
intList.add(1); //autoboxing -> primitive to object
intList.add(2); //autoboxing
ThreadLocal intLocal = new ThreadLocal();
intLocal.set(3); //autoboxing
int number = intList.get(0); // unboxing
int local = intLocal.get(); // unboxing in Java
/** **/
public static Integer show(Integer iParam){
System.out.println("autoboxing example - method invocation i: " + iParam);
return iParam;
}
//autoboxing and unboxing in method invocation
show(4); //autoboxing
int result = show(4); //unboxing because return type of method is Integer
자동 포장 및 분해 주의 점
1. 쓸모없는 대상 생 성 을 피하 고 GC 압력 을 증가 시 키 며 한 순환 에서 자동 포장 작업 을 합 니 다. 불필요 한 대상 을 만 들 고 프로그램의 성능 에 영향 을 줍 니 다.
Integer sum = 0;
for(int i = 128; i < 5000; i++){
sum += i;
}
"+" 이 조작 부 호 는 Integer 대상 에 적용 되 지 않 습 니 다. 먼저 sum 은 자동 으로 상 자 를 뜯 는 작업 을 하고 수치 추가 작업 을 하 며 마지막 으로 자동 포장 작업 이 발생 하여 Integer 대상 으로 전환 합 니 다.그 내부 변 화 는 다음 과 같다.
temp = sum.intValue() + i;
Integer sum = new Integer(temp);
성명 한 sum 은 Integer 형식 이기 때문에 위의 순환 에서 4900 개 에 가 까 운 쓸모없는 Integer 대상 을 만 들 것 입 니 다. 이 는 쓰레기 회수 작업량 을 증가 시 켜 프로그램의 성능 을 떨 어 뜨 립 니 다.따라서 우리 가 프로 그래 밍 을 할 때 변수 유형 을 정확하게 설명 하고 자동 포장 과 분해 로 인 한 성능 문 제 를 피해 야 합 니 다.2. 대상 초기 화 원본 데이터 값 과 대상 을 비교 할 때 이 대상 이 초기 화 되 지 않 거나 대상 이 null 이면 자동 으로 상 자 를 뜯 는 과정 에서 NullPointer Exception 이상 을 던 집 니 다. 코드 는 다음 과 같 습 니 다.
private static Integer count;
// NullPointerException on unboxing
if(count <= 0){
System.out.println("Count is not started yet");
}
3. 대상 캐 시 자바 는 기본적으로 - 128 에서 127 의 Byte, Short, Integer, Long 대상 을 캐 시 합 니 다. 만 든 대상 이 이 수치 범위 에 있 으 면 캐 시 된 대상 을 되 돌려 줍 니 다. 그렇지 않 으 면 새로운 대상 을 만 듭 니 다.Character 캐 시 범 위 는 0 ~ 127 이 고 Float 와 Double 은 자동 포장 탱크 가 없습니다.이런 디자인 은 향 원 디자인 모델 을 설 계 했 는데 상세 하 게 는 향 원 모델 을 볼 수 있다.그러나, 우 리 는 getAndRemoveCache Properties 방법 을 통 해 JDK 가 Integer 에 설정 한 캐 시 속성 을 가 져 오 거나 제거 할 수 있 으 며, 가상 컴퓨터 옵션 - XX: AutoBoxCacheMax 를 조정 하여 '자동 포장 풀' 의 크기 를 조정 할 수 있 습 니 다.4. 상대 비교
Integer integer1 = 100;
Integer integer2 = 100;
System.out.println("integer1==integer2: " + (integer1 == integer2));// true Integer
System.out.println("integer1.equals(integer2): " + (integer1.equals(integer2)));// true
System.out.println("integer1.compare(integer2): " + integer1.compareTo(integer2));// 0
Integer integer3 = 200;
Integer integer4 = 200;
System.out.println("integer3==integer4: " + (integer3 == integer4));// false new Integer
System.out.println("integer3>integer4: " + (integer3 > integer4)); // false ,
System.out.println("integer3.equals(integer4): " + (integer3.equals(integer4)));// true
System.out.println("integer3.compare(integer4): " + integer3.compareTo(integer4));// 0
Integer integer5 = new Integer(100);
Integer integer6 = new Integer(100);
System.out.println("integer5==integer6: " + (integer5 == integer6)); // false Integer
System.out.println("integer5.equals(integer6): " + (integer5.equals(integer6)));// true
System.out.println("integer5.compare(integer6): " + integer5.compareTo(integer6));// 0
int int1 = 100;
System.out.println("integer1==int1: " + (integer1 == int1));// true Integer int
System.out.println("integer1.equals(int1): " + (integer1.equals(int1)));// true
System.out.println("integer1.compare(int1): " + integer1.compareTo(int1));// 0
int int2 = 200;
System.out.println("integer3==int2: " + (integer3 == int2));// true Integer int
System.out.println("integer3.equals(int2): " + (integer3.equals(int2)));// true
System.out.println("integer3.compare(int2): " + integer3.compareTo(int2));// 0