xuhang1128 2011-05-07 16:01
浏览 265
已采纳

请问一个关于字符串的问题,稍微有点细节

关于String s1 = new String("abc");我想问下,貌似类在加载后常量池中会分配abc,可是在这条语句执行后,堆中的String对象又会包含char数组,我怎么感觉有重复啊,这样做有什么目的吗 (这个是我最疑惑的)
[code="java"] String s= new String("abc");反汇编指令:

Code:

Stack=3, Locals=2, Args_size=1

0: new #2; //class java/lang/String [color=red] //这里new过之后栈中应该会存在对象的引用吧?[/color]

3: dup

4: ldc #12; //String abc [color=red] //这里又将常量池的14号压入栈是何目的呢 ?[/color]

6: invokespecial #14; //Method java/lang/String."":(Ljava/lang/String;)V

9: astore_1

10: return [/code]

tip:请问常量池中的abc值是以什么方式存在的呢?是一个对象吗,我想应该是的吧,因为String s = "abc";返回的s指向的应该是一个对象才是啊,但是这条语句也没有new啊
String s = "abc"指令:
[code="java"] 0: ldc #12; //String abc [color=red] //应该说仅仅将常量池的abc压入栈中吧?没有创建对象是吗[/color]

2: astore_1

3: getstatic #10; //Field java/lang/System.out:Ljava/io/PrintStream;

6: aload_1

7: invokevirtual #13; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

10: return [/code]

我想再问下,public native String intern();有何使用场景啊,java doc虽然看的懂,但是不知道哪里可以用的着

  • 写回答

1条回答 默认 最新

  • deepfuture 2011-05-07 18:57
    关注

    String s = "abc";使用了JAVA的基本类型,不是对象

    String s1 = new String("abc");是对象,可以调用s1的相关方法

    public native String intern();

    文档告诉我们该方法返回一个字符串对象的内部化引用:
    由String类维护一个初始为空的字符串的对象池,当intern方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回该字符串的引用。

    从程序的角度上怎么来看这个方法呢

    我们假设有两个字符串s1,s2,当s1.equals(s2)时,s1.intern()==s2.intern(),
    也就是说这两个字符串在内存中使用的是同一个实例。

    Java语言规范中定义了字符串文字以及更一般的常量表达式的值的字符串是被内部化的,以便它们共享同一个实例。我们试验一下下面代码

    String s1 = "你好,Java自由人";
    String s2 = "你好," + "Java自由人";
    System.out.println(s1==s2);
    System.out.println(s1.intern()==s2.intern());

    这段代码将打印两个true,也就是说字符串s1和s2是共享同一个实例。不过前提是尽管使用了表达式,但是表达式中必须都是常量。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划