Java中字符串比较的问题
package com.hxl;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
String s3 = "HelloWorld";
System.out.println(s3 == (s1 + s2));
}
}
【结果】false
package com.hxl;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
String s3 = "HelloWorld";
System.out.println((s1 + s2).hashCode());
System.out.println(s3.hashCode());
}
}
【结果】
439329280
439329280
package com.hxl;
public class Test {
public static void main(String[] args) {
String s1 = "length: 10";
String s2 = "length: " + s1.length();
String s3 = "length: " + 10;
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s1 == s2);
System.out.println(s1 == s3);
}
}
【结果】
length: 10
length: 10
length: 10
1160065963
1160065963
1160065963
false
true
【原因】
首先要知道==比较的是引用,equals比较的是内容。其次还要知道引用放置在栈内,内容放置在堆内。再其次要知道这里没有使用new所以所有数值都是要进入常量池进行比较。当程序加载的时候常量池中存储的有length: 10、length:、s1.length()、10,其中常量10和length:是没有任何引用指向它们的。而length: 10是有s1引用指向它的。s1.length()也是有引用指向的,只不过没有体现出来,或者说s1.length()可以看成是int i=10;或者int i=s1.length();所以这里的s1.length()这个常量10是有引用的指向的一个常量,所以跟上面那个没有引用指向的10是有区别的,而==恰恰是比较引用的,既然引用都不同了,拼接后的引用s2自然跟s1和s3都不一样。所以s2无论是跟s1比较还是跟s3比较结果都是false。
----------------------------------------------------------------------------------------------------
当定义s3的时候系统会自动把"length: " + 10 转换成 “length: 10” ,让后看看栈空间里面有没有这个值存在,如果有的话就不会在划分空间来存放,直接引用已经存在的值,所以s1跟s3同时引用的都是"length: 10",但s2里面有s1.length()这个是需要通过计算的,每次计算出来的临时的值都会存放在堆空间里面,所以他们引用的地址是不同的。
------------------------------------------------------------------------------------------------------------------------
s1+s2与"Hello"+"World"是不同的,两个变量做运算结果的类型是未知的,而常量运算结果的类型是可以预测的。
【总结】
字符串如果是变量相加,先在栈内存开辟空间,再进行拼接。
字符串如果是常量相加,先拼接,然后在方法区中的常量池中寻找,如果有就直接返回引用。否则,在此处创建并返回引用。
Java中字符串比较的问题的更多相关文章
- 三张图彻底了解Java中字符串的不变性
转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...
- java中字符串的非空判断
问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- 【转】Java中字符串中子串的查找共有四种方法(indexof())
原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...
- Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...
- JAVA中字符串函数subString的用法小结
本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...
- Java中字符串的一些常见方法
1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...
- Java中字符串indexof() 的使用方法
Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...
- Java中字符串string的数据类型
Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...
- Java中字符串转为16进制表示
Java中字符串转为16进制表示 String str = "鲸"; char[] chars = "0123456789ABCDEF".toCharArray ...
随机推荐
- CentOS 7 连接ssh方法
自己在VMware中装了CentOS 6.3,然后主机(或者说xshell)与里面的虚拟机连不通,刚学习,一头雾水,查了半天,也不知道怎么弄. 经指点,找到下面这篇文章,感谢博主: http://bl ...
- 使用Node.js+Hexo+Github搭建个人博客(续)
一.写在前面 在我的上一篇博客<使用Nodejs+Hexo+Github搭建个人博客>中,已经介绍了如何使用 Hexo 在 Github Pages 上搭建一个简单的个人博客.该篇博文将在 ...
- Confluence 6 数据库问题解除
有关数据库相关的问题,请参考 Database Troubleshooting 中的内容. 希望获得更多的帮助,请参考 Troubleshooting Problems and Requesting ...
- Confluence 6 在初始化配置时候的问题
提交一个 服务器请求(support request) 然后在你的服务请求中同时提供下面的信息. 下载一个 LDAP 浏览器,你可以通过这个确定你的 LDAP 服务器配置正确.Atlassian 推荐 ...
- vue的多选框
- Scala-IDE构建Maven项目
本教程演示如何使用Scala-IDE构建一个Scala Maven项目. 1. 下载Scala IDE 通过以下链接下载Scala IDE: http://scala-ide.org/download ...
- css样式之补充。。。
css常用的一些属性: 1.去掉下划线 :text-decoration:none ;2.加上下划线: text-decoration: underline; 3.调整文本和图片的位置(也就是设置元素 ...
- laravel 兜底路由
在 Laravel 5.6 中,引入了兜底路由功能.所谓兜底路由,就是当路由文件中定义的所有路由都无法匹配用户请求的 URL 时,用来处理用户请求的路由,在此之前,Laravel 都会通过异常处理器为 ...
- Tmk吃汤饭
问题 : Tmk吃汤饭 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Tmk喜欢吃汤饭! Tmk喜欢吃汤饭!! Tmk喜欢吃汤饭!!! 汤饭窗口分点餐和取餐两个窗口,一位蜀黍负责点餐窗 ...
- 一个小时就能理解Java的NIO必须掌握这三大要素!
同步与阻塞 同步和异步是针对应用程序和内核的交互而言的. 同步:执行一个操作之后,进程触发IO操作并等待(阻塞)或者轮询的去查看IO的操作(非阻塞)是否完成,等待结果,然后才继续执行后续的操作. 异步 ...