JAVA虚拟机字符串池相关(笔记)

 JAVA虚拟机有一个字符串池,对于字符串池的访问可以使用字符串对象的intern()方法,可动态向池中添加对象,它的定义如下:

 

public native String intern();

 

这是一个本地方法,在调用这个方法时,JAVA虚拟机首先检查字符串池中是否存在与该字符串对象值相等的对象,如果存在就返回字符串池中的对象的引用,否则就新创建一个与该字符串对象值相等的对象,然后再返回新创建对象的引用,有如下一段代码:

 

public class InternTest{

     public static void main(String args[]){

         //用一个字符数组初始化a,是避免池中含有值为"abcd"的对象

         String a=new String(new char[]{'a','b','c','d'});

         String b=a.intern();

         (1)

         if(a==b){

               System.out.println("b加入了字符串池中,没有新建对象");

         }else{

               System.out.println("b没加入字符串池中,新建了对象");

         }

     }

}

 

上述代码运行后将输出"b没加入字符串池中,新建了对象".原因如下:

 

String a=new String(new char[]{'a','b','c','d'});

该语句会新建一个字符串对象,但该对象并不会放入字符串池中,而是放在堆中

通过a.intern()语句,JVM将会在字符串池中新建一个值为"abcd"的对象,并把其引用返回给b,因此才有了上面的输出

如果在代码中(1)处加入语句:String c="abcd";

那么System.out.println(c==b);会返回true

 

前面谈到String对象的存储,在JAVA中,栈(stack)主要保存基本类型,速度仅次于寄存器,比堆要快,而堆(heap)主要用于存储对象;

 

在用引号创建字符串对象时,实际上是JAVA虚拟机在栈中创建多个char型字符,然后在堆中创建一个String对象,该对象的值就是之前栈中的那个字符序列;而用new String("abc")创建String对象时,关键字new会创建一个字符串对象放在堆中,"abc"也会创建一个字符串对象,但该对象是放在字符串池中的,前者是在运行期创建,后者在编译期创建.因此创建了两个字符串对象,而且两个对象的值都是abc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值