深入Java核心 Java内存分配原理精讲

发表于:2010-9-09 11:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zl198751(JavaEye博客    来源:51Testing软件测试网采编

分享:

  5. 关于equals()和==:

  这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是 比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。

  6. 关于String是不可变的

  这一说又要说很多,大家只 要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” ” 生成 “kvill “存在内存中,最后又和生成了”kvill ans”;并把这个字符串的地址赋给了str,就是因为String的”不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原 因了,因为StringBuffer是可改变的。

  下面是一些String相关的常见问题:

  String中的final用法和理解

  final StringBuffer a = new StringBuffer("111");

  final StringBuffer b = new StringBuffer("222");

  a=b;//此句编译不通过

  final StringBuffer a = new StringBuffer("111");

  a.append("222");// 编译通过

  可见,final只对引用的"值"(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象 的变化,final是不负责的。

  String常量池问题的几个例子

  下面是几个常见例子的比较分析和理解:

String a = "a1";  
String b = "a" + 1;  
System.out.println((a == b)); //result = true 
String a = "atrue";  
String b = "a" + "true";  
System.out.println((a == b)); //result = true 
String a = "a3.4";  
String b = "a" + 3.4;   S
ystem.out.println((a == b)); //result = true

  分析:JVM对于字符串常量的"+"号连接,将程序编译期,JVM就将常量字符串的"+"连接优化为连接后的值,拿"a" + 1来说,经编译器优化后在class中就已经是a1。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。

String a = "ab";  
String bb = "b";  
String b = "a" + bb;  
System.out.println((a == b)); //result = false

  分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。 

String a = "ab";  
final String bb = "b";  
String b = "a" + bb;  
System.out.println((a == b)); //result = true

  分析:和[3]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量 池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。

String a = "ab";  
final String bb = getBB();  
String b = "a" + bb;  
System.out.println((a == b)); //result = false  
private static String getBB() { 
return "b";  
}

  分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面 程序的结果为false。

54/5<12345>
春暖花开更文季,点击参与还有惊喜礼品~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号