Java 进阶——自动装箱和自动拆箱

1、什么是自动装箱拆箱

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

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

 Class a = new Class(parameter);

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

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

实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100);

此即基本数据类型的自动装箱功能。

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

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

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

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

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

1)什么时候自动装箱
例如:Integer i = 100;

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

2)什么时候自动拆箱

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

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Integer i = 10//装箱   
  2. int t = i; //拆箱,实际上执行了 int t = i.intValue();  

在进行运算时,也可以进行拆箱。

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Integer i = 10;   
  2. System.out.println(i++);   

 

3、Integer的自动装箱

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. //在-128~127 之外的数  
  2.  Integer i1 =200;    
  3.  Integer i2 =200;            
  4.  System.out.println("i1==i2: "+(i1==i2));                     
  5.  // 在-128~127 之内的数  
  6.  Integer i3 =100;    
  7.  Integer i4 =100;    
  8.  System.out.println("i3==i4: "+(i3==i4));  

输出的结果为:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. i1==i2: false      
  2. i3==i4: true  

 说明:

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

 

前面说过,int 的自动装箱,是系统执行了 Integer.valueOf(int i),先看看Integer.Java的源码:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public static Integer valueOf(int i) {   
  2.     if(i >= -128 && i <= IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127   
  3.         return IntegerCache.cache[i + 128];   
  4.     else  
  5.         return new Integer(i);   
  6. }   

对于–128到127(默认是127)之间的值,Integer.valueOf(int i) 返回的是缓存的Integer对象(并不是新建对象)

所以范例中,i3 与 i4实际上是指向同一个对象。

而其他值,执行Integer.valueOf(int i) 返回的是一个新建的 Integer对象,所以范例中,i1与i2 指向的是不同的对象。

当然,当不使用自动装箱功能的时候,情况与普通类对象一样,请看下例:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Integer i3 =new Integer(100);   
  2. Integer i4 =new Integer(100);   
  3. System.out.println("i3==i4: "+(i3==i4));//显示false  

 

4、String 的拆箱装箱

先看个例子:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  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  

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

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. String d ="2";   
  2. String e ="23";  
  3. e = e.substring(01);  
  4. System.out.println(e.equals(d)); //输出为 true   
  5. System.out.println(e==d); //输出为 false   

第二个例子中,e的初始值与d并不同,因此e与d是各自创建了个对象,(e==d)为false 。
同理可知,第一个例子中的str3与str4也是各自new了个对象,而str1与str2却是引用了同一个对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于KVM的虚拟化研究及应用

引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM&#xff0f;370大型机上&#xff0c;这项技术极大地提高了大型机资源利用率。随着软硬件技术的迅速发展&#xff0c;这项属于大型机及专利的技术开始在普通X86计算机上应用并成为当前计算机发展和研究的一个热点方向。目前&am…

Java 进阶—— super 和 this 的用法

一、this Java关键字this只能用于方法方法体内。当一个对象创建后&#xff0c;Java虚拟机&#xff08;JVM&#xff09;就会给这个对象分配一个引用自身的指针&#xff0c;这个指针的名字就是this。因此&#xff0c;this只能在类中的非静态方法中使用&#xff0c;静态方…

unity中脚本编辑器UnIDE

引言 unity默认脚本编辑器是MonoDevelop&#xff0c;随着unity4.3面世&#xff0c;MonoDevelop (4.0.1)版本也随之而来&#xff0c;更新为界面更改和bug自动修复功能等&#xff0c;具体还未使用。 点击unity的Edit下的属性(preference)&#xff0c;可以更改默认脚本编辑器&…

apk,task,进程区别

2019独角兽企业重金招聘Python工程师标准>>> apk&#xff0c;task&#xff0c;进程区别 apk一般占一个dalvik,一个进程&#xff0c;一个task。通过设置也可以多个进程,占多个task。 task是一个activity的栈&#xff0c;其中"可能"含有来自…

Java 线程 —— 基础篇

一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程。比如在Windows系统中&#xff0c;一个运行的exe…

【Java并发性和多线程】线程安全及不可变性

2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接&#xff1a;http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html 译文链接&#xff1a;http://ifeve.com/thread-safety-and-immutability/ 当多个线程同时访问…

Java 高级—— IO 基础

一、File 类 先看一下File 类的定义 [java] view plaincopy public class File extends Object implements Serizliable Comparable<File> 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括…

安装 SharePoint 2013 Foundation

一、Foundation版本的区别Foundation版本的区别见附件&#xff08;英文&#xff09;。官网下载地址 http://www.microsoft.com/zh-cn/download/details.aspx?id35488二、安装必备软件三、独立安装模式1. 启动安装向导2. 接受软件许可条款3. 选择服务器类型和数据位置4. 结束安…

Java 异常处理机制

异常处理是程序设计中一个非常重要的方面&#xff0c;也是程序设计的一大难点&#xff0c;从C开始&#xff0c;你也许已经知道如何用if...else...来控制异常了&#xff0c;也许是自发的&#xff0c;然而这种控制异常痛苦&#xff0c;同一个异常或者错误如果多个地方出现&#x…

架构师未来性的基础:简单性

作者&#xff1a;高焕堂&#xff0c;misoo.twqq.com 首页&#xff1a;Backee e架构师未来性的基础&#xff1a;简单性 Apple公司创始人乔布斯(Steve Jobs)曾说到&#xff1a;“简单比复杂更难&#xff0c;你必须努力让你的想法变得清晰…

Android 基础—— 对Context的理解与使用技巧

一、Context 基础概念 1、什么是Context 1) Context是一个抽象类&#xff0c;其通用实现在ContextImpl类中。 2) Context&#xff1a;是一个访问application环境全局信息的接口&#xff0c;通过它可以访问application的资源和相关的类&#xff0c;其主要功能如下&a…

