问题:在Java中,为什么使用primitive type的效率要比通过new来创建数据类型的效率高?
首先,在Java中,primitive type从字面上可以理解为基本数据类型,或者原始数据类型。它是char、byte、short、int、long、double、float、Boolean的统称。
其次,在Java中,存放数据的地方有下面5个地方。
- register,寄存器。即,位于CPU芯片上的寄存器,其特点是速度特别快,但是不能直接操作;
- stack,内存栈区。位于Random Access Memory上,即内存中。运行速度次于register,可直接操作;
- heap,内存堆。同样位于内存区。其特点是,所有通过new关键字来创建出来的对象都位于该内存堆区;
- Read Only Memory,只读存取器。通常用于存放常量或者静态的不变的数据;
- non-RAM,非内存存储。说白了,就是把那些可以独立于程序存放的数据,不放在上面任何一个地方存储。而是存放在诸如磁盘或光盘上。类似于Oracle数据库的外部表的数据不存放在数据库里,而是存放在数据库之外的存储上一样。
这里,有一个重点是,在Java中,所有通过new来创建的对象,都会存放在内存的heap区中。另外,从1-5的存储区,其运行速度是逐步降低的。因此,当我们使用new去创建对象/变量时,其运行速度肯定不如内存的stack区效率高。
所以,Java也沿袭了C/C++的做法,提供了一些原始数据类型,并且把这些类型的变量放到内存的stack区来处理。当我们需要使用这些类型的变量时,直接拿过来用即可,而不再需要通过new关键字来新建1个出来。如下,整型变量n1要比n2快:
public class PrimitiveType { public static void main(String[] args) { int n1 = 47; Integer n2 = new Integer(47); System.out.println("Fast:n1" + n1); System.out.println("Slow:n2" + n2); } }
小结:Java中提供的原始数据类型,都是在内存的stack区处理。通过new来创建的变量是在内存的heap区进行处理。 前者执行效率要比通过new在内存heap区创建变量的执行效率高。