因为学校课堂正在学Java,距离自己刚接触Java也过去一年了,所以也正好作为复习,写了这个笔记(实时更新)
java基础笔记整理
Java中的包装类和原生类型
一、基本类型和包装类的介绍
8个基本类型(也称原生类型):byte, short, int, long, float, double, char, boolean
对应的8个包装类:Byte, Short, Integer, Long, Float, Double, Character, Boolean
二、自动转换与强制转换
1、自动转换原则(由低精度到高精度):byte,short,char (同级)-> int -> long -> float -> double
byte b = 1;
char c = 1;
short s = 1;
int i = 1;
c = b; // Error,同级
c = s; // Error,同级
s = c; // Error,同级
i = c; // OK
int i = 1;
long t = 1;
float f = 1;
double d = 1;
f = i; // Ok
f = t; // Ok
d = f; // Ok
2、强制转换
强制转换的格式是在需要转型的数据前加上 “( )”, 然后在括号内加入需要转化的数据类型
byte b = 3;
int i = 3;
long t = 3;
float f = 3;
char c = 3;
short s = 3;
i = (int) f; // OK,由高精度向低精度转换
t = (long) f; // OK,由高精度向低精度转换
b = (byte) i; // OK,由高精度向低精度转换
i = b; // OK,由低精度向高精度转换,自动转型
System.out.println(c==s); // OK,true,c 和 s 自动转型为int,然后比较
b = (byte) s; // OK,一种类型到另一种类型转换
c = (char) b; // OK,一种类型到另一种类型转换
c = (char) s; // OK,一种类型到另一种类型转换
三、自动装箱与拆箱
1、将基本类型转换为包装类
方法一:可以通过对应的包装类的构造函数完成
方法二:包装类中提供的静态函数
package august;
public class IntegerTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义一个double类型的数据
double d=123.12;
//1.通过构造函数把基本数据类型转换为对应的包装类型
Double d1 = new Double(d);
System.out.println(d1); //123.12
//2.使用包装类中的静态方法来完成
Double d2 = Double.valueOf(d);
System.out.println(d2); //123.12
}
}
2、将包装类型转换为基本类型
只能使用包装类中提供的函数:xxxValue,(xxx代表要转换的类型)
3、自动装箱:就是自动将基本类型转换为包装类型。拆箱:就是自动将包装类型转换为基本类型。
在Java SE5之前,如果要装箱,必要要先创建一个包装类对象,而在Java SE5之后,不需要这样做。可以直接这样:
Integer i = 10; //装箱
int n = i; //拆箱
原理:在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。对于其他的包装器类,比如Double、Character,也同样适用。
*但是要注意:如果整型字面值在[-128,127]之间,便不创建对象直接返回,其余的都会在valueOf()方法中重新创建对象。看代码
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); // true因为100在[-128,127]之间,所以没有重新创建对象,返回值为true
System.out.println(i3==i4); // false因为200不在此区间,所以两者均重新创建了新的对象,所以返回值为false
}
}
public class Main {
public static void main(String[] args) {
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2); // false
System.out.println(i3==i4); // false
//四者均为double类型的值,直接都创建新的对象
}
}
总结:
1、Integer、Short、Byte、Character、Long 这几个类的valueOf方法的实现是类似的,有限可列举,共享[-128,127];
2、Double、Float的valueOf方法的实现是类似的,无限不可列举,不共享;
3、Boolean的valueOf方法的实现不同于以上的整型和浮点型,只有两个值,有限可列举,共享;
另外,Integer i = new Integer(xxx); 不会触发自动装箱。而Integer i = xxx; 会触发自动装箱;第二种方式的执行效率和资源占用在一般性情况下([-128,127])要优于第一种情况(注意这并不是绝对的)。
详细参考:https://blog.csdn.net/justloveyou_/article/details/52651211和https://www.jianshu.com/p/f00b3e5d3142