>  기사  >  Java  >  Java 데이터 유형의 자동 캡슐화, 언박싱 및 예제 분석에 대해 이야기합니다.

Java 데이터 유형의 자동 캡슐화, 언박싱 및 예제 분석에 대해 이야기합니다.

零下一度
零下一度원래의
2017-06-23 10:04:211882검색

inprospose

: autoboxing 및 unboxing은

java 1.5 °에서 소개되었으며, 원시 유형 값을 해당 객체로 자동 변환하려면 객체의

API 및 참조 유형 작업. 자동 박싱 및 언박싱 메커니즘을 사용하면 Java에서 변수 할당이나 메서드 호출 시 기본 유형이나 객체 유형을 더 쉽고 직접적으로 사용할 수 있습니다. Definition:

Autoboxing은

Java 자동으로 int

변수를

Integer 객체로 변환하는 것과 같은 해당 객체로 변환하는 것입니다. 라고 반대로 Integer 객체를 int 유형 값으로 변환하는 것을 언박싱이라고 합니다. 여기서의 boxing과 unboxing은 자동이고 사람이 아닌 변환이기 때문에 자동 boxing과 unboxing이라고 부릅니다. 기본 유형 byte, short, char, int, long, float, doubleboolean에 해당하는 캡슐화 클래스는 Byte, Short, Character, Integer, Long, Float, Double, Boolean입니다. . 구현: 자동으로 박싱할 때 컴파일러는 valueOf

를 호출하여 원래 유형 값을 객체로 변환합니다. 동시에 자동으로 박싱을 해제할 때 컴파일러는

intValue()와 같은 것을 호출합니다. doubleValue()

이 클래스의 메서드는 객체를 기본 유형 값으로 변환합니다.

발생 시간: 기본 유형 값을 전달하면 Java

가 자동으로 기본 유형 값을 해당 개체로 변환합니다.

List<Integer> list = new ArrayList<Integer>();
// 自动装箱
list.add(1);
list.add(2);
// 拆箱
int i = list.get(0);
int ii = list.get(1);

자동 박싱의 단점:

자동 박싱에는 문제가 있습니다. 즉, 다음 예와 같이 자동 박싱 작업이 루프에서 수행되면 중복 개체가 생성되어 성능에 영향을 미칩니다. 프로그램의.

Integer sum = 0;
 for(int i=1000; i<5000; i++){
   sum+=i;
}
위 코드 sum+=i는 sum = sum + i로 볼 수 있지만,

그러나

==,

+

,

-, *, /의 연산은 기호는 Integer 개체 에는 적용할 수 없습니다. 먼저 sum자동 unboxing 작업을 수행하고 숫자 추가 작업을 수행한 다음 마지막으로 자동 boxing 작업 이 발생하여 Integer 개체로 변환됩니다. 프로세스는 다음과 같습니다

int temp = sum.intValue() + i;
Integer sum = new Integer(temp);
여기에서 선언한 sumInteger

유형이므로 거의

5000 쓸모없는 Integer 개체가 위 루프에서 생성됩니다. loop 는 프로그램 성능을 저하시키고 가비지 수집 작업량을 증가시킵니다. 따라서 자동 박싱으로 인한 성능 문제를 방지하려면 이에 주의하고 변수 유형을 올바르게 선언해야 합니다. . 그렇지 않으면 몇 가지 문제가 발생합니다.

1.比较

”==“可以用于原始值进行比较,也可以用于对象进行比较,当用于对象与对象之间比较时,比较的不是对象代表的值,而是检查两个对象是否是同一对象,即检查引用地址是否相同。这个比较过程中没有自动装箱发生。进行对象值比较不应该使用”==“,而应该使用对象对应的equals方法

// 1
int i1=1;
int i2=1;
System.out.println(i2==i1);// true
// 2
Integer I1=1;
System.out.println(I1==i1);// true
Integer I2=1;
System.out.println(I1==I2);// true
// 3
Integer I3 = 128;// 触发自动封装
Integer I4 = 128;
System.out.println(I3==I4);// false
// 4
Integer I5= new Integer(1);// 不触发自动封装
Integer I6= new Integer(1);
System.out.println(I5==I6); // false

值得注意的是第2个小例子的第二个比较,这是一种极端情况。I1和I2的初始化都发生了自动装箱操作。但是处于节省内存的考虑,JVM会缓存-128到127的Integer对象。因为I1和I2实际上是同一个对象。所以使用”==“比较返回true,而第三个小例子使用‘==’返回false

注:自动封装的函数

public static Integer valueOf(int i) {
 return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
 }
private static final Integer[] SMALL_VALUES = new Integer[256];

2.容易混乱的对象和原始数据值

另一个需要避免的问题就是混乱使用对象和原始数据值,一个具体的例子就是当我们在一个原始数据值与一个对象进行比较或赋值时,如果这个对象没有进行初始化或者为Null,在自动拆箱过程中obj.xxxValue,会抛出NullPointerException,如下面的代码

private static Integer count;
if(count>=0){
System.out.println(11111111111L);
}

3.缓存的对象

Java中,会对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回这个对象,否则创建新的Integer对象。

4.生成无用对象

因为自动装箱会隐式地创建对象,像前面提到的那样,如果在一个循环体中,会创建无用的中间对象,这样会增加GC压力,拉低程序的性能。所以在写循环时一定要注意代码,避免引入不必要的自动装箱操作。

위 내용은 Java 데이터 유형의 자동 캡슐화, 언박싱 및 예제 분석에 대해 이야기합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.