类型介绍
java基本类型:
java中基本数据类型有8种,可分为三类,布尔类型 boolean,字符类型char,数值类型。数值类型又分为整数类型byte、short、int、long,浮点类型float、double。
| 名称 | 类型 | 字节 | 范围 | 表现方式 | 包装类 |
|---|---|---|---|---|---|
| byte | 最小类型 | 1 | -128~127 | byte a=0; | Byte |
| short | 短整型 | 2 | -32768~32717 | short a=0; | Short |
| int | 整型 | 4 | -32768~32717 | int a=0; | Integer |
| long | 长整型 | 8 | -263~263-1 | long a=0L; | Long |
| double | 双精度浮点型 | 8 | * | double a=0.00; | Double |
| float | 浮点型 | 4 | 6~7 | float a=0.0f;或float a=0.0F; | Float |
| char | 字符型 | 2(1字符为2字节) | 0~65535 | char a='a'; | Character |
| boolean | 布尔类型 | 1 | - | boolean a=false; | Boolean |
注意:8位(bit)为1字节
引用类型:
java中引用类型:一切对象(class、interfac、array)皆为引用类型。
内存分配
基本含义:
1.基本数据类型直接存储在栈内,数据本身的值也存在栈空间内,而8种数据类型就是它们的存储模型。
2.引用类型是按照存储对象的内存模型来进行数据存储的,其中"引用"存储在有序的内存栈上,对象本身的值存储在内存堆上。
3.从中我们可以看出基本类型和引用类型的区别主要在于堆栈分配上。从下方代码示例来进行更为直观的感受。
代码示例:
String a=new String("abc");
String b=new String("abc");
System.out.println(a==b);
System.out.println(a.equals(b));
上述代码中打印的结果为false,true,因为我们知道在java中==如果是基本类型比较两者的数值,如果是引用类型比较的是两者的内存地址,而equals()则比较的是两者的数据,所以在上述代码中创建了两个String对象,用了两种方法进行比较得出基本类型和引用类型的堆栈区别。
自动拆箱、自动装箱
基本含义:
java在1.5之后引入了自动拆箱和自动装箱,基本类型自动转化成为包装类型称之为自动装箱,包装类自动转化为基本类型称之为自动装箱。
代码示例:
Integer a=3; // 自动装箱
int b=a; //自动装箱
缺点:
1.由于装箱会隐式的创建对象,在创建对象的同时会增加垃圾回收器(GC)的压力,影响程序的性能,所以尽量避免使用包装类进行循环运算。
2.拆箱过程中可能会产生空指针异常。
示例代码:
装箱错误的示范!
Integer sum=0;
for(int i=0;i<100;i++){
sum+=i;
}
装箱正确的示范!
int sum=0;
for(int i=0;i<100;i++){
sum+=i;
}
拆箱错误示范!
Object obj=null;
int i=(Integer)obj;
拆箱正确示范!
Object obj=1;
int i=(Integer)(obj==null?0:obj);
包装类和String类型转化的方法
简单介绍:
包装类型和String都有其对应的.valueOf()方法,并且Byte、Short、Integer、Long、Char这几个包装类的valueOf()方法都会做缓存,因为为他们的范围个数是有限的,但Float、Double这两个浮点数不是。或者进行强制类型转换(包装类之间不能进行强制类型转换)。
代码示例:
Short a = 1;
Integer b=Integer.valueOf(a); //通过方法进行类型转换
Integer b= (int)a;//进行强制转换。
// Integer.valueOf()的源码
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
}
基本类型自动转化
前提和原因:
1.两者类型彼此兼容。2.目的类型的空间范围一定大于转化的源类型。
正向转化: 由低字节向高字节自动转换
//byte->short->int->long->float->double
long a=1;
float b=a; //正确
int b=a; //错误
逆向转化:使用强制转化可能丢失精度:
int a = (int)(3.14);