首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基本数据类型的包装类

基本数据类型的包装类

包装类基本知识JAVA 并不是纯面向对象的语言。Java 语言是一个面向对象的语言,但是 Java 中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。包装类均位于 java.lang 包,包装类和基本数据类型的对应关系如下表所示:在这八个类名中,除了 Integer 和 Character 类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。包装类的用途对于包装类说,这些类的用途主要包含两种:1、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。2、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本类型数据、包装类对象、字符串之间提供转化!)。所有的包装类(Wrapper Class)都有共同的方法,他们是:

/**

* 测试Integer的用法,其他包装类类似

*/

publicclassWraper{

publicstaticvoidmain(String[]args) {

// 基本类型转换成Integer对象

Integerint1=newInteger(10);

Integerint2=Integer.valueOf(20);

// Integer对象转换成int

inta=int1.intValue();

// 字符串转化成Integer对象

Integerint3=Integer.parseInt("334");

Integerint4=newInteger("999");

// Integer对象转化成字符串

Stringstr1=int3.toString();

// 一些常见的int类型相关的常量。

System.out.println("int能表示的最大整数:"+Integer.MAX_VALUE);

System.out.println("int能表示的最小整数:"+Integer.SIZE);

// 数字转字符串非常简单

Stringstr=234+"";

System.out.println(str);

}

}

自动装箱和拆箱

就是将基本类型和包装类进行自动的互相转换。JDK 5.0 后,将自动装箱/拆箱引入 java 中。自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用 intValue() 和 doubleValue() 等方法。自动装箱与拆箱的功能事实上是编译器来帮你的忙,编译器在编译时期依你所编写的语法,决定是否进行装箱或拆箱动作。例如:Integer i = 100;相当于编译器自动为您作以下的语法编译:Integer i = new Integer(100);所以自动装箱与拆箱的功能是所谓的 “编译器蜜糖” (Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段你得了解 Java 的语义。例如下面的程序是可以通过编译的:Integer i = null;int j = i;这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:Integer i = null;int j = i.intValue();null 表示 i 没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上 i 并没有参考至任何的对象,所以也就不可能操作 intValue() 方法,这样上面的写法在运行时会出现 NullPointerException 错误。自动装箱和自动拆箱的案例代码:

/**

- 测试自动装箱和拆箱

- 结论:虽然很方便,但是如果不熟悉特殊情况,可能会出错!

*/

staticvoidtestBoxing(){

//自动装箱

Integerb=23;

//自动拆箱

inta=newInteger(20);

//自动装箱和拆箱,实际上是编译器替我们完成了代码的自动编译,比如:Integer b = 23, 其实运行时执行的仍然是:Integer b = new Integer(23);

//自动装箱拆箱时,对于-128-127之间的值,编译器仍然会把它当做基本类型处理。

Integerh=100;Integeru=100;

Integerh2=200;Integeru2=200;

if(h==u){// 打印:100等于

System.out.println("100等于");

}

if(h2==u2){//并没有打印 200等于,

System.out.println("200等于");

}

}

对于 int 这个基本数据类型要注意一下,在 [-128,127] 之间的数在 Integer 类被加载后就缓存起来了,所以在这个区域之间的数的 Integer 对象都为缓存中同一个对象的引用。

Integer 缓存源码:

privatestaticclassIntegerCache{

staticfinalintlow=-128;

staticfinalinthigh;

staticfinalIntegercache[];

static{

// high value may be configured by property

inth=127;

StringintegerCacheHighPropValue=

sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

if(integerCacheHighPropValue!=null) {

try{

inti=parseInt(integerCacheHighPropValue);

i=Math.max(i,127);

// Maximum array size is Integer.MAX_VALUE

h=Math.min(i,Integer.MAX_VALUE-(-low)-1);

}catch(NumberFormatExceptionnfe) {

// If the property cannot be parsed into an int, ignore it.

}

}

high=h;

cache=newInteger[(high-low)+1];

intj=low;

for(intk=;k

cache[k]=newInteger(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)

assertIntegerCache.high>=127;

}

privateIntegerCache() {}

}大体思想:在 Integer 内创建一个私有的非静态内部类,然后将 [-128,127] 之间的数都转化为 Integer 包装类,然后再存入不可变 Integer 数组中 ( final Integer cache[]);

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180717G1X1CH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券