Java自动装箱与拆箱

Java自动装箱与拆箱

image-20211022103323489

为什么需要包装数据类型

Java是一门面向对象的语言,而基本数据类型不具备面向数据的特征,

  • 当我们需要对某些数据进行表达的时候,基本数据类型无法完成,举例说明

在考试中,我们需要表示考试成绩为零分和没有参加考试的同学的状态,基本数据类型无法满足,因为基本数据类型的默认值为0而包装数据类型可以使用null来表示没有参加考试的同学,这种功能在MySQL数据库的存储方面非常常见。

基本数据类型 0
包装数据类型 null

对应关系

java.lang.XXX

8种基本数据类型,八种包装数据类型

基本数据类型-----包装数据类型
byte ------Byte
short ------Short
int-----Integer
long----Long
float ----Float
double----Double
boolean----Boolean
char ---- Character

装箱:基本数据类型转换为包装类

Integer integer = new Integer(123);

构造方法进行装箱

Integer(int value)构造一个新分配的 Integer对象,该对象表示指定的 int值。
Integer(String s)构造一个新分配 Integer对象,表示 int由指示值 String参数。

拆箱:包装类转换为基本数据类型

int i = integer.intValue();
float v = integer.floatValue();
System.out.println(v);
System.out.println(i);

拆箱方法

image-20211022102358350

获取最大值最小值

System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);

自动拆箱装箱

自动拆箱、装箱是从JDK1.5开始才有的特性

基本数据类型可以直接赋值给包装数据类型

包装数据类型也可以直接复制给基本数据类型

有了自动拆箱自动装箱,Number里面的这几个方法就用不着了

image-20211022103811272

//自动装箱
Integer total = 99; 
//自动拆箱
int totalprim = total;

Integer integer=123;
System.out.println(integer);
int i=integer;
System.out.println(i);
Integer total = 99; 

其实这就是自动装箱的过程,上面程序在执行Integer b=a;的时候调用了Integer.valueOf ( int i ) 方法,`Integer b=a; 这段代码等同于:Integer b=Integer.valueOf ( a ) 。

同样是new了两个对象,内存地址不同

用处

方便编程和运算

运算的时候

注意:

image-20211022110645495

大于128的时候,会重新new一个对象,否则的话,就去整数常量池中拿[-128~127]

缓存池

image-20211022110753904

注意问题(面试题)

为什么 Java 中“10001000”为false,而”100100“为true? 这是一个挺有意思的讨论话题。

如果你运行下面的代码:

Integer a = 1000, b = 1000;  
System.out.println(a == b);//1
Integer c = 100, d = 100;  
System.out.println(c == d);//2

你会得到

false
true

基本知识:我们知道,如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。

如果不需要新的 {@code Integer} 实例,则通常应优先使用此方法而不是构造函数 {@link Integer(int)},因为此方法可能会通过缓存频繁请求的方式产生明显更好的空间和时间性能值。

此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

把这些小整数进行一个缓存,告诉取出,不新建对象

数字转换异常

不是什么东西都能转成Integer

构造一个新分配Integer对象,表示int由指示值String参数。 字符串将转换为int值,正好与基数为parseInt方法一样。

异常

NumberFormatException - 如果 String不包含可解析整数。

随机数

Ramdom

intnextInt()返回下一个伪随机数,从这个随机数发生器的序列中均匀分布 int值。
intnextInt(int bound)返回伪随机的,均匀分布 int介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。
Random random = new Random();
//随机产生一个整数
int i = random.nextInt();
System.out.println(i);

//产生一个0-bound范围内的随机数
int i1 = random.nextInt(101);
System.out.println(i1);

附录:八种基本数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:

  • ​ byte 数据类型是8位、有符号的,以二进制补码表示的整数;
  • ​ 最小值是 -128(-2^7);
  • ​ 最大值是 127(2^7-1);
  • ​ 默认值是 0;
  • ​ byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
  • ​ 例子:byte a = 100,byte b = -50。

short:

  • ​ short 数据类型是 16 位、有符号的以二进制补码表示的整数
  • ​ 最小值是 -32768(-2^15);
  • ​ 最大值是 32767(2^15 - 1);
  • ​ Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
  • ​ 默认值是 0;
  • ​ 例子:short s = 1000,short r = -20000。

int:

  • ​ int 数据类型是32位、有符号的以二进制补码表示的整数;
  • ​ 最小值是 -2,147,483,648(-2^31);
  • ​ 最大值是 2,147,483,647(2^31 - 1);
  • ​ 一般地整型变量默认为 int 类型;
  • ​ 默认值是 0 ;
  • ​ 例子:int a = 100000, int b = -200000。

long:

  • ​ long 数据类型是 64 位、有符号的以二进制补码表示的整数;
  • ​ 最小值是 -9,223,372,036,854,775,808(-2^63);
  • ​ 最大值是 9,223,372,036,854,775,807(2^63 -1);
  • ​ 这种类型主要使用在需要比较大整数的系统上;
  • ​ 默认值是 0L;
  • ​ 例子: long a = 100000L,Long b = -200000L。
    "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。

float:

  • ​ float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
  • ​ float 在储存大型浮点数组的时候可节省内存空间;
  • ​ 默认值是 0.0f;
  • ​ 浮点数不能用来表示精确的值,如货币;
  • ​ 例子:float f1 = 234.5f。

double:

  • ​ double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;

  • ​ 浮点数的默认类型为 double 类型;

  • ​ double类型同样不能表示精确的值,如货币;

  • ​ 默认值是 0.0d;

  • 例子:

    double   d1  = 7D ;
    double   d2  = 7.; 
    double   d3  =  8.0; 
    double   d4  =  8.D; 
    double   d5  =  12.9867; 
    

    7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。

boolean:

  • ​ boolean数据类型表示一位的信息;
  • ​ 只有两个取值:true 和 false;
  • ​ 这种类型只作为一种标志来记录 true/false 情况;
  • ​ 默认值是 false;
  • ​ 例子:boolean one = true。

char:

  • ​ char 类型是一个单一的 16 位 Unicode 字符;
  • ​ 最小值是 \u0000(十进制等效值为 0);
  • ​ 最大值是 \uffff(即为 65535);
  • ​ char 数据类型可以储存任何字符;
  • ​ 例子:char letter = ‘A’;。

类型默认值

下表列出了 Java 各个类型的默认值:

数据类型默认值
byte0
short0
int0
long0L
float0.0f
double0.0d
char‘u0000’
String (or any object)null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值