【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池

文章目录

    • 包装类与基本数据类型
    • 包装类常用方法
    • 基本数据类型与包装类之间的转换
    • 基本数据类型和字符串之间的转换
    • 包装类相关知识
      • 包装类的初始值
      • 包装类对象间的比较
      • 对象常量池
    • 总结

包装类与基本数据类型

Java的数据类型:
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第1张图片
其中,基本数据类型是没有属性、方法的,也无法对象化交互。
包装类的产生就是为了解决这样的问题。
通过包装类,可以使基本数据类型拥有属性、方法,可以对象化交互。

包装类与基本数据类型
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第2张图片

包装类常用方法

https://docs.oracle.com/javase/8/docs/api/
我们以Integer为例,查看文档,了解其常用的属性和方法:
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第3张图片

我们可以看到,Java中包装类都用final修饰,都是不允许继承,也没有子类的。
且,Integer是继承自Number类的——实际上,所有数值型都是继承自Number类的。
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第4张图片
而char的包装类Character,boolean的包装类Boolean,都是继承自Object的。
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第5张图片

【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第6张图片
在这里可以看到Integer的相关方法:
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第7张图片

基本数据类型与包装类之间的转换

装箱:把基本数据类型的值转换为相应包装类的对象。
拆箱:把包装类的对象转换为对应基本数据类型的值。

装箱代码:装箱分为自动装箱和手动装箱。

public class WrapTest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 装箱:把基本数据类型转换为包装类
		// 1、自动装箱
		int t1 = 2;
		Integer t2 = t1;

		// 2、手动装箱
		Integer t3 = new Integer(t1);

		// 测试
		System.out.println(t1);
		System.out.println(t2);
		System.out.println(t3);
	}

}

输出:

2
2
2

拆箱代码:有自动拆箱和手动拆箱两种。

public class WrapTest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 装箱:把基本数据类型转换为包装类
		// 1、自动装箱
		int t1 = 2;
		Integer t2 = t1;

		// 2、手动装箱
		Integer t3 = new Integer(t1);

		// 拆箱:把包装类转换为基本数据类型
		// 1、自动拆箱
		int t4 = t2;

		// 2、手动拆箱
		int t5 = t2.intValue();
		// 测试
		System.out.println(t4);
		System.out.println(t5);
	}

}

输出:

2
2

也可以这样转换:

double t = t2.doubleValue();
System.out.println(t);

输出:2.0

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

基本数据类型转换为字符串

public static void main(String[] args) {
		// 基本数据类型转换为字符串
		int t1 = 2;
		String t2 = Integer.toString(t1);
		System.out.println(t2);
	}

输出:2

字符串转换为基本数据类型

方法1:包装类的parse方法

public static void main(String[] args) {
		// 基本数据类型转换为字符串
		int t1 = 2;
		String t2 = Integer.toString(t1);

		int t3 = Integer.parseInt(t2);
		System.out.println(t3);
	}

输出:2

方法2:包装类的valueOf方法。

public static void main(String[] args) {
		// 基本数据类型转换为字符串
		int t1 = 2;
		String t2 = Integer.toString(t1);

		int t3 = Integer.valueOf(t2);
		System.out.println(t3);
	}

输出:2

包装类相关知识

包装类的初始值

基本数据类型的初始值
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第8张图片
包装类的初始值
null

包装类对象间的比较

思考:
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第9张图片
答案:

false
true
true
true
false

为什么one==twofalse
因为one和two指向的是两个不同的空间,只是他们的值都是100而已。因此,他们不相等。

public static void main(String[] args) {
		Integer one=new Integer(100);
		Integer two=new Integer(100);
		System.out.println(one);
		System.out.println(two);
	}

输出:false

为什么three==100true:它其实完成了自动拆箱的操作,所以是true。

Integer three=100;
System.out.println(three==100);

输出:false

为什么three==fourtrue

Integer three = 100;
Integer four = 100;
System.out.println(three == four);

输出:true

原因:Integer four=100其实执行的是Integer four=Integer.valueOf(100);
为了提高运行效率,Java有一个常量数组的缓存区(对象池),当 -128<=数值<=127 时,Java会直接在对象池里找这样一个常数,如果有这样的常数,对象会直接指向这块内存;如果没有,再实例化Integer。
因此,上面的代码中three和four指向的是同一块空间

显然,我们有:

Integer three = 128;
Integer four = 128;
System.out.println(three == four);

false

对象常量池

除了floatdouble,其他的都可以用对象常量池。

也就是说:

Double d1 = Double.valueOf(100);
Double d2 = Double.valueOf(100);
System.out.println(d1 == d2);

输出false

总结

在Java中,我们可以通过包装类解决基本数据类型的不具有对象化的能力的问题。
每一种基本数据类型都有它对应的包装类:
【从零开始的Java开发】1-5-2 包装类与基本数据类型、常用API、基本数据类型与包装类、字符串之间的转换、包装类的初始值与比较、对象常量池_第10张图片
Java中所有的包装类都是存在Java.lang中的。
我们可以通过装箱和拆箱的操作来实现包装类和基本数据类型的转换。
我们也可以用包装类来完成基本数据类型和字符串之间的转换。

你可能感兴趣的:(从零开始的Java开发,java,jvm,开发语言)