目录
引言
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
Java 的两大数据类型:
- 基本数据类型(primitive type)
- 引用数据类型(reference type)
一、基本数据类型(内置数据类型)
1.Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
2. 基本数据类型是CPU可以直接进行运算的类型。
3.个人选择数据类型原则
- 如果要表示整数就使用int,表示小数就使用double;
- 如果要描述日期时间数字或者表示文件(或内存)大小用long;
- 如果要实现内容传递或者编码转换使用byte;
- 如果要实现逻辑的控制,可以使用boolean;
- 如果要使用中文,使用char避免中文乱码;
- 如果按照保存范围:byte < int < long < double;
二、引用数据类型
1. 类似于C语言中的指针,引用类型的变量又叫引用变量,它内部存储的是一个地址,该地址指向某个对象在内存中的位置。
2.类(class), 接口(interface),数组(array),(枚举类型、注解类型、字符串(String)类型)
简单来说,只要不是基本数据类型.都是引用数据类型
3. 默认值:null
三、两者区别
一、从概念方面来说
1.基本数据类型:变量名指向具体的数值;
2.引用数据类型:变量名不是指向具体的数值,而是指向存数据的内存地址,也即是hash值。
二、从内存的构建方面来说(内存中,有堆内存和栈内存两者)
1.基本数据类型:被创建时,在栈内存中会被划分出一定的内存,并将数值存储在该内存中;
2.引用数据类型:被创建时,首先会在栈内存中分配一块空间,然后在堆内存中也会分配一块具体的空间用来存储数据的具体信息,即hash值,然后由栈中引用指向堆中的对象地址。
举个例子
//基本数据类型作为方法参数被调用
public class Main{
public static void main(String[] args){
//基本数据类型
int i = 1;
int j = 1;
double d = 1.2;
//引用数据类型
String str = "Hello";
String str1= "Hello";
}
}
由上图可知,基本数据类型中会存在两个相同的1,而引用型类型就不会存在相同的数据。
假如"hello"的引用地址是xxxxx1,声明str变量并其赋值"hello"实际上就是让str变量引用了"hello"的内存地址,这个内存地址就存储在堆内存中,是不会改变的,当再次声明变量str1也是赋值为"hello"时,此时就会在堆内存中查询是否有"hello"这个地址,如果堆内存中已经存在这个地址了,就不会再次创建了,而是让str1变量也指向xxxxx1这个地址,如果没有的话,就会重新创建一个地址给str1变量。
三、从使用方面来说
1.基本数据类型:判断数据是否相等,用==和!=判断;
2.引用数据类型:判断数据是否相等,用equals()方法,==和!=是比较数值的.而equals()方法是比较内存地址的。
四、两者之间的转化
1,String到基本数据类型的转化,使用parseXXX();
例如:String到int
String s="12";
int s1 = Integer.parseInt(s);
2,基本数据类型到String的转化,使用相对应类封装好的方法;
例如:int到String
int a = 21;
String b = String.valueOf(a);
五、自动类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高 byte,short,char—> int —> long—> float —> double
数据类型转换必须满足如下规则:
1. 不能对boolean类型进行类型转换。
2. 不能把对象类型转换成不相关类的对象。
3. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
4. 转换过程中可能导致溢出或损失精度,例如:
int i =128; byte b = (byte)i;
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
5. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23; (int)-45.89f == -45
六、强制类型转换
1. 条件是转换的数据类型必须是兼容的。
2. 格式:(type)value type是要强制类型转换后的数据类型 实例:
实例
public class QiangZhiZhuanHuan{
public static void main(String[] args){
int i1 = 123;
byte b = (byte)i1;//强制类型转换为byte
System.out.println("int强制类型转换为byte后的值等于"+b);
}
}
相关链接