前言
变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型的数据。
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
一 java两大数据类型
- 基本数据类型(又叫内置类型或值类型)
- 引用类型,默认值是null(空值)
1 基本数据类型
整数类型 | 浮点型 | 字符型 | 布尔型 |
byte | boolean | ||
short | char | ||
int | float | ||
long | double |
1.1 byte
- 一个byte类型在内存中占用8位二进制,即 1byte = 8bit;
- 有正负号
- 最小值 -128(-27)
- 最大值 127(27-1)
- 默认值 0
- 应用:byte类型用在大型数组中节约空间,主要代替int类型,因为byte类型的变量占用的内存空间只有int类型的四分之一
- 示例: byte no = 12;
bit、byte与字节(Byte)的关系
bit比特,表示一位二进制位
byte是java语言的基本数据类型 1byte = 8bit
Byte字节,是计算存储空间大小的单位,简称B;1字节 = 8bit,其他还有千字节KB,兆字节MB,千兆字节GB
1.2 short
- 内存占用16位
- 有正负号
- 最小值 -32768(-215)
- 最大值 32767(215 - 1)
- 默认值 0
- 应用:Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一
- 示例: short no = 12;
1.3 int
- 内存占用32位
- 有正负号
- 最小值 -2,147,483,648(-2^31)
- 最大值 2,147,483,647(2^31 - 1)
- 默认值 0
- 应用:一般地整型变量默认为 int 类型
- 示例: int no = 12;
1.4 long
- 内存占用64位
- 有正负号
- 最小值 -9,223,372,036,854,775,808(-2^63)
- 最大值 9,223,372,036,854,775,807(2^63 -1)
- 默认值 0L
- 应用:这种类型主要使用在需要比较大整数的系统上
- 示例: long no = 12000000L;"L"理论上不分大小写,但是若写成小写"l"容易与数字"1"混淆,不容易分辩,所以最好大写
1.5 float
- float数据类型是单精度,32位,符合IEEE754标准的浮点数;
- 最小值 1.17549435E-38f = 1. 17549435*(10^-38)
- 最大值 3.4028235e+38f
- 默认值 0.0f
- 示例:float no = 12.123f;
1.6 double
- double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数
- 最小值 2.2250738585072014E-308
- 最大值 1.7976931348623157e+308
- 默认值 0.0d
- 示例:double no = 12.123d; double no2 = 12.1234;
解释:单精度和双精度的概念和区别
单精度和双精度精确的范围不一样,单精度,也即float,一般在计算机中存储占用4字节,也就是32位,有效位数为7位;双精度(double)在计算机中存储占用8字节,64位,有效位数为16位。
单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。
双精度型,正如它的关键字“double ”表示的,占用64位的存储空间。在一些现代的被优化用来进行高速数学计算的处理器上双精度型实际上比单精度的快。所有超出人类经验的数学函数,如sin( ),cos( ) ,和sqrt( )均返回双精度的值。当你需要保持多次反复迭代的计算的精确性时,或在操作值很大的数字时,双精度型是最好的选择。
1.7 char
- char类型是一个单一的 16 位 Unicode 字符
- 最小值 '\u0000'(即为0)
- 最大值 '\uFFFF'(即为65535)
- 作用:char数据类型可以储存任何字符
- 示例:char no = 'a'; 给char类型赋值,必须要用单引号’’
1.8 boolean
- boolean数据类型表示1位的信息
- 只有两个取值:true 和 false;
- 默认值是 false;
- 例子:boolean tar = true;
1.9 自动类型转换
根据精度的由低到高排序为:
byte -> short,char -> int -> long -> float ->double
根据上面顺序,低精度数据类型的变量,可以自动地转为高精度类型的变量,如:
byte a = 12;
int b = a;
数据类型转换规则:
- 不能对boolean类型进行类型转换;
- 把高精度类型转换为低精度类型时,必须使用强制类型转换,转换过程中会导致溢出或损失精度;
- 浮点数到整数的转换,舍弃小数部分,而不是四舍五入;
2.0 强制类型转换
强制类型转换只发生在高精度类型转为低精度类型的情况下,必须显式的在变量前声明要转换的数据类型,且会损失数据精度,如:
float a = 12.23f;
int b = (int) a;
System.out.println(b);//控制台打印12
2 引用类型
引用类型包括三部分:对象名,对象的引用,对象
示例:User user = new User();
栈中保存的是:user = 对象的引用,即对象名和对象的内存地址
堆中保存的是:new User();,即对象本身
注意:所有引用类型的默认值都是null。
3 数据类型在内存中的空间分配
基本数据类型只有一块存储空间(分配在栈stack中);
引用类型有两块存储空间(一块在栈stack中,一块在堆heap中);
对于引用类型的对象,对象名和对象的引用放在栈stak中,对象放在堆heap中;引用 就是指向对象在堆heap中的地址
java的内存模型中保存数据的有两部分: 堆(heap) 和 栈(stack) 。
1.基本类型的变量放在栈里;
2.引用类型中,对象本身放在堆里,对象的引用放在栈里
二 常见笔试题
1 byte a = 1; byte b = a + 1;
解析: 错误,因为1的默认数据类型int,而int类型的精度比byte高,高精度类型不能向低精度类型转换,所以错误。
2 short a = 1; a += 1;
解析:正确,+= 左右两边类型不同是会自动强制转换,+号不会进行强制类型转换;