Java内存分配原理 (3)
String常量池问题的几个例子
下面是几个常见例子的比较分析和理解:String a = "a1";String b = "a" + 1;System.out.println((a == b)); //result = trueString a = "atrue";String b = "a" + "true";System.out.println((a == b)); //result = trueString a = "a3.4";String b = "a" + 3.4;System.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 = falseprivate static String getBB() {return "b";}分析:JVM对于字符串引补充:软件开发 , Java ,
上一个:JAVA学习—面向对象
下一个: Java内存分配原理 (2)
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