Java中的String类中intern方法

字符串对象和字符串常量

先看一段代码的执行结果:

public class StringTest {

    @Test
    public void test(){
        String str1 = "1";
        String str2 = new String(new char[]{'1'});
        String str3 = new String(new char[]{'1'});
        System.out.println("String str1 = \"1\";");
        System.out.println("String str2 = new String(new char[]{'1'});");
        System.out.println("String str3 = new String(new char[]{'1'});");
        System.out.println();
        System.out.println( "str1 == str2: " + (str1 == str2));
        System.out.println( "str2 == str3: " + (str2 == str3));
        System.out.println( "str1 == \"1\": " + (str1 == "1"));
        System.out.println( "str2 == \"1\": " + (str2 == "1"));
        System.out.println( "str1 == str1.intren(): " + (str1 == str1.intern()));
        System.out.println( "str1 == str2.intren(): " + (str1 == str2.intern()));
    }

}

执行结果:

String str1 = "1";
String str2 = new String(new char[]{'1'});
String str3 = new String(new char[]{'1'});

str1 == str2: false
str2 == str3: false
str1 == "1": true
str2 == "1": false
str1 == str1.intren(): true
str1 == str2.intren(): true

理解上面的执行结果:

code说明
str1指向字符常量"1",
str2、str3分别指向两个通过字符数组[‘1’]创建字符对象
str1 == str2: falsestr1指向的“1”是在JVM内存的常量池区域,str2是一个在堆区的对象,所以不是同一个对象
str2 == str3: falsestr2、str3是在堆区两个不同对象,地址也不一样,所以返回false
str1 == “1”: true,str2 == “1”: false代码中所有常量"1"都是指向JVM常量池同一份,所以它们的地址是一样的
str1 == str1.intren(): true,str1 == str2.intren(): true, intren()字符对象在常量池中的对象,所以跟"1"是同一个地址

通过字节码认识字符串常量和字符串对象的区别

Java源码:

public void test2(){
        String str1 = "1";
        String str2 = new String(new char[]{'1'});
}

通过JDK自带的工具进行反汇编:

javap -c -s StringTest.class

反汇编结果:

  public void test2();
    descriptor: ()V
    Code:
       0: ldc           #2                  // String 1
       2: astore_1
       3: new           #3                  // class java/lang/String
       6: dup
       7: iconst_1
       8: newarray       char
      10: dup
      11: iconst_0
      12: bipush        49
      14: castore
      15: invokespecial #4                  // Method java/lang/String."<init>":([C)V
      18: astore_2
      19: return

汇编代码中 0-2的汇编指令对应源码 String str1 = “1”,ldc命名从常量池中加载常量,astore1将栈顶内容保存到调用栈本地变量1;
汇编代码中 3-18的汇编指令对应源码 String str2 = new String(new char[]{‘1’}),是通过new命名创建一个String对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值