Java包装类详解




1、Java数据类型:

  Java中有两大数据类型:基本数据类型和引用数据类型。
在这里插入图片描述java

2、Java包装类

1.Java包装类是什么

  8大基本数据类型都有包装类。包装类是一个类,有方法属性构造器
  包装类Integer就像String和Math同样是一个类,有方法属性构造器web

2.基本数据类型对应的包装类(图表)

3.包装类如何在文档查看

  包装类是一个JDK自带的类,因此能够在JDK API离线文档中查看到。下面是JDK API下载连接和JDK API Documentation 教程使用详解。
  推荐学会JDK API的查看。svg

  JDK API下载连接:传送门
  JDK API Documentation 教程使用详解连接:JDK API Documentation 教程使用详解大数据

4.包装类的做用

编码过程当中只接收对象的状况,好比ArrayList中泛型只能存入对象,不能存入基本数据类型。泛型的参数只能是对象,不能是原始数据类型;(请粘贴如下代码到编译器中,感觉一下编译报错)编码

import java.util.ArrayList;
// 并不推荐使用中文作类名,我这里只是为了演示方面
public class 包装类 {
	public static void main(String[] args) {
		// 下面才是正确的
		ArrayList<Integer> list2 = new ArrayList<>();
		// 下面这句在编译期就会报错,由于泛型<>括号中不能是基本数据类型,若是要用须要是包装类
		ArrayList<int> list = new ArrayList<>();
	}
}

方便类型之间的转换,好比String和int之间的转换能够经过int的包装类Integer来实现,具体以下。spa

public static void main(String[] args) {
		// 这是一个字符串
		String numStr = "123"; 
		// 字符串转换成包装类
		Integer num01 = Integer.valueOf(numStr);
		// 包装类型向基本数据类型转换(拆箱)
		int num = num01;
		System.out.println(num);
	}

5.包装类的装箱拆箱(Integer举例)

  jdk1.5之后,装箱和拆箱都是自动完成(自动拆箱装箱),可是有的时候仍是须要咱们手动进行拆装箱。.net

  装箱:由基本数据类型向包装类型转换3d

// 装箱:将基本数据类型转换成引用类型
int i = 11;
Integer integer = new Integer(i); // 手动写代码装箱
System.out.println(integer);
// 自动装箱
Integer integer2 = 11;
System.out.println(integer2);

  拆箱:由包装类型向基本数据类型转换code

// 拆箱:由包装类型向基本数据类型转换
Integer integer3 = new Integer(33);
int i3 = integer3.intValue(); // 手动写代码拆箱
System.out.println(i3);
// 自动拆箱
int i4 = new Integer(44);
System.out.println(i4);

6.包装类注意点

1.包装类型的比较相等问题(Integer举例)

包装类之间不可用==来比较是否相等,须要比较字面值是否相等则须要使用Integer包装类的equals()方法!xml

public static void main(String[] args) {
	Integer num01 = new Integer(99); // 建立num01对象
	Integer num02 = new Integer(99); // 建立num02对象 
	// 下面输出false的缘由:包装Integer是在堆中建立了2个对象,而==比较的是内存地址,两个对象的内存地址并不同,因此false
	System.out.println(num01 == num02); // false
	// 下面输出true的缘由:和String类的equals()方法同样,比较的是字面值是否相等,因此返回true
	System.out.println(num01.equals(num02)); // ture
}
2.Integer自动装箱值范围问题

现象:Integer自动装箱时,当值在范围[-128, 127]之间时,使用==号比较内存地址将会返回true,而超过此范围时返回false。

public static void main(String[] args) {
	// Integer自动装箱底层调用的是valueof()方法。in2和in3的自动装箱同下面这句同样
	Integer in = Integer.valueOf(0);
	// [-128, 127]范围内,源码并未建立对象,因此返回true
	Integer in2 = 127;
	Integer in3 = 127;
	System.out.println(in2 == in3); // true
	Integer in4 = -128;
	Integer in5 = -128;
	System.out.println(in4 == in5); // true
	// 超过了范围[-128, 127]建立新的Integer对象,in6和in7是不一样对象,==比较时是不一样地址,因此返回false
	Integer in6 = 233;
	Integer in7 = 233;
	System.out.println(in6 == in7); // false
}

缘由:由于Integer自动装箱底层调用的是valueof()方法。而valueof()方法在区间[-128, 127]时并不会建立对象,而是在Integer的缓冲cache中拿。当超过了范围[-128, 127]时,则会建立新的Integer对象

valueOf()方法:
在这里插入图片描述

相关

【Java 经常使用类】大纲