1.[Think in Java笔记]自动包装器和装箱

简介:

案例


1
2
3
4
5
6
7
8
9
10
11
12
int  i1 =  1024 ;
Integer i2 = Integer.valueOf( "1024" );
System.out.println(i1 == i2); //true
int  i3 =  24 ;
Integer i4 =  new  Integer( "24" );
System.out.println(i3 == i4); //true
int  i5 =  new  Integer( "10" );
Integer i6 =  new  Integer( "10" );
System.out.println(i5 == i6); //true
Integer i7 =  new  Integer( "10" );
Integer i8 =  new  Integer( "10" );
System.out.println(i7 == i8); //false


包装器类概述

基本类型

包装器类

构造函数变元

boolean

Boolean

booleanString

byte

Byte

byteString

char

Character

char

double

Double

doubleString

float

Float

floatdoubleString

int

Integer

intString

long

Long

longString

short

Short

shortString

创建包装器对象

除了Character之外,其余包装器类/都提供两个构造函数:一个以要构建的基本类型作为变元,另一个以要构建类型的String表示作为变元。如:


1
2
Integer i1 =  new  Integer( 24 );
Integer i1 =  new  Integer( "24" );


Boolean包装器类的构造函数带有boolean值true或false,或者以一个值为"true""false"的String作为变元。

包装器转换

primitive.xxxValue() —— 将包装器转换为基本类型


1
2
Float f =  new  Float( 3 .14f);
short  s = f.shortValue();


primitive.parseXxx(String) —— 将String类型转换为基本类型


1
double  d = Double.parseDouble( "3.14" );


Wrapper.valueOf(String) —— 将String转换为包装器


1
Double d = Double.valueOf( "3.14" );


自动装箱

在Java5之前:


1
2
3
4
Integer y =  new  Integer( 567 );
int  x = y.intValue();
x++;
y =  new  Integer(x);


在Java5新特性中:


1
2
Integer y =  new  Integer( 567 );
y++;


代码看上去/在一个对象引用变量上/使用后递增运算符。我们知道,包装器对象是不可变的,这个例子似乎与这种声明相矛盾。实际上,创建了第二个包装器对象,并将值设置为568


1
2
3
4
5
6
Integer y =  567 ;
Integer x = y;
System.out.println(y == x); //true
y++;
System.out.println(x +   " "  + y); //567 568
System.out.println(y == x); //false


因此,在底层,当编译器到达"y++;"这一行时,它必须用如下所示的内容代替它:


1
2
3
int  x2 = y.intValue();
x2++;
y =  new  Integer(x2);


必须在某处有一个new的调用。


装箱、==和equals()方法

对于所有的包装器类,如果两个对象具有相同的类型和相同的值,他们就是相等的。


1
2
3
4
5
6
Integer i1 =  1000 ;
Integer i2 =  1000 ;
System.out.println(i1 == i2); //false
Integer i3 =  10 ;
Integer i4 =  10 ;
System.out.println(i3 == i4); //true


为什么当==指出i3和i4是同一个对象时,i1和i2是不同的对象?为了节省内存,对于下列包装器的对象的两个实例(通过装箱创建),当他们的基本值相同时,他们总是==关系:

lBoolean

lByte

l从\u0000到\u007f的字符(7f是十进制的127)

l-128~127的Short和Integer



1
2
3
4
5
6
7
8
9
10
11
12
13
int  i1 =  1024 ;
Integer i2 = Integer.valueOf( "1024" );
System.out.println(i1 == i2); //true
int  i3 =  24 ;
Integer i4 =  new  Integer( "24" ); //自动装箱
System.out.println(i3 == i4); //true
//这里实际上是:i1 == i2.intValue()
int  i5 =  new  Integer( "10" ); //自动拆箱
Integer i6 =  new  Integer( "10" );
System.out.println(i5 == i6); //true
Integer i7 =  new  Integer( "10" ); //自动装箱
Integer i8 =  new  Integer( "10" ); //自动装箱
System.out.println(i7 == i8); //false


当==用于比较基本值和包装器时,包装器将解除包装,而比较的是在基本指之间进行的。










本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1224754,如需转载请自行联系原作者
目录
相关文章
|
9天前
|
Java
Java基础—笔记—static篇
`static`关键字用于声明静态变量和方法,在类加载时初始化,只有一份共享内存。静态变量可通过类名或对象访问,但推荐使用类名。静态方法无`this`,不能访问实例成员,常用于工具类。静态代码块在类加载时执行一次,用于初始化静态成员。
10 0
|
9天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
14 0
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
9天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
28天前
|
Java
【Java】一个关于装箱的某里面试题
【Java】一个关于装箱的某里面试题
7 1
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--快速排序
数据结构与算法(Java篇)笔记--快速排序
|
1月前
|
机器学习/深度学习 算法 搜索推荐
数据结构与算法(Java篇)笔记--归并排序
数据结构与算法(Java篇)笔记--归并排序
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--插入排序
数据结构与算法(Java篇)笔记--插入排序
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--选择排序
数据结构与算法(Java篇)笔记--选择排序
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--冒泡排序
数据结构与算法(Java篇)笔记--冒泡排序