当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

关于String的问题

发表于: 2015-03-05   作者:abc08010051   来源:转载   浏览:
摘要: 关于String的经典问题很多,不过弄清楚jvm如果创建和存储String对象,一般的问题应该都能对付 1 String对象的存放    (1) 直接使用双引号:String s = "abc"; "abc"字符串存在jvm的常量池中,常量池在方法区中    (2) 使用new String:String s =

关于String的经典问题很多,不过弄清楚jvm如果创建和存储String对象,一般的问题应该都能对付

1 String对象的存放

   (1) 直接使用双引号:String s = "abc"; "abc"字符串存在jvm的常量池中,常量池在方法区中

   (2) 使用new String:String s = new String("abc");在堆中分配内存区域

 

2 + 操作String对象

      (1) String s = "a" + "bc";这种类型的操作,类文件在编译成class文件时,直接把"a" + "bc"编译成了"abc";常量池中只存在"abc",不存在"a", "bc"

      (2) String a = "a"; String b = "bc"; String c = a + b;针对这种操作,编译后的指令为:先创建一个StringBuilder对象,然后使用append方法,把两个字符串append进来,然后调用 toString方法,生成一个新的String对象

 

3 itern()方法

   该方法去查找常量池用没有,有则返回,没有创建

 

4 两个类同时声明相同的str

   比如:

public class StringDemo {
    private static String xx = "abc";
    public static void main (String[] args) {
        String a = "a";
        String b = "bc";
        String c = a + b;
        String d = "a" + "bc";
        String e = "abc";
        String ss = "x" + "yyy";
        System.out.println(e == c );
        System.out.println(e == d );
        System.out.println(xx == e);
        System.out.println(xx == TestDemo.str);
    }
}

class TestDemo {

    public static final String str = "abc";

//    public static final StringDemo strDemo = new StringDemo();

    static {
        System.out.println("TestDemo clinit...");
    }
}

   执行结果:

  

com.malone.common.StringDemo
false
true
true
true

   在类TestDemo.java声明了str对象,在StringDemo声明了xx,两个类使用了相同的字符串,常量池中只存在一个"abc"

   看一下上面mian函数编译后的命令:

  

  

ldc "a"
astore_1
ldc "bc"
astore_2
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
aload_1
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
aload_2
invokevirtual java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/StringBuilder/toString()Ljava/lang/String;
astore_3
ldc "abc"
astore 4
ldc "abc"
astore 5
ldc "xyyy"
astore 6
getstatic java/lang/System/out Ljava/io/PrintStream;
aload 5
aload_3
if_acmpne 26
iconst_1
goto 27
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
aload 5
aload 4
if_acmpne 34
iconst_1
goto 35
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
getstatic com/malone/common/StringDemo/xx Ljava/lang/String;
aload 5
if_acmpne 42
iconst_1
goto 43
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
getstatic java/lang/System/out Ljava/io/PrintStream;
getstatic com/malone/common/StringDemo/xx Ljava/lang/String;
ldc "abc"
if_acmpne 50
iconst_1
goto 51
iconst_0
invokevirtual java/io/PrintStream/println(Z)V
return

 

 

关于String的问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号