论坛首页 Java企业应用论坛

Java String 详解 - String Literal

浏览 20318 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-09  
很受益!!
0 请登录后投票
   发表时间:2012-04-10  
spyker 写道
前几天面试
  String s = new String("abc");
        String s2 =new String("abc");
问生成几个对象
我的印象中生成4个对象
面试官 回答 3个对象
解释 两个 new String("abc");生成一个对象

看到楼主帖子
我自己跑了下例子

String s = new String("abc");
        String s2 = new String("abc");
        if (s == s2) {
            System.out.println("=====");
        } else {
            System.out.println("~!!!!");
        }

        if (new String("abc") == new String("abc")) {
            System.out.println("=====");
        } else {
            System.out.println("~!!!!");
        } 


结果 两个都是 不等

jdk为jdk-1.6.0-14


这个要看虚拟机实现 请参考我的这篇帖子 有测试用例  http://www.iteye.com/topic/1122533
0 请登录后投票
   发表时间:2012-04-10  
jinnianshilongnian 写道
spyker 写道
前几天面试
  String s = new String("abc");
        String s2 =new String("abc");
问生成几个对象
我的印象中生成4个对象
面试官 回答 3个对象
解释 两个 new String("abc");生成一个对象

看到楼主帖子
我自己跑了下例子

String s = new String("abc");
        String s2 = new String("abc");
        if (s == s2) {
            System.out.println("=====");
        } else {
            System.out.println("~!!!!");
        }

        if (new String("abc") == new String("abc")) {
            System.out.println("=====");
        } else {
            System.out.println("~!!!!");
        } 


结果 两个都是 不等

jdk为jdk-1.6.0-14


这个要看虚拟机实现 请参考我的这篇帖子 有测试用例  http://www.iteye.com/topic/1122533

jdk1.6 创建的是两个对象(s,s2)+一个常量("abc")
0 请登录后投票
   发表时间:2012-04-10  
http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
读了这篇文章

一:
String s="abc";
String s2="abc";

二:
String s=new String("abc");
String s2=new String("abc");

一和二的相同点:
都只在 String Literal Pool中创建了abc对象

不同点:
在heap memory中
String s="abc";
String s2="abc";
都指向同一个"abc"

String s=new String("abc");
String s2=new String("abc");
指向两个不同的对象

0 请登录后投票
   发表时间:2012-04-10  
jjyuan 写道
弱弱的问一句怎么才能有效的优化string呢



关于string的优化
根据个人经验以及帖子论证的
1:不经常改变的string 声明的时候 用 String s="444444"; 不要new

2:经常改变的 采用 StringBuild 隐约记得jdk升级中 对这个有代码优化的
0 请登录后投票
   发表时间:2012-04-10   最后修改:2012-04-10
这段代码 可以看看看

 String a = "someString";
        String b = "someString";

        System.out.println(a.equals(b));
        System.out.println(a == b);//heap Memory 同一个对象
        System.out.println(a.intern() == b);
        System.out.println(a == b.intern());
        System.out.println(a.intern() == b.intern());// String Literal Pool 同一个对象

        String c = new String("someString");
        String d = new String("someString");

        System.out.println(c.equals(d));
        System.out.println(c == d); //heap Memory 不同对象
        System.out.println(c.intern() == d);
        System.out.println(c == d.intern());
        System.out.println(c.intern() == d.intern());// String Literal Pool 同一个对象


在我的jdk下运行结果

true
true
true
true
true
true
false
false
false
true

jdk1.6.0-14
大家可以在其他jdk下试试
0 请登录后投票
   发表时间:2012-04-10  
http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
这个关于string 最后几点需要注意的地方

1    Equivalent String Literals (even those stored in separate classes in separate packages) will refer to the same String object.
相等的String literals 引用的是同一个string 对象
ps:(个人理解)new String("abc")  new String("abc") 这两个是不同的
有错请斧正

2    In general, String Literals are not eligible for garbage collection. Ever.
3    Strings created at run-time will always be distinct from those created from String Literals.
4   You can reuse String Literals with run-time Strings by utilizing the intern() method.
5   The best way to check for String equality is to use the equals() method.
0 请登录后投票
   发表时间:2012-04-10  
spyker 写道

相等的String literals 引用的是同一个string 对象
ps:(个人理解)new String("abc")  new String("abc") 这两个是不同的


new一次 肯定分配一次内存空间,这是必然的
0 请登录后投票
   发表时间:2012-04-10  
jinnianshilongnian 写道
spyker 写道

相等的String literals 引用的是同一个string 对象
ps:(个人理解)new String("abc")  new String("abc") 这两个是不同的


new一次 肯定分配一次内存空间,这是必然的



那面试官把我蒙的呀~~~~~~~~~
0 请登录后投票
   发表时间:2012-04-10  
spyker 写道
jinnianshilongnian 写道
spyker 写道

相等的String literals 引用的是同一个string 对象
ps:(个人理解)new String("abc")  new String("abc") 这两个是不同的


new一次 肯定分配一次内存空间,这是必然的



那面试官把我蒙的呀~~~~~~~~~

不要相信任何人,实践出真知
PS 面试的人可能还没你厉害
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics