自动装箱和自动拆箱

装箱是Integer.valueOf(int i),那么拆箱是:i.intValue()


整形的也是 变量变化在分配空间, 值相同 句柄指向1块内存


String str1 ="abc";
String str2="abc";
System.out.println(str2==str1);//输出为 true 
System.out.println(str2.equals(str1));//输出为 true 
 
String str3=new String("abc");
String str4=new String("abc");
System.out.println(str3==str4);//输出为 false 
System.out.println(str3.equals(str4));//输出为 true 



这个怎么解释呢?貌似看不出什么。那再看个例子。


String d="2";
String e="23";
e= e.substring(0,1);
System.out.println(e.equals(d));//输出为 true 
System.out.println(e==d);//输出为 false 



GET: http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html

<think>好的,我现在要解释自动装箱自动拆箱的概念。首先,我需要确认用户对这些术语的了解程度。可能他们听说过Java的自动类型转换,但不太清楚具体细节。自动装箱拆箱是Java中的特性,所以需要结合Java的基本数据类型包装类来讲解。 用户之前问过面向对象面向过程的区别,所以可能有一定的编程基础,但可能需要用更易懂的例子来说明。首先,我需要明确自动装箱(Autoboxing)自动拆箱(Unboxing)的定义。自动装箱是将基本数据类型自动转换为对应的包装类对象,而自动拆箱则是相反的过程,将包装类对象自动转换为基本数据类型。 接下来,我应该举一些例子,比如将int转换为Integer,或者将Integer转换为int。比如,当把一个int值赋给Integer对象时,Java会自动进行装箱操作,反之亦然。这样用户可以通过代码示例更直观地理解。 同时,需要提到Java引入这些特性的目的,主要是为了简化代码,让开发者在基本类型包装类之间转换时不需要手动调用方法,比如Integer.valueOf()或者intValue()。这样可以减少代码的冗余,提高可读性。 另外,需要注意自动装箱拆箱可能带来的性能问题。虽然它们方便,但在大量循环或高频操作中,频繁的装箱拆箱可能会影响性能,因为涉及到对象的创建销毁。这时候可能需要提醒用户注意使用场景,避免不必要的性能损耗。 可能用户还会想知道这些特性在哪些Java版本中引入的,我记得是从Java 5(JDK 1.5)开始支持的。这一点也需要提到,以增加回答的准确性。 然后,我需要考虑用户可能的疑问,比如为什么要有包装类?这时候可以解释基本数据类型无法用于泛型,比如集合类如ArrayList只能存储对象,所以需要包装类。而自动装箱拆箱让这种转换变得无缝,方便使用。 另外,可能存在的陷阱,比如自动拆箱时的空指针异常。例如,如果一个Integer对象为null,尝试拆箱为int时会抛出NullPointerException。这也是需要注意的地方,应该在回答中提醒用户。 最后,总结一下自动装箱拆箱的优缺点,以及适用场景,帮助用户全面理解。确保语言简洁明了,避免使用过多技术术语,让不同层次的读者都能理解。</think>以下通过「快递打包」的比喻解释自动装箱自动拆箱: $$ \begin{cases} \text{自动装箱} = \text{把商品装进快递盒} \\ \text{自动拆箱} = \text{拆快递取出商品} \end{cases} $$ **一、基础概念** 1. **基本数据类型**:直接存储值的简单类型 (如:`int`、`double`、`boolean`) 2. **包装类**:包裹基本数据类型的对象 (如:`Integer`、`Double`、`Boolean`) **二、核心机制演示** ```java // 自动装箱(JDK1.5+自动完成) Integer boxed = 42; // 相当于 Integer.valueOf(42) // 自动拆箱 int unboxed = boxed; // 相当于 boxed.intValue() ``` **三、底层实现原理** 1. **装箱过程** $$ \text{int} \xrightarrow{\text{valueOf()}} \text{Integer} $$ - 触发场景:将基本类型赋值给包装类 - 实际调用`Integer.valueOf()`方法 2. **拆箱过程** $$ \text{Integer} \xrightarrow{\text{xxxValue()}} \text{int} $$ - 触发场景:将包装类赋值给基本类型 - 实际调用`intValue()`方法 **四、典型应用场景** 1. **集合类存储** ```java List<Integer> numbers = new ArrayList<>(); numbers.add(100); // 自动装箱 int first = numbers.get(0); // 自动拆箱 ``` 2. **泛型参数传递** ```java public static <T> void process(T param) {} process(3.14); // 自动装箱为Double ``` **五、注意事项** 1. **缓存机制** ```java Integer a = 127; Integer b = 127; System.out.println(a == b); // true(使用缓存对象) Integer c = 128; Integer d = 128; System.out.println(c == d); // false(新建对象) ``` 2. **性能损耗** ```java // 循环中频繁装箱拆箱(不推荐) Long sum = 0L; for(int i=0; i<100000; i++){ sum += i; // 每次循环发生自动装箱 } ``` 3. **空指针风险** ```java Integer num = null; int value = num; // 运行时抛出NullPointerException ``` **六、不同类型对照表** | 基本类型 | 包装类 | 装箱方法 | 拆箱方法 | |----------|-------------|-------------------|----------------| | byte | Byte | Byte.valueOf() | byteValue() | | short | Short | Short.valueOf() | shortValue() | | int | Integer | Integer.valueOf() | intValue() | | long | Long | Long.valueOf() | longValue() | | float | Float | Float.valueOf() | floatValue() | | double | Double | Double.valueOf() | doubleValue() | | char | Character | Character.valueOf() | charValue() | | boolean | Boolean | Boolean.valueOf() | booleanValue() | **七、特殊场景处理** 1. **三目运算符陷阱** ```java Integer result = condition ? 100 : null; // 当condition为false时,自动拆箱导致NPE ``` 2. **方法重载优先级** ```java void test(int x) { System.out.println("基本类型"); } void test(Integer x) { System.out.println("包装类"); } test(10); // 输出"基本类型"(优先选择基本类型重载) ``` 理解自动装箱/拆箱就像掌握快递打包技巧:合理使用能提升效率,但要注意包装成本(性能)空包裹风险(NPE)。在开发中应根据场景选择直接操作基本类型还是使用包装类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值