A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘廖明 中级黑马   /  2013-4-11 17:10  /  2018 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 潘廖明 于 2013-4-13 23:11 编辑
  1. public class EqualTest
  2. {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args)
  7.         {
  8.                 String s1 = "我在黑马学习";
  9.                 String s2 = "我";
  10.                 String s3 = "在黑马学习";
  11.                 String s4 = s2 + s3;
  12.                 String s5 = "我" + "在黑马学习";
  13.                 // 输出了false,个人理解:s4是局部变量,在栈中开辟新的内存空间。
  14.                 // 运行的时候才给他赋值,赋给他的值不是从常量池里面取出,所以为false。
  15.                 // 你们给下你们的意见?
  16.                 System.out.println(s1 == s4);
  17.                 // 该语句输出true,s1与s5代表常量池中的同一块区域。
  18.                 System.out.println(s1 == s5);

  19.         }

  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
        s5是两个字符串直接量进行连接运算,编译器在编译阶段就能确定s5的值,
        所以系统会直接让s5指向字符串池中已经存在的字符串,
        s4的两个普通变量进行连接运算得到的,编译器无法在编译时期就确定s4的值,
        所以无法让s4指向字符串池中存在的相同值的字符串,所以为false
        要让s1和s4相等,那可以把s2和s3用final修饰,让它们变成“宏变量”,那么编译阶段就能确认s4的值了,
        s1和s4就会相等的了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
String 是引用型变量,赋的值存在堆里,栈里只存的是一个地址值
(s1 == s4)是两个地址的比较,所哟返回的是false
要想比较内容用String的内容比较与 equals

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
常量池专门用于管理在编译时期被确定并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量。
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本。你s1和s5所引用的"我在黑马学习"可以在编译时期就确定下来,因此它们都将引用常量池中的同一个字符串对象。而s4后面的字符串值不能在编译时期就确定下来。所以输出false。
和你的意思大概差不多{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
双等号“==”做比较时不是对值做比较,而是对对象的引用做比较,也就是说对内存地址做比较。如果是基本类型的话,就是对值做比较。

int x = 1000;
int y = 1000;
这时ix== y 是 true
--------------------
顺便普及一下,两个字符串比较值的时候,推荐用 equals()方法,而不推荐用双等号.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
Sword 金牌黑马 2013-4-12 01:24:25
7#
两个字符串比较值的时候,要用 equals()方法,而不推荐用==

==做比较时应该不是对值做比较,而是对对象的引用做比较,也就是说对内存地址做比较

回复 使用道具 举报
易杰 中级黑马 2013-4-12 11:02:27
8#
“==”属于逻辑运算符,运算结果就两种情况,true或false。
使用“==”时,特别要注意的,要看两边操作数的数据类型。
如果“==”两边操作数是基本数据类型,==比较的是操作数的值。
如果“==”两边操作数引用数据类型或者对象时,==比较的操作数所在的内存地址。
回复 使用道具 举报
易杰 中级黑马 2013-4-12 11:03:36
9#
“==”属于逻辑运算符,运算结果就两种情况,true或false。
使用“==”时,特别要注意的,要看两边操作数的数据类型。
如果“==”两边操作数是基本数据类型,==比较的是操作数的值。
如果“==”两边操作数是引用数据类型或者对象时,==比较的是操作数所在的内存地址。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马