八大基本数据类型以及对应包装类
八大基本数据类型
- byte/8
- char/16
- short/16
- int/32
- float/32
- long/64
- double/64
- boolean/~
注:具体大小没有明确规定,JVM 会在编译时期将 boolean 类型的数据转换为 int,使用1来表示 true,0 表示false。
JVM ⽀持 boolean 数组,但是是通过读写 byte 数组来实现的。
包装类
java中为8种基本数据类型对应准备了8种包装类型
8种包装类属于引用数据类型。
1. 为什么要再提供8种包装类?
- 因为8种基本类型不够用。我们有时需要把基本类型作为Object使用。
基本数据类型 包装类型 byte java.lang.Byte(父类Number) short java.lang.Short(父类Number) int java.lang.Integer(父类Number) long java.lang.Long(父类Number) float java.lang.Float(父类Number) double java.lang.Double(父类Number) boolean java.lang.Boolean(父类Object) char java.lang.Character(父类Object) java专门针对8个基本数据类型,写的8个对应的包装类,对应关系分别是:
- int ---> Integer;
- char --> Character;
剩下的6个都是首字母大写;
有什么作用:
这些类中提供了一些方法,可以帮我们完成字符串和基本数据类型的相互转换,且包装类中也帮我们记录了这个类型的最大值和最小值;
2. Number类
8种包装类中其中6个都是数字对应的包装类,他们的父类为Number,研究一下Number中公共的方法。
- Number是一个抽象类,无法实例化对象。
- Number类中有以下方法用于拆箱。
// 基本数据类型向引用数据类型转换(装箱) Integer i = new Integer(123); // 将引用数据类型转换成基本数据类型(拆箱) float f = i.floatValue();
自动装箱和自动拆箱:
将包装类型的数据转基本数据类型的过程叫做拆箱,这个过程在jdk5之后就可以自动完成了,因此叫做自动拆箱;
将基本数据类型转成包装类型的数据的过程叫做装箱,这个过程在jdk5之后就可以自动完成了,因此叫做自动装箱;字符串和基本数据类型的相互转换(重要):
通用套路,都是用包装类的静态方法,parseXxx
没有parseChar,如果要转字符,只能利用字符串的 charAt(索引)这个方法,
根据索引,获取某个位置的字符;
/* 练习包装类 */ public class MyInt { public static void main(String[] args) { // 自动装箱 Integer a = 11; // 自动拆箱,再装箱 a+=3; System.out.println(a); 自动拆箱 int b = a; System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); // 与字符串的相互转换 // 将b转成字符串类型 String s = b+"";// 字符串14 System.out.println(s + 1);// 141 // 把s转成int类型, 通用套路,都是用包装类的静态方法,parseXxx 没有parseChar,如果要转字符,只能利用字符串的 charAt(索引)这个方法,根据索引,获取某个位置的字符 int i = Integer.parseInt(s);// 整数14 System.out.println(i + 1);// 15 String s2 = "6.6"; System.out.println(Double.parseDouble(s2) + 1.1); } }
java自动装箱的好处:
一、前言
Java自动装箱和自动拆箱是JDK5.0版本提供的新特性,所以在JDK5.0后的版本中都可以使用,之前的版本则不支持该特性。
理解自动装箱和自动拆箱需要先对java中的8种原始数据类型和相对应的封装类有所了解。
二、8种原始数据类型及其对应的封装类
byte --->Byteshort --->Shortint --->Integerlong --->Longfloat --->Floatdouble --->Doublechar --->Characterboolean ---> Boolean
注:原始数据类型的封装类都在java.lang包下,可以直接使用三、什么是自动装箱
自动装箱指的是:可以将一个原始数据类型直接赋值给相应的封装类,其类型转换工作由java编译器自动处理
Integer i = 100; Integer j= 100; System.out.println(i==j);//true System.out.println(i.equals(j));//true Integer m= 200; Integer n= 200; System.out.println(m==n);//false System.out.println(m.equals(n));//true int k = 100; System.out.println(k==j);//true System.out.println(j.equals(k));//true 输出结果是: true true false true true true
理解这道题的关键点有2个:
1. "=="比较运算符是引用地址比较,equals()方法是内容比较(注:可通过重写equals()方法自定义比较规则)
2. 原始数据类型在自动装箱成封装类对象时,如果原始数据类型的值为-128~127(相当于byte值范围),java编译器会判断曾经是否有作过相同的转换,如果有,则把以前装载好的封装类对象的引用地址直接赋给当前对象,所以Integer i = 100,Integer j = 100中,i 跟 j 共享一个Integer对象
Integer i = 100; Integer j= new Integer(100); Integer k= Integer.valueOf(100); System.out.println(i==j);//false System.out.println(j== k);//false 输出结果是: false false
- 原因:new Integer(100) 与 Integer.valueOf(1)都是重新new出一个对象,所以i,j,k是三个不同的对象
Integer i = 100; long j = 100; Long k= 100; System.out.println(i==j); System.out.println(j== k); 代码有误,Long k = 100需要改成Long k = (long) k;
3. Integer
- 以上8种包装类,重点以java.lang.Integer为代表进行学习
// 构造函数 Integer i = new Integer(100); Integer j = new Integer("123"); // 访问包装类的常量,来获取最大值和最小值 Integer.MAX_VALUE 2147483647 Integer.MIN_VALUE // 在JDK1.5之后支持自动装箱和自动拆箱 // 自动装箱: int自动转换为Integer Integer x = 100; // 自动朝拆箱: Integer自动转换为int int y = x; x+1 //不会报错,x自动拆箱为int,因为+运算符右边是基本数据类型,+要求两边都是基本数据类型 x == y // true 这里不会自动拆箱为int,因为==运算符不需要两边运算数为int类型 // 常用的两个方法 // 1.intValue() 手动拆箱 Integer i = 123; int retValue = i.intValue(); // 2. static int parseInt(String s) 字符串转数字 静态方法 int retValue = Integer.parseInt("123"); // 如果字符串不是数字,会抛出 NumberFormatException的异常
4. 缓存池
java中为了提高程序的执行效率,将-128~127之间包装对象提前创建好,放到了一个方法区的“整数型常量池”中,目的是只要用这个区间的数据不需要再new,直接从整数型常量池取出来。用static final修饰的对象,会存放在方法区常量池中。
5. Integer int String 互转