Java中String的比较
2014-05-19 23:14
176 查看
声明:本博客为原创博客,未经允许,不得转载!小伙伴们如果是在别的地方看到的话,建议还是来csdn上看吧(链接地址为http://blog.csdn.net/bettarwang/article/details/26175901),看代码和提问、讨论都更方便。
说到String的比较,就不能不提到其常量池的问题,目前网上有许多解释,也有很多所谓的实例,但是有很多并非作者原创,而是转载而来,关键是其中许多实例并未经过作者的验证,有些我验证之后发现与其结果不符,说明其解释也有问题。我不敢保证我的理解是最贴近Java本质的,但是至少我可以保证我所有的代码和结果都是经过自己调试并运行过的,也正是如此我所有的运行结果都采用截图的形式,以保证内容真实。
废话少说,先看下面一段代码:
![](https://img-blog.csdn.net/20140518235722343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQmV0dGFyd2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
原因如下:
1. 虽然s1与s2是两个引用,但是由于系统给String维护着一个常量池,它保证了每个字符串常量只有一个备份,因而s1和s2这两个字符串引用指向的是常量池中的同一个对象。
2. 那为什么s1==s3的结果是false呢,这是因为s3指向的对象并不在常量池中,而是在堆中。
3. 而至于str3=="studyjava"的结果为false,则是由于str1和str2并非直接的字符串常量,而是字符串引用,因而str3的值不能在编译时就确定,需要到运行时才能确定;所以如果改成str3="study"+str2;那么同样的str3=="studyjava"的值还是false,因为有一个是字符串引用,JVM没法在编译时就将其优化为指向常量池中的对象。
但是对于两个字符串常量的连接(即使用"+"),JVM会在编译时就将其优化为连接后的值,即str4指向的就是常量池中的"studyjava",因而str4=="studyjava"的值为true.
说到String的比较,就不能不提到其常量池的问题,目前网上有许多解释,也有很多所谓的实例,但是有很多并非作者原创,而是转载而来,关键是其中许多实例并未经过作者的验证,有些我验证之后发现与其结果不符,说明其解释也有问题。我不敢保证我的理解是最贴近Java本质的,但是至少我可以保证我所有的代码和结果都是经过自己调试并运行过的,也正是如此我所有的运行结果都采用截图的形式,以保证内容真实。
废话少说,先看下面一段代码:
<span style="font-size:18px;">import java.util.*; public class TestString { public static void main(String[]args) { String s1="java"; String s2="java"; String s3=new String("java"); System.out.println(s1==s2); System.out.println(s1==s3); String str1="study"; String str2="java"; String str3=str1+str2; System.out.println(str3=="studyjava"); String str4="study"+"java"; System.out.println(str4=="studyjava"); } }</span>输出结果如下图所示:
原因如下:
1. 虽然s1与s2是两个引用,但是由于系统给String维护着一个常量池,它保证了每个字符串常量只有一个备份,因而s1和s2这两个字符串引用指向的是常量池中的同一个对象。
2. 那为什么s1==s3的结果是false呢,这是因为s3指向的对象并不在常量池中,而是在堆中。
3. 而至于str3=="studyjava"的结果为false,则是由于str1和str2并非直接的字符串常量,而是字符串引用,因而str3的值不能在编译时就确定,需要到运行时才能确定;所以如果改成str3="study"+str2;那么同样的str3=="studyjava"的值还是false,因为有一个是字符串引用,JVM没法在编译时就将其优化为指向常量池中的对象。
但是对于两个字符串常量的连接(即使用"+"),JVM会在编译时就将其优化为连接后的值,即str4指向的就是常量池中的"studyjava",因而str4=="studyjava"的值为true.
相关文章推荐
- 今天改写了一个VB6进度条控件,比较完善了,支持 XP 效果
- 常见Java开发工具的特点比较
- C#中关于String.Equals(object,object)和(object==object )的比较
- fgets与gets比较分析
- delphi 7.0 DateTimePicker控件相同日期比较的问题
- 比较国内外网络开源项目CMS的差异
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
- Hive文件存储格式的测试比较
- IOCP模型与EPOLL模型的比较 服务器优化
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- Excel中比较两列值的方法
- js基本知识比较系列一:获取元素
- Java - TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
- ASP.NET四种页面导航方式之比较与选择
- php文本操作方法集合比较第1/2页
- 三本以程序员为主角的小说的比较
- MS SQL两个日期比较,获取最大或最小的日期
- 五大数据库常用SQL比较(三)
- JS日期比较,使用正则表达式转换
- 12种JavaScript MVC框架之比较