黑马程序员技术交流社区

标题: 关于"=="用法的一个问题 [打印本页]

作者: 潘廖明    时间: 2013-4-11 17:10
标题: 关于"=="用法的一个问题
本帖最后由 潘廖明 于 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. }
复制代码

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

作者: U芽Lady    时间: 2013-4-11 18:23
String 是引用型变量,赋的值存在堆里,栈里只存的是一个地址值
(s1 == s4)是两个地址的比较,所哟返回的是false
要想比较内容用String的内容比较与 equals
作者: 张旺达    时间: 2013-4-11 18:34
常量池专门用于管理在编译时期被确定并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量。
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本。你s1和s5所引用的"我在黑马学习"可以在编译时期就确定下来,因此它们都将引用常量池中的同一个字符串对象。而s4后面的字符串值不能在编译时期就确定下来。所以输出false。
和你的意思大概差不多{:soso_e113:}
作者: huima    时间: 2013-4-11 19:32
双等号“==”做比较时不是对值做比较,而是对对象的引用做比较,也就是说对内存地址做比较。如果是基本类型的话,就是对值做比较。

int x = 1000;
int y = 1000;
这时ix== y 是 true
--------------------
顺便普及一下,两个字符串比较值的时候,推荐用 equals()方法,而不推荐用双等号.
作者: 黄玉昆    时间: 2013-4-11 19:42
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: Sword    时间: 2013-4-12 01:24
两个字符串比较值的时候,要用 equals()方法,而不推荐用==

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


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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2