上次说起到String相关时,提到过java中一切皆对象,数组也不例外。同时也说到基本数据类型是除外的。那么今天就谈一下基本数据类型。
众所周知,java中一共有八大数据类型:byte、short、int、long、flaot、double、boolean、char。所有与对象相关的特性和方法都对它们不适用。
如何验证?我们知道的是:基本所有对象都继承自Object顶层父类,同时还继承了几个方法如:tostring方法。所有对象都可以调用此方法,而基本数据类型不行,这便印证了基本数据类型不是对象的观点。
在一切皆对象的java中自然不允许这种情况的出现,于是就诞生了包装类型。它们是:Byte、Short、Integer、Long、Flaot、Double、Boolean、Character。而我们常说的装箱与拆箱其实指的就是基本数据类型与包装类型相互转换的过程。这一过程都是java自动完成的,无需我们手动进行。所以是:自动装箱与自动拆箱。
到这里,java中的一切皆对象才是真正的圆满。
既然说到了包装类型,那就随便也填一下上一次String中提到的坑:常量池。
当我们使用常规方式new一个对象时,即使对象的属性是完全一致的,也会创建多个对象,造成资源的浪费。所以我们会想要复用这些对象,于是就有了静态常量。但我若是想复用上千个,上万个对象呢?然后我们回想如果我将这些想要复用的对象都放到一个容器中,等到要用时直接取出不就行了。于是JVM就提供了常量池。
常量池也可以理解为缓存,避免重复创建造成的资源浪费。
当我们使用字面量创建一个String时它就会将其对象进行引用并保存,当你再一次用到时就会直接返回对象的引用。而很多池类技术也是为了解决性能问题(例:线程池,连接池)。
那么这与包装类型有什么关系呢?大部分包装类为了提升性能都是实现了缓存池的,也就是常量池。但需要注意的是,包装类型的缓存是有一定范围的。比如我们将两个128装箱为Integer类型后比较,它们就不是同一个对象。
以下为常见的包装类型缓存范围:
而无论是装箱,拆箱或是类型转换都更加建议使用valueof()方法,而不要直接new,因为valueof使用了缓存,而new是创建一个新的对象。