![On Java:中文版·基础卷](https://wfqqreader-1252317822.image.myqcloud.com/cover/337/53256337/b_53256337.jpg)
3.2.2 特殊情况:基本类型
有一些你经常使用的类型享受特殊待遇,你可以将它们称为“基本类型”(primitive type)。它们之所以享受特别待遇,是因为new关键字是在堆上创建对象,这就意味着哪怕是创建一些简单的变量也不会很高效。对于基本类型,Java使用了与C以及C++相同的实现机制,这意味着我们无须使用new来创建基本类型的变量,而是直接创建一个“自动变量”(automatic variable),注意不是引用。也就是说,该变量会直接在栈上保存它的值,因此运行效率也较高。
Java定义了每一种基本类型所占用的空间大小(见表3-1)。即便是在不同的机器上,这些类型所占用的空间也是保持一致的。而这种一致性也是Java程序比其他语言程序移植性更好的原因之一。
表3-1
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_62_01.jpg?sign=1739613969-MBpMlw97urzRLrD8CwUdOgMsrBe6iW31-0-f4bb57273058ae9468bc01574be18ba2)
表3-1中的所有数值类型都是有符号的,所以不用在表格中查找无符号类型了。
boolean类型的空间大小没有明确标出,其对象只能被赋值为true或false。
此外,Java还为基本类型提供了对应的“包装类”(wrapper class),通过包装类可以将基本类型呈现为位于堆上的非原始对象。例如:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_62_02.jpg?sign=1739613969-fBGmo2X130QniX4I7ljp8g1DQEcEdnWF-0-62c948c35e05f6c6ad879f88c34b8d8d)
也可以这样表示:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_62_03.jpg?sign=1739613969-I3lPbwf00rK5zGaIUiYIvm9I25hn5KCX-0-d3f868da3a8e2bbdc4e5abbdc1435475)
而“自动装箱”(autoboxing)机制能够将基本类型对象自动转换为包装类对象,例如:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_62_04.jpg?sign=1739613969-KzCYvOqUA1Qg0vQsjlPijfWwpDaGH5Q3-0-c542fe376d127db5ec4cf2373054640e)
也可以再转换回来,例如:
![](https://epubservercos.yuewen.com/F9F485/31727349203472506/epubprivate/OEBPS/Images/58501_62_05.jpg?sign=1739613969-4lXSrXrx6detKTwFr7YlyCiUCIMqED5L-0-d1dcffaad2cb5288c33308240a99eea7)
至于使用包装类的原因,后续章节会进行更为细致的讲解。
高精度数字
Java提供了两个支持高精度计算的类,分别是BigInteger和BigDecimal。虽然这两个类也大致可以被归为包装类,但是它们其实并没有对应的基本类型。
这两个类都提供了一些方法来模拟基本类型的各种操作。也就是说,你能对int和float做什么,就能对BigInteger和BigDecimal做什么,区别只是你用方法代替了运算符而已。此外,由于涉及更多的计算量,导致的结果就是相关操作的效率有所降低。所谓“速度换精度”即是如此。
BigInteger可以支持任意精度的整数。也就是说,在运算时你可以表示任意精度的整数值,而不用担心丢失精度。
BigDecimal可用于任意精度的定点数(fixed-point number)。例如,你可以将其用于货币计算。
如果你想了解这两个类的更多细节,请参考JDK文档的相关描述。