Java数据存储
java语言中有八大数据结构,整形:int、short、long、byte,浮点型:float、double,字符型:char,布尔型:boolean。
引用数据类型:类、接口、数组。
在数据结构中,数组查找方便,但是删除比较不方便,相反,链表在内存中不连续,方便删除但是不方便查询。
各数据类型存储范围: | 字节长度 |
---|---|
short | 2字节长度 |
int | 4字节长度 |
long | 8字节长度 |
byte | 1字节长度 |
float | 4字节长度 |
double | 8字节长度 |
java是强类型语言,本质上就是Java在内存中开辟不同类型的内存空间。
在计算机中,只有加法没有减法,在做减法运算时可以认为是加上一个负数,这样可以减少计算机电路的复杂程度。但是使用原码运算会出现问题,与实际结果不符,这时需要用补码进行运算,(正数的原码=反码=补码,负数的反码=原码的符号位不变,其他位按位取反,补码=反码+1)。反码是为了解决减法运算,补码是为了解决反码产生的+0、-0的问题。
浮点类型的精度丢失问题
1.浮点类型在计算机中的存储
float存储需求是4字节(32位),其中1位最高位是符号位,中间8位是阶位,后32位表示数值大小。
double存储需求是8自己(64位),其中1位最高位是符号位,中间11位表示阶位,后52位表示数值大小。
double表示这种类型的数值精度是float类型的两倍,绝大部分应用都采用double类型。
2.浮点类型的精度丢失
由float类型能直接转换位double类型,但是由double类型转换为float类型时会导致精度丢失,精度丢失就是位数不够表示整个数值。
public class SimpleTest {
public static void main(String[] args) {
System.out.println(1.2 - 1);
}
}
输出:0.19999999999999996
这和我们预期的情况完全不符
接下来将10进制的0.2转化为2进制进行存储
算法是乘以2直到没有了小数为止
0.2 * 2 = 0.4 取整数部分 0
0.4 * 2 = 0.8 取整数部分 0
0.8 * 2 = 1.6 取整数部分 1
0.6 * 2 = 1.2 取整数部分 1
0.2 * 2 = 0.4 取整数部分 0
.......
0.2的2进制从上到下可以表示为 00110011…
注意:上面的计算过程循环了,也就是说2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的 。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。*
数值类型自动转换图