在网上看到的某篇文章的字符串常数。 没有其他问题,主要是
str7==str8的值为false表明这是不可理解的,希望人们能告诉我。 引用(或地址)? )的制作、变更的角度谈谈就可以了。
谢谢你先行~
代码如下。 (代码由我简化,只剩下有疑问的部分) :
公共类描述创建{
publicstaticvoidmain (string args [ ] ) {
字符串s=' lo ';
String str7='Hel' s;
String str8='He' 'llo ';
system.out.println (str7==str8is ) ) str7==str8);
system.out.println(str7.equals ) str8) is ' str7. equals (str8);
}
}
/* * * *更新2014.04.1814336040 * * * * *更新2014.04.1814336040
@brayden从编译的角度做了很大的说明,我相信这个说明是十分基础和根本性的,但无奈我不太清楚
-_-!
因为在这篇文章的最下面的段落说明了,所以理解起来好像有什么感觉。 虽然也贴上了示例代码及其对应的说明,
/***********开始粘贴* * * * * * * * * * * * * * * * * * * * * * * * /
字符串a=' ab ';
String bb='b ';
String b='a' bb;
系统. out.println ((a==b ) ); //result=false
分析:对于字符串引用,JVM在字符串的“”连接中存在字符串引用,因此在编译程序时无法确定引用值。 也就是说,' a' bb不是由编译器优化的,而是在程序运行时动态分配,只是连接后的新地址分配给b。 因此,上面的程序结果也为false。
字符串a=' ab ';
final String bb='b ';
String b='a' bb;
系统. out.println ((a==b ) ); //result=true
分析:与上述示例唯一不同的是对bb字符串进行了final修饰。 对于final限定的变量,在编译时解析为常量值的本地副本保存在自己的常量池中或嵌入字节码流中。 所以此时的' a' bb '和' a' 'b '的效果是一样的。 因此,上面的程序结果为true。
字符串a=' ab ';
final String bb=getBB (;
String b='a' bb;
系统. out.println ((a==b ) ); //result=false
私有静态字符串getbb (
返回' b ';
}
分析:对于字符串引用bb,上面的程序结果为false,因为JVM在编译时无法确定其值,只是在程序运行时调用方法,然后动态连接方法返回值和' a '并将地址分配给b
/**********完成粘贴* * * * * * * * * * * * * * * * * * * * * * * * * /
Ok,这里我的新问题又来了。 什么时候是编译期,什么时候是执行期? 问题是不是太基础了? 我自己……怀疑是不是加载、编译、执行的概念经常冲突。 也就是说,过程还不完全清楚。 )这个问题解决后,按照上面贴的这篇文章的说明,就可以完全理解了。 或者,你能稍微理解一下@brayden的那个很大的编译说明吗?