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

关于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

    震惊

    震惊

编辑推荐
今天偶然在Java群看到如下的一段代码: public class Test { String str = new String("food"); char
有个仁兄在 StackOverflow 上发起了一个问题,是这么问的: 众所周知Java中的String对象是不可变的
昨天在群里跟人讨论关于String累加的问题,貌似没有人能特别准确的知道是一个什么样的情况,今天我通
1、String对象的比较   String 是一个常量,从String类中的代码可以看出。String类内部是通过char
不知大家有没有发现,String 中的s是大写的,而平时,类名首字母是大写的。其实String 的背后还有很
背景: String字符串是在Java中用的最多的一个数据类型,关于split的操作也是很频繁的。 遇到一个问
可能很多java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟
测试一 publicclassStringTest{ publicstaticvoidmain(String[]args){ Strings1=newString("abc");/
一.字符串存储机制 公共语言运行时通过维护一个表来存放字符串,该表称为"暂存池",该容器的key是字
一.字符串存储机制 .NET应用程序开始运行CLR会为该应用程序创建一个默认的托管堆,应用程序的所有的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号