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中字符串比较的问题的更多相关文章

  1. 三张图彻底了解Java中字符串的不变性

    转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...

  2. java中字符串的非空判断

    问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...

  3. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  4. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...

  5. Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...

  6. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  7. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...

  8. Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...

  9. Java中字符串string的数据类型

    Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...

  10. Java中字符串转为16进制表示

    Java中字符串转为16进制表示 String str = "鲸"; char[] chars = "0123456789ABCDEF".toCharArray ...

随机推荐

  1. matplotlib报错_tkinter.TclError: no display name and no $DISPLAY environment variable

    import matplotlib import matplotlib.pyplot as plt fig=plt.figure() #交互式测试,此时报错 解决办法,在引用后添加下面这一行 matp ...

  2. C#简单画图程序

    实现过程: (1) 新建窗体应用程序 (2) 添加一个MenuScrip控件:添加一个ToolScrip控件. 在ToolScrip控件中对每个单元,要将DisplayStyle属性改为Text (3 ...

  3. HTML之Position用法

    在此,先做声明,本篇仅是摘录自互联网,个人认为这篇文章讲的很不错,附于此地与大家共同欣赏. position的四个属性值: 1.relative2.absolute3.fixed4.static下面分 ...

  4. Android&Java面试题大全—金九银十面试必备

    声明本文由作者:Man不经心授权转载,转载请联系原文作者原文链接:https://www.jianshu.com/p/375ad14096b3, 类加载过程 Java 中类加载分为 3 个步骤:加载. ...

  5. Confluence 6 匿名访问远程 API

    Confluence 管理员可能希望为匿名用户禁用远程访问 API.这样能够避免恶意软件随意在网站进行批量修改. 希望禁用远程访问 API: 在屏幕的右上角单击 控制台按钮 ,然后选择 General ...

  6. axis 数据流

    产生数据流的代码 模板   重新修改了下 :]axis_data_cnt='d0; :]axis_data_frame_cnt='d0; :]delay_cnt='d0; initial begin ...

  7. string标准C++中的的用法总结(转)

    转自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻 ...

  8. 1705: 小明在工作(zzuli)

    题目描述 小明的工作是负责记录饭堂中正在排队的人的信息 在他的工作中会有三种可能的事件发生:     1.编号为id的学生加入到队伍的最后面     2.排在最前面的学生打完饭离开了队伍     3. ...

  9. input标签 disabled 和 readonly的区别

    需求描述:今天提交代码,老大审了一下,给我指出了一个改正的地方,XXX的详细信息页面(不是修改页面) input的内容是不能改的,给我指出的时候,我立马就知道了这个该怎么改了,加个readonly不就 ...

  10. Python基础之类方法和静态方法

    小叙一会儿: 通常情况下,在类中定义的所有函数(注意了,这里说的就是所有,跟self啥的没关系,self也只是一个再普通不过 的参数而已)都是对象的绑定方法,对象在调用绑定方法时会自动将自己作为参数传 ...