java 自动装箱拆箱实现方法

java 自动装箱拆箱实现方法

什么是自动装箱拆箱

基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自j2se 5.0开始提供的功能。 

一般我们要创建一个类的对象的时候,我们会这样:

class a = new class(parameter);

当我们创建一个integer对象时,却可以这样:

integer i = 100; (注意:不是 int i = 100; )

实际上,上面那句代码相当于:integer i = new integer(100); 此即基本数据类型的自动装箱功能。

 

??基本数据类型与对象的差别 

基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。

基本数据类型没有可调用的方法。

eg: int t = 1; t. 后面是没有方法滴。

integer t =1; t. 后面就有很多方法可让你调用了。

 

??什么时候自动装箱

例如:integer i = 100;

相当于编译器自动为您作以下的语法编译:integer i = new integer(100);

 

??什么时候自动拆箱

自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:

1 integer i = 10;        //装箱 
2   int t = i;             //拆箱

 

在进行运算时,也可以进行自动装箱与拆箱。 

1 integer i = 10;   
2 system.out.println(i++);
integer的自动装箱

 //在-128~127 之外的数
 integer i1 = 200; 
 integer i2 = 200;         
 system.out.println("i1==i2: "+(i1==i2));                  
 // 在-128~127 之内的数
 integer i3 = 100; 
 integer i4 = 100; 
 system.out.println("i3==i4: "+(i3==i4));

输出的结果是:

    i1==i2: false
    i3==i4: true 

说明:

equals() 比较的是两个对象的值(内容)是否相同。

"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。

 

在自动装箱时对于值从–128到127之间的值,它们被装箱为integer对象后,会存在内存中被重用,

所以范例中,i3 与 i4实际上参考至同一个对象。

如果超过了从–128到127之间的值,被装箱后的integer对象并不会被重用,

即相当于每次装箱时都新建一个 integer对象,所以范例中,i1与i2参考的是不同的对象。

 

??string 的拆箱装箱

先看个例子:

1            string str1 = "abc";
2            string str2 = "abc";
3            system.out.println(str2==str1);  //输出为 true
4             system.out.println(str2.equals(str1));  //输出为 true
5            
6            string str3 = new string("abc");
7            string str4 = new string("abc");
8            system.out.println(str3==str4);  //输出为 false
9             system.out.println(str3.equals(str4));  //输出为 true 

 

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

1         string d ="2";    
2         string e = "23";
3         e = e.substring(0, 1);
4         system.out.println(e.equals(d));       //输出为 true     
5          system.out.println(e==d);           //输出为 false

 

第二个例子中,e的初始值与d并不同,因此e与d是各自创建了个对象,(e==d)为false 。

时间: 2024-09-26 19:50:52

java 自动装箱拆箱实现方法的相关文章

java自动装箱拆箱深入剖析_java

这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱): 其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象:例如用int来举例: 复制代码 代码如下: //声明一个Integer对象 Integer num = 10; //以上的声明就是用到了自动的装箱:解析为 Integer nu

Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Autoboxing/unboxing):2.1.自动装箱:2.2.自动拆箱:2.3.Integer类相关的源代码:2.3.1.valueOf方法:3.可变参数:3.1.包含可变参数的函数:3.2.接收参数:3.3.说明: 1.For each循环: JDK5.0中提供的新特性For each循环的加入简

Java 性能要点:自动装箱/ 拆箱 (Autoboxing / Unboxing)

[编者按]本文作者为 Ali Kemal TASCI,最早于2016年4月9日发布于DZONE社区.文章主要介绍通过改进 Java 1.5 就已存在的骨灰级特性大幅度提高应用性能. 本文系 OneAPM 工程师编译呈现,以下为正文. 如果我告诉你:"只要修改一个字符,下面这段代码的运行速度就能提高5倍.",你觉得可能么? long t = System.currentTimeMillis(); Long sum = 0L;for (long i = 0; i < Integer.

装箱拆箱中内存分布的流程

问题描述 装箱拆箱中内存分布的流程 装箱问题,我在msdn上看到的说明又变糊涂了; object o=1; 我们知道这里发生了装箱,在堆上开辟了内存空间并且返回了一个引用给o,这个o现在是谁?(我原来理解就是这个新开辟的内存就是o,那这个引用返回给谁?) 我在msdn上看到说是栈上面的"The result of this statement is creating an object reference o, on the stack, that references a value of t

list-link中使用List&amp;amp;lt;object&amp;amp;gt;还需要装箱拆箱么?

问题描述 link中使用List<object>还需要装箱拆箱么? link中使用List还需要装箱拆箱么? 解决方案 首先搞清楚,装箱拆箱在什么情况下发生,当你将堆栈上的变量放入维持object引用的集合的时候,必然要装箱.试想,如果List不装箱,而直接存int,那么它存另一种类型,比如string 存入的是引用(地址),岂不是乱套了,它怎么知道这个是int的值还是string的引用.所以必须都装箱成对象. 所以结论就是,需要.

java自动生成ID号的方法_java

本文实例讲述了java自动生成ID号的方法.分享给大家供大家参考.具体实现方法如下: import java.util.UUID; public class SystemAttribute { public static String getUUID() { return UUID.randomUUID().toString().replace("-",""); } } 希望本文所述对大家的java程序设计有所帮助. 以上是小编为您精心准备的的内容,在的博客.问答.

Java自动装箱与拆箱

  自动装箱与拆箱机制在实际使用中非常常见,不过也特别容易出错,博主在面对下面一道题的时候自信满满,可还是没有能够全对,所以写下这篇博文,给自己对自动装箱与拆箱机制做一下知识巩固,也给各位朋友做一下参考.   首先有这样一道题,给出下面代码的输出结果: public class AutoBoxing { public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d =

Java 自动装箱性能

Java 的基本数据类型(int.double. char)都不是对象.但由于很多Java代码需要处理的是对象(Object),Java给所有基本类型提供了包装类(Integer.Double.Character).有了自动装箱,你可以写如下的代码 Character boxed = 'a';  char unboxed = boxed;  编译器自动将它转换为 Character boxed = Character.valueOf('a');  char unboxed = boxed.cha

C#装箱拆箱操作演示代码

  C#装箱和拆箱操作的演示代码,不知道什么是装箱和拆箱的这里就不介绍了,是栈和堆的使用方面的东西,C#专业达人应该都知道,所以这里就不哆嗦了,代码也是面向C#新手的,挺简单: