Java中基本类型与引用类型的区别

时间:2022-09-24 15:45:30

基本类型:存放在栈空间中,未初始化时为随机值。
引用类型:存放在堆空间中,未初始化时有默认的值。比如int未初始化时为0,boolean未初始化时为false。

这里在引用java中栈与堆的介绍。

堆在java中是一个运行时数据区,特点就是可以动态的分配内存大小,存取速度较慢。引用类型的如类的对象就是从中分配空间的,在初始化时使用的new关键字有从堆空间中分配内存的作用。

例如:

int [] mat=new int[4];

在这个语句中,new首先会在对空间中申请一块空间,然后会吧空间的首地址返回,存放在开辟的栈空间中。这个栈空间的分配与基本类型的相似,只是其中存放的是地址而不是真正的数据。

堆是由java的垃圾回收机制来负责的,当一块堆空间的引用计数器为0时,就会自动的回收堆空间。

 

栈的数据大小和生存期都是确定的,特点是其中的数据可以共享,存取速度比对快,仅次于寄存器。主要存放基本类型的变量(byte,short,int,long,float,double,boolean,char)和对象引用。

例如:

int a=1;

int b=1;

以上变量的实现过程可以栈的数据共享,编译器首先处理a的实现,实现过程是先在栈中查找是否存在值为1的空间,如果有就直接将a指向该空间,如果没有就会开辟新空间,并把1存进来,因此,在处理b的实现时就会出现a,b都会指向同一个值为1的空间,实现共享。当修改b的值时,过程还是一样,比如,修改b=2,会查找为2的空间,有则指向,无则,保存。这样就会有利于空间的充分利用。

 

字符串常量也可以存放在栈空间中,如:

  String str1="abv";
  String str2="abv";
  System.out.println(str1==str2);//true      ==用来比较栈内存的值是否相等,显然str1与str2在栈中地址相同,相当于str2=str1

当栈空间中有存在的字符串常量时,就会直接指向,如果没有,就会保存。与基本类型的原理相同,但是如果使用new就会有不同的结果,如下:

  String str3=new String("abc");
  String str4=new String("abc");
  System.out.println(str3==str4);//false       str1与str2在栈中地址不相同,使用equals方法返回的是true,比较的是堆中数据是否相等

new每次产生的都是不同的对象,不管其数据是否相等,都会在堆中开辟一个新空间。