Android 四大组件 —— 广播(广播机制解析)

在网络通信中&#xff0c;一个IP网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的IP 范围是192.168.0.XXX&#xff0c;子网掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口&#xff…

Android 基础 —— 活动的生存周期

一、返回栈 Android 中的活动是可以层叠的。我们每启动一个新的活动&#xff0c;就会覆盖在原活动之上&#xff0c;然后点击Back 键会销毁最上面的活动&#xff0c;下面的一个活动就会重新显示出来。 其实Android 是使用任务&#xff08;Task&#xff09;来管理活动的&#xff…

产品经理做市场调研和数据分析的方法

产品经理&#xff0c;你对用户的需求了解多少呢&#xff1f;你知道用户想要什么样的产品吗&#xff1f;你想知道用户将会如何看待你的产品吗&#xff1f;你想知道你设计的产品在用户中的口碑如何吗&#xff1f; 是 的。每一个产品经理都希望在产品开始立项设计前&#xff0c;得…

Android 基础 —— 活动的启动模式

活动的启动模式来说应该是个全新的概念&#xff0c;在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有四种&#xff0c;分别是standard、singleTop、singleTask 和singleInstance &#xff0c; 可以在AndroidManifest.xml 中通过给<activity…

Android 四大组件 —— 服务

一、服务是什么 服务&#xff08;Service&#xff09;是Android 中实现程序后台运行的解决方案&#xff0c;它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面&#xff0c;即使当程序被切换到后台&#xff0c;或者用户打开了…

Highlighting System

Highlighting System 法线贴图漫反射着色器 Unity论坛&#xff1a;http://forum.unity3d.com/threads/143043-Highlighting-System-Released 需要条件 Requires Unity 3.5.6 or higher.This package requires Unity Pro, as it uses post-processing!Now supports Unity iOS Pr…

Android 基础 —— 模拟实现拨打电话功能

前面已经学习活动的显示跳转及隐式跳转&#xff0c;也学习 TextView 及 Button 两个控件的使用&#xff0c;下面我们来学习 EditText的使用&#xff1a; EditText 是程序用于和用户进行交互的另一个重要控件&#xff0c;它允许用户在控件里输入和编辑内容&#xff0c;并可以在程…

Android 四大组件 —— 活动(活动的隐式跳转)

上一篇我们讨论了活动的显示跳转&#xff0c;现在来学习活动的隐式跳转 相比于显式Intent&#xff0c;隐式Intent 则含蓄了许多&#xff0c;它并不明确指出我们想要启动哪一个活动&#xff0c;而是指定了一系列更为抽象的action 和category 等信息&#xff0c;然后交由系统去分…

ALAssetsLibrary-代码操作iOS相册资源

2019独角兽企业重金招聘Python工程师标准>>> 在iOS中&#xff0c;我们调用摄像头和选择相册中的资源&#xff0c;我们可以使用&#xff1a;UIImagePickerController类来完成。 当然&#xff0c;我们也可以不使用UI的形式来访问iOS设备的相册资源。 那就是使用&#…