新数据结构(8)——包装类

基本数据类型(轻点)

Java基本数据类型在内存中占用固定的大小,并且直接存储值,而不是对象的引用

整数类型

byte:8位,存储范围从-128到127

short:16位,存储范围从-32,768到32,767

int:32位,存储范围从-231-1,即-2,147,483,648到2,147,483,647。这是最常用的整数类型

long:64位,存储范围从-263-1。在数值后面加上Ll表示这是一个long类型的值

浮点类型

float:32位,单精度浮点数。在数值后面加上Ff表示这是一个float类型的值

double:64位,双精度浮点数。这是最常用的浮点数类型

字符类型

char:16位,存储Unicode字符。字符字面量用单引号括起来,例如'A'

布尔类型

boolean:表示真(true)或假(false

引用数据类型(轻点)

数组、类、接口

数组是一种可以存储多个相同类型数据的容器,它在内存中是连续存储的使用new关键字:int[] arr = new int[5];,表示创建一个长度为5的整型数组。直接初始化:int[] arr = {1, 2, 3, 4, 5};

类是Java中定义对象的模板,它封装了数据和操作这些数据的方法。类可以包含成员变量(属性)和成员方法(行为)。类支持继承、封装和多态等面向对象的特性。类是引用类型,通过new关键字创建对象实例,对象存储在堆内存中。定义一个类:public class Person { String name; int age; }。创建对象实例:Person person = new Person();

接口是一种特殊的引用数据类型,它定义了一组方法规范,但不提供具体实现。接口中的方法默认是public abstract,成员变量默认是public static final。从JDK 8开始,接口可以包含默认方法和静态方法。接口支持多继承,一个类可以实现多个接口。定义接口:public interface USB3 { void in(); void out(); }。实现接口:public class USBDevice implements USB3 { public void in() { ... } public void out() { ... } }。接口用于定义对象的行为规范,允许不同的类实现相同的接口,从而实现多态。

包装类的引入(中点)

对象的基本概念:对象是类的实例化,是堆内存中的一块内存空间。

在Java编程语言中,尽管很多概念都可以被视作对象来处理,但基本数据类型本身并不直接对应对象。为了弥补这一不足,并使基本数据类型能够像对象一样被操作,Java引入了包装类。这些包装类将基本数据类型封装在对象内部,从而允许基本数据类型以对象的形式存在和操作

基本数据类型和其对应包装类

如下图所示,基本数据类型byte的变量无法指向空值(null),因为它不是指针类型,而是直接存储数据值。相反,Byte作为byte的包装类,其对象可以指向空值(null),这证明了包装类Byte并不是基本数据类型,而是Java提供的一种将基本数据类型封装为对象的机制

128陷阱(重点)

128陷阱是Java编程语言中Integer类的一个特有现象,具体体现在当进行自动装箱时,数值-128到127之间的整数会被缓存并重用,而超出此范围的数值则不会,下图具体展示了这一陷阱的体现:

在创建对象时,通常需要为新对象开辟独立的内存空间。然而,Java的Integer类的valueOf()方法采用了一种特殊的机制,它预先创建并分配了一个包含-128到127范围内所有整数的数组。当使用valueOf()方法为在此范围内的整数赋值时,该方法会直接从该数组中取出对应的Integer对象,并返回其内存地址供使用,从而避免了不必要的内存分配。相反,如果赋值的整数超出了这个范围,valueOf()方法则会为新的整数值开辟独立的内存空间。这种内存分配方式的具体实现细节如下图所示。在上图中,变量a1和a2之所以相等,是因为它们都被赋值为-128到127范围内的整数,因此valueOf()方法使它们指向了数组中相同的Integer对象地址。而变量a3和a4不相等,则是因为它们被赋值为超出该范围的整数值,valueOf()方法为它们各自开辟了新的内存空间,因此它们指向的是不同的Integer对象地址。

自动拆装箱(重点)

将基本数据类型int转换为对应的包装类Integer的过程被称为装箱

将包装类Integer转换回基本数据类型int的过程则被称为拆箱

int  a = 10;
int  b = 10;
Integer a1 = 10;
Integer b1 = 10;
Integer a2 = new Integer(10);
Integer b2 = new Integer(10);
System.out.println(a == b);
//True  a和b存储的是相同的整数值,且它们都是基本数据类型,直接进行值比较相等
System.out.println(a1 == b1);
//True  由于128陷阱,a1和b1实际上引用的是同一个Integer对象的数组里的相同地址,输出True
System.out.println(a2 == b2);
//False 通过new关键字显式地创建了两个新的Integer对象a2和b2,即使它们的值都是10,但它们是两个不同的对象,存储在内存中的不同位置
System.out.println(a1 == a);
//True  在进行比较时,Java会自动将Integer对象a1拆箱为基本数据类型int的值,然后与基本数据类型int的变量a进行比较
System.out.println(a1.equals(a));
//True  和上面一样是自动拆箱,判断时候Integer要转出int来判断. equals()的底层还是==
System.out.println(a1 == a2);
//False  a1的值10是从catch数据当中获取的  a2的值10是自己创建创建的对象.
System.out.println(a == a2);
//True  自动拆箱,a2是Integer类型的 a是int类型的,判断时候Integer要转出int来判断.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值