Java基本数据类型

本文简单聊一聊Java中基本数据类型的相关知识,主要包括:

  1. Java中基本数据类型的基础知识,包括种类、占用字节数、范围等
  2. 基本类型对应的包装类型
  3. 不同数据类型之间的转换

基本数据类型

下表总结了Java中8种基本数据类型的基本信息:

基本类型 位数 字节 默认值 取值范围
byte 8 1 0 -128 ~ 127
short 16 2 0 -32768 ~ 32767
int 32 4 0 -2147483648 ~ 2147483647
long 64 8 0L -9223372036854775808 ~ 9223372036854775807
char 16 2 ‘u0000’ 0 ~ 65535
float 32 4 0f 1.4E-45 ~ 3.4028235E38
double 64 8 0d 4.9E-324 ~ 1.7976931348623157E308
boolean 1 false true、false

注:boolean具体占用多少字节,依赖于JVM厂商的具体实现。

另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一

包装类型

Java中8种基本数据类型都有其对应的包装类型: ByteShortIntegerLongFloatDoubleCharacterBoolean

基本类型 V.S 包装类型

有了基本类型,为什么还要包装类型呢?Java是OO语言,开发中用到的最多的还是对象。基本数据类型和包装类型之间的区别如下:

  1. 默认值,包装类型,不赋值的情况下为null,而基本类型有非null默认值;
  2. 泛型,包装类型可以用于泛型,基本类型不行;
  3. 存放位置,对于局部变量,基本类型存放于栈,对于类成员变量,基本类型存放于堆。包装类型是对象,我们知道对象基本都是存放在堆中的;
  4. 占用空间,根据存放位置,我们就可以知道,基本类型相较于包装类型,占用空间很少。

常量池技术

Java中大部分包装类型都使用了常量池技术。 Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。 两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

只有超出对应范围才会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。 下面是一个例子:

1
2
3
4
5
6
Integer a = 10;
Integer b = 10;
System.out.println(a == b);//true
Integer c = 345;
Integer d = 345;
System.out.println(c == d);//false

不过下面的代码,会输出false

1
2
3
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);

因为 Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。因此,i1 直接使用的是常量池中的对象。而Integer i2 = new Integer(40) 会直接创建新的对象。 下面我们再了解下Java的自动装箱、拆箱技术。

自动装/拆箱

  • 装箱:基本类型包装成对应的包装类型;
  • 拆箱:包装类型转换成对应的基本类型。

比如:Integer i = 10;会自动完成装箱,new一个Integer对象;而int n = i;会自动完成拆箱,把Integer对象的值赋给n。通过反编译字节码,可以发现Java自动装/拆箱的原理为:

  • 装箱,就是调用包装类的valueOf()方法;
  • 拆箱,就是调用包装类的xxxValue()方法。

不过需要注意的是: 如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。

类型转换

下图展示了各种数据类型中的合法转换:

其中实现表示数据不会丢失,虚线表示可能有数据丢失。常见的类型转换有两种:

  1. 运算时自动转换

    当一个二元运算符作用于两个数时,两个操作数首先被转换为同一类型,转换的原则如下:

    (1)如果两个操作数之中有一个为double类型,另一个转换为double类型;

    (2)否则,如果两个操作数之中有一个为float类型,另一个被转换为float类型;

    (3)否则,如果两个操作数之中有一个为long类型,另一个被转换为long类型;

    (4)否则,两个操作数都被转换为int类型。

  2. 强制转换

    比如float a = 1.5; int b = (int)a;强制转换。

参考资料

  1. https://javaguide.cn/java/basis/java-basic-questions-01.html
  2. https://blog.csdn.net/Pan_Yang_/article/details/81008058
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信