黑马程序员技术交流社区
标题:
关于"=="用法的一个问题
[打印本页]
作者:
潘廖明
时间:
2013-4-11 17:10
标题:
关于"=="用法的一个问题
本帖最后由 潘廖明 于 2013-4-13 23:11 编辑
public class EqualTest
{
/**
* @param args
*/
public static void main(String[] args)
{
String s1 = "我在黑马学习";
String s2 = "我";
String s3 = "在黑马学习";
String s4 = s2 + s3;
String s5 = "我" + "在黑马学习";
// 输出了false,个人理解:s4是局部变量,在栈中开辟新的内存空间。
// 运行的时候才给他赋值,赋给他的值不是从常量池里面取出,所以为false。
// 你们给下你们的意见?
System.out.println(s1 == s4);
// 该语句输出true,s1与s5代表常量池中的同一块区域。
System.out.println(s1 == s5);
}
}
复制代码
作者:
何锦权
时间:
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
111.jpg
(44.21 KB, 下载次数: 2)
下载附件
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