精华帖 (0) :: 良好帖 (4) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-09
很受益!!
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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") |
|
返回顶楼 | |
发表时间: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"); 指向两个不同的对象 |
|
返回顶楼 | |
发表时间:2012-04-10
jjyuan 写道 弱弱的问一句怎么才能有效的优化string呢
关于string的优化 根据个人经验以及帖子论证的 1:不经常改变的string 声明的时候 用 String s="444444"; 不要new 2:经常改变的 采用 StringBuild 隐约记得jdk升级中 对这个有代码优化的 |
|
返回顶楼 | |
发表时间: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下试试 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间:2012-04-10
spyker 写道 相等的String literals 引用的是同一个string 对象 ps:(个人理解)new String("abc") new String("abc") 这两个是不同的 new一次 肯定分配一次内存空间,这是必然的 |
|
返回顶楼 | |
发表时间:2012-04-10
jinnianshilongnian 写道 spyker 写道 相等的String literals 引用的是同一个string 对象 ps:(个人理解)new String("abc") new String("abc") 这两个是不同的 new一次 肯定分配一次内存空间,这是必然的 那面试官把我蒙的呀~~~~~~~~~ |
|
返回顶楼 | |
发表时间:2012-04-10
spyker 写道 jinnianshilongnian 写道 spyker 写道 相等的String literals 引用的是同一个string 对象 ps:(个人理解)new String("abc") new String("abc") 这两个是不同的 new一次 肯定分配一次内存空间,这是必然的 那面试官把我蒙的呀~~~~~~~~~ 不要相信任何人,实践出真知 PS 面试的人可能还没你厉害 |
|
返回顶楼 | |