包装类学习

包装类

包装类与基本数据类型

Java中的数据类型:

包装类常用方法

包装类的常用方法
1、包装类修饰符中有final,不能被继承
2、基本数据类型中的数值类型(byte、short、int、long、float、double)的包装类继承自Number类
3、字符型char和布尔型boolean的包装类继承自Object
4、java中所有的包装类都存放在java.lang包中
5、包装类的方法大部分都是static方法:静态方法既可以通过类名调用也可以通过对象名调用

基本数据类型和包装类之间的转换|比较

比较

Java是一种面向对象的编程语言,但Java中却存在8种“特殊的”数据类型它们不支持面向对象的编程机制,也不具备面向对象的特性(不包含任何属性和方法)。

这8中数据类型分别为byte、short、int、long、char、double、float以及boolean,它们被称为Java的8种基本数据类型。兼容这8种基本数据类型给开发带来了一定的便利,例如采用8中数据类型进行常规的数据处理时非常的方便。但是在某些场景下,采用基本数据类型却带来了一定的约束,它们只是纯粹的数据,除了数值本身的信息之外,基本类型数据不带有其他信息或者可操作方法。而这在实际使用中存在很多不足。例如:当某个方法的形参只接受医用数据类型,但方法调用者只能提供基本数据类型的实参时,基本数据类型就显得无能为力了。

为每个基本数据类型引入对应的包装类,不仅弥补了基本数据类型在面向对象上的不足,而且还可与其对应的基本数据类型之间进行相到转换,这一功能称之为“装箱”“拆箱”操作。

“装箱”:把基本数据类型转换为其包装类。

“拆箱”:把包装类转换为基本数据类型。

在包装类与基本数据类型的使用,注意:

类型特点:包装类是引用类型,引用方法和属性;基本数据类型只包含数值信息。

存储方式:包装类型对象实例化,借由new在堆空间里进行空间分配,对应栈空间中存储地址引用;基本数据类型变量对应栈空间中存储的是具体数据值。通常,包装类的效率会比基本数据类型效率低,空间占用大。

public static void main(String[] args) {
    int one = 12;
    Integer two = new Integer(20);
}

初始化:基本数据类型有各自默认初始值,包装类的对象未初始化时,初始值均为null

转换:装箱拆箱

概念:

装箱:把基本数据类型转换成包装类的过程。
拆箱:把包装类转换成基本数据类型的过程。
分类:
从实现的角度而言,可以分为“手动拆装箱”与“自动拆装箱”的操作。

手动装箱:可以结合类型的构造方法或者valueOf()方法实现
手动拆箱:可以通过xxxValue()方法实现。
自动装箱:把一个基本类型变量直接赋给对应的包装类型变量。
自动拆箱:允许把包装类对象直接赋给对应的基本数据类型变量。

public static void main(String[] args) {
//		装箱:把基本数据类型转换成包装类
//		1、自动装箱
		int t1 = 2;
		Integer t2 = t1;
//		2、手动装箱
		Integer t3 = new Integer(t1);
		//测试
		System.out.println("int类型变量t1="+t1);
		System.out.println("Integer类型对象t2="+t2);
		System.out.println("Integer类型对象t3="+t3);
		System.out.println("*************************");
		
		//拆箱:把包装类转换成基本数据类型
		//1、自动拆箱
		int t4=t2;
		//2、手动拆箱
		int t5=t2.intValue();
		//测试
		System.out.println("Integer类型对象t2="+t2);
		System.out.println("自动拆箱后,int类型变量t4="+t4);
		System.out.println("手动拆箱后,int类型变量t5="+t5);
		double t6=t2.doubleValue();
		System.out.println("手动拆箱后,double类型变量t6="+t6);
	}

基本数据类型和字符串之间的转换

public static void main(String[] args) {
		/*
		 * 基本数据类型转换为字符串
		 * 包装类的 toString()方法
		 * 或者 t+""
		 * 
		 */
		int t1=2;
		String t2=Integer.toString(t1);
		//测试
		System.out.println("int类型转换为String类型对象t2="+t2);
		System.out.println("********************************");
		
		//字符串转换为基本数据类型
		//1、包装类的parse
		int t3=Integer.parseInt(t2);
		
		//2、包装类的valueOf 先将字符串转换为包装类,再通过自动拆箱完成基本类型转换
		int t4=Integer.valueOf(t2);
		//测试
		System.out.println("String类型转换为int类型变量t3="+t3);
		System.out.println("String类型转换为int类型变量t4="+t4);

	}

包装类的比较

包装类的应用中,经常会遇到需要比较的场景。

1、拆箱后的数据是基础数据类型。用==判断相等性,比较的都是数值,如果是字符,比较的是ASCII值 。

public static void main(String[] args) {
    int a = new Integer(65);//拆箱
    int b = 65;

    char c = new Character('A');//拆箱
    System.out.println(a == b);//true
    System.out.println(a == c);//true
}

2、装箱后如果用==比较对象的内存地址,除Double、Float外,如数据值在缓存区范围内(-128 ~127),则相同;反之重新生成对象,为不同。

public static void main(String[] args) {
    Integer a = 12;
    Integer b = 12;
    System.out.println(a == b);//true

    Character c = 'A';
    Character d = 65;//'A'的ASCII值
    System.out.println(c == d);//true


    Integer a1 = 212;
    Integer b1 = 212;
    System.out.println(a1 == b1);//false

    Character c1 = 200;
    Character d1 = 200;
    System.out.println(c1 == d1);//false

    Double f1 = 12.0;
    Double f2 = 12.0;
    System.out.println(f1 == f2);//false
}

3、调用equals方法时,当类型相同,且数值相同时,返回ture;反之,返回false。当比对方为基本数据类型时,会先进行自动装箱操作,后进行比较。

public static void main(String[] args) {
    Integer a = 12;
    int b = 12;
    System.out.println(a.equals(b));//true

    Character c = 12;
    System.out.println(a.equals(c));//false
}

关于包装类的常见问题

1、有基本数据类型多方便呀,为什么还要弄个包装类?既然需要包装类,为什么还要装箱和拆箱?自动拆装箱这么方便,手动拆装箱还有存在的意义吗?

基本数据类型空间占用少,性能高给开发带来了一定的便利,但同时也因为只能存储纯粹的数据,而无法以对象的形态操作属性和方法,在很多实际应用时带来一定约束。所以,两者是需要并存的,也是需要能支持相互转换的,而这也是装箱和拆箱存在的目的。至于自动拆装箱,其实底层封装的还是手动拆装箱的操作,所以还是有存在价值的。

2、装、拆箱操作对比强制类型转换有什么不同呢?

装箱&拆箱多用于同类型基本数据类型和其对应包装类之间;强制转换多用于可兼容类型之间。

强制类型转换时不产生新的对象的,只有类型兼容性检查和安全性检查等性能消耗。

3、哪几种包装类支持缓存操作?

Java在集中包装类中提供了缓存设计,会对一定范围内的数据作为缓存,如果数据在范围内,会优先从缓存中取数据,超出范围才会创建新对象。其中:l Byte、Short、Integer、Long:缓存【-128,127】区间的数据l Character:缓存【0,127】区间的数据l Boolean:缓存true、false注意Double、Float并不支持。

4、方法重载时,如重载方法的参数分别为基本数据类型与包装类,会如何执行调用?

当方法以基本数据类型和其对应包装类作为方法重载的参数条件时,原则是:各回各家,各找各妈。

public static void main(String[] args) {
    testAge(new Integer(1));//我是包装类做参数的方法
}
public static void testAge(Integer i){
    System.out.println("我是包装类做参数的方法");
}

public static void testAge(int i){
    System.out.println("我是基本数据类型做参数的方法");
}

5、Integer可以与int直接运算吗?

当包装类正常实例化后,可以与基本数据类型进行运算操作。

/**
 * Integ
er对象one经过自动装箱完成赋值后,与two进行加法运算时又进行了自动拆箱,运行结果为32
 * @param args
 */
public static void main(String[] args) {
    Integer one = 12;
    int two = 20;
    System.out.println(one+two);//32
}
/**
 *由于在方法内,对象未初始化,则不能直接进行运算,提示变量尚未初始化
 */
public static void main(String[] args) {
    Integer one;
    int two = 20;
    System.out.println(one+two);//java: 可能尚未初始化变量one
}
posted @   吃星星的大黄鸭  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示