java基本数据类型
四大类、八小类
- 整数类型(四种)
- 字节型/位(byte)
- 短整型(short)
- 整型(int)
- 长整型(long)
- 浮点类型(两种)
- 单精度浮点型(float)
- 双精度浮点型(double)
- 字符类型(char)
- 布尔类型(boolean)
注意,字符串不属于“基本数据类型”,属于引用类型,深层的储存方式见文末
各基本类型的储存大小
数据类型 | 字节 | 表示范围/取值范围(以下表示除boolean、char,其余为十进制) |
---|---|---|
字节型/位(byte) | 1 | -128~127(-2的7次方到2的7次方-1) |
短整型(short) | 2 | -32768~32767(-2的15次方到2的15次方-1) |
整型(int) | 4 | -2147483648~2147483647(-2的31次方到2的31次方-1) |
长整型(long) | 8 | -9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1) |
单精度浮点型(float) | 4 | 3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方) |
双精度浮点型(double) | 8 | 1.797693e+308~ 4.9000000e-324 |
字符类型(char) | 1 | \u0000~\uFFFF(unicode编码) |
布尔类型(boolean) | 1 | true和false(真和非真) |
ps:Markdown表格插入方法参考,插入Markdown行内超链接方法参考,数据类型取值范围参考
需要注意的tips
- char(这部分参考java基本数据类型取值范围)
用于存放字符的数据类型,占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容
字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加' ',比如 '1'表示字符'1'而不是数值1,
char c = ' 1 ';
我们试着输出c看看,System.out.println(c);结果就是1,而如果我们这样输出呢System.out.println(c+0);
结果却变成了49。
如果我们这样定义c看看
char c = ' \u0031 ';输出的结果仍然是1,这是因为字符'1'对应着unicode编码就是\u0031
char c1 = 'h',c2 = 'e',c3='l',c4='l',c5 = 'o';
System.out.print(c1);System.out.print(c2);System.out.print(c3);System.out.print(c4);Sytem.out.print(c5); - 浮点型和整型
10.0 严格来讲属于浮点型字面值(区别于 10 属于整型)
稍作延伸,浮点型的概念(来自度娘):
由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。简单来说,为啥叫浮点,浮动变化的是阶码(心里有点方,这个点是看《汇编语言》的时候记住的,没有实料参考,此处是记忆),可以理解成,整型因为阶码(或者指数的幂)不变,而浮点类型的幂是变化的,所以浮点的数值范围更大。 - char 的单独点
因为一个汉字占两个字节,一个Unicode编码占两个字节,所以Java中的char类型可以储存汉字。
各基本数据类型在JVM中的存储方式(TODO 后面复习JVM时再与之结合学习)
附一张JVM的分区图,下图主要突出常量池概念,想说明的一点是,与图中的“运行时常量池”不一样,String类型的字符串储存在“字符串常量池”中,而JDK1.7及之后的版本中,字符串常量池存在于堆中
再看一张图,我们发现,基本数据类型储存在栈中:
结论:字符串类型储存在堆中的字符串常量池中(new String("1")这种参考引用类型储存,来源参考,基本数据类型储存在栈中
注:JDK1.6(含)之前常量池是放在JVM中的方法区中的,许多人也叫它“永久代”-java jdk1.7常量池移到哪去了?