当前位置:  技术问答>java相关

大家来讨论一下关于String对象的"=="问题!

    来源: 互联网  发布时间:2015-07-04

    本文导语:  public class Test { public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.print((hello == "Hello") + " "); System.out.print((Other.hello == hello) + " "); System.out.print((Other.hello == hello) + " "); System.out.print((h...

public class Test {

public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());

}


}
class Other{
static String hello="Hello";
}

首先大家先想想会打印出来一些什么信息,再讨论一下特别是最后一个“.intern()”方法有什么作用!!!!

|
在编译时,程序可以优化变量的分配:如只在内存中分配一个字符串“Hello”,以及可以合并常量
public class Test {

public static void main(String[] args) {
String hello = "Hello", lo = "lo";
//将reference 变量hello指向内存"Hello" ,变量lo指向内存"lo";
/*    
0 ldc #2 
2 astore_1
3 ldc #3 
5 astore_2
*/
System.out.print((hello == "Hello") + " ");
//由于 == 实际上是句柄的比较所以是true
/*
  6 getstatic #4 
  9 new #5 
  12 dup
  13 invokespecial #6 
  16 aload_1
  17 ldc #2 
  19 if_acmpne 26
  22 iconst_1
  23 goto 27
  26 iconst_0
  27 invokevirtual #7 
  30 ldc #8 
  32 invokevirtual #9 
  35 invokevirtual #10 
  38 invokevirtual #11 
*/
System.out.print((Other.hello == hello) + " ");
//同样Other.hello 也指向同一个内存"Hello"
/*
  41 getstatic #4 
  44 new #5 
  47 dup
  48 invokespecial #6 
  51 getstatic #12 
  54 aload_1
  55 if_acmpne 62
  58 iconst_1
  59 goto 63
  62 iconst_0
  63 invokevirtual #7 
  66 ldc #8 
  68 invokevirtual #9 
  71 invokevirtual #10 
  74 invokevirtual #11 
  
*/
System.out.print((Other.hello == hello) + " ");
//同理
System.out.print((hello == ("Hel"+"lo")) + " ");
//编译时,对于两个常量"Hel"和"lo" 编译器已经将之合并为一个,而不必等待运行时合并
/*
 116 new #5 
 119 dup
 120 invokespecial #6 
 123 aload_1
 124 ldc #2 
 126 if_acmpne 133
 129 iconst_1
 130 goto 134
 133 iconst_0
 134 invokevirtual #7 
 137 ldc #8 
 139 invokevirtual #9 
 142 invokevirtual #10 
 145 invokevirtual #11 
 
*/
System.out.print((hello == ("Hel"+lo)) + " ");
//这个没有合并,于是生成一个新的字符串 == 这样两个句柄相比不同
/*
148 getstatic #4 
 151 new #5 
 154 dup
 155 invokespecial #6 
 158 aload_1
 159 new #5 
 162 dup
 163 invokespecial #6 
 166 ldc #13 
 168 invokevirtual #9 
 171 aload_2
 172 invokevirtual #9 
 175 invokevirtual #10 
 178 if_acmpne 185
 181 iconst_1
 182 goto 186
 185 iconst_0
 186 invokevirtual #7 
 189 ldc #8 
 191 invokevirtual #9 
 194 invokevirtual #10 
 197 invokevirtual #11 
 
*/
System.out.println(hello == ("Hel"+lo).intern());
//intern 是一个naitive函数。解释可以看文档
/*
Returns a canonical representation for the string object. 
A pool of strings, initially empty, is maintained privately by the class String. 

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. 

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true

*/
/*
200 getstatic #4 
 203 aload_1
 204 new #5 
 207 dup
 208 invokespecial #6 
 211 ldc #13 
 213 invokevirtual #9 
 216 aload_2
 217 invokevirtual #9 
 220 invokevirtual #10 
 223 invokevirtual #14 
 226 if_acmpne 233
 229 iconst_1
 230 goto 234
 233 iconst_0
 234 invokevirtual #15 
*/
}


}
class Other{
static String hello="Hello";
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 参数传递的问题!(大家讨论讨论)
  • 哪位高手有兴趣跟我讨论讨论java中调用dll文件??小弟有些问题还是不很清楚??
  • 和Java版高手在线讨论代理服务器的问题,讨论者都有分。
  • Java 访问控制的问题(public,private,protected,(default))!讨论讨论!
  • 这两天本版人气不高,我来发个问题,有关互斥同步的。大家讨论讨论
  • 请问这里可以讨论MINIX的问题吗?
  • 讨论linux的发展前途与有无用处问题。。。。。。。。。。。
  • LINUX下JAVA要代替C..?常跟朋友讨论的一个问题
  • 讨论LUXIN安装问题
  • 大家来讨论一个最实际的问题:)
  • 请问一下,关于arm下的嵌入式linux驱动相关问题请教是应该发在哪个讨论区?
  • 高手请进!讨论一个问题。
  • 关纯DOS下的256色、32K色、64K色问题讨论
  • 有挑战性的问题,大家一起讨论
  • 大家讨论一下指针数组的问题!
  • 老问题新讨论
  • 哇考,为什么在一个帖子里不能回复30次以上啊?这样子怎么和人家讨论问题啊?
  • 我看到大家都在讨论分数的问题,我如何看到自己的分数呢?
  • 请使用QT编程的朋友到以下网址讨论QT中遇到的问题!!!!!!!
  • Java与IE的问题!大家来讨论!
  • Java 可以做拨号程序吗?我只是和大家讨论讨论 不必太认真
  • 欢迎高手来讨论:关于文件格式的大讨论
  • 用java开发一个基于Proxy(代理)的网络计费系统。有兴趣的来讨论讨论
  • 【讨论贴】gcc开发的时候有大家都有什么好的调试方法,来讨论下
  • 讨论讨论,当错误发生时,并用if语句测试出时,应该返回怎样的值
  • 一个面试,是“北京华胜六所”外包给风河(VxWorks)北京研发处,做linux内核开发,大家过来讨论讨论
  • 新建了个QQ群(软件与创业),希望有兴趣的朋友进来讨论讨论软件项目、产品、创业、管理、投资等(代码之外的)观点和想法
  • 用java做c/s结构可行吗???大家来讨论讨论,应该都会有收获。
  • 有没有人讨论value object模式
  • http://www.itpub.net 论坛更换数据库,速度更快,欢迎大家前去讨论!
  • 讨论“内存泄漏”


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3