java这段代码为什么输出结果是s=hello a=hello false false

publicclassTest{publicstaticvoidmain(String[]args){Strings="hello";Stringa="he";Strin... public class Test{
public static void main(String []args){
String s="hello";
String a="he";
String b="llo";
int iBeg=0;
char iEnd=3;
a=a+b.substring(iBeg,iEnd);
System.out.println("s="+s+"\na="+a);
System.out.println(s==a);
System.err.println(s==a);

}
}
展开
 我来答
jamesge1979
推荐于2016-11-15 · TA获得超过461个赞
知道小有建树答主
回答量:210
采纳率:0%
帮助的人:268万
展开全部
s本身是"hello"
a是 "he" + "llo",所以也是hello
s==a是false,因为两个都是对象,虽然字符相同,但内存地址不同,所以输出false。字符串若比较字符的话要用equals
更多追问追答
追问
为什么iEnd是char类型程序却没有报错??还有iEnd=2的话最后的a为什么是等于hell??
追答
char和int是可以互相转换的,都是值类型
substring(beginIndex,length)
iEnd指定截取长度,"llo"截取2的的长度就是ll
所以是hell
HaydnSyx
2015-06-05 · 超过15用户采纳过TA的回答
知道答主
回答量:32
采纳率:0%
帮助的人:17.8万
展开全部
对象不同,s、a、b只是一种指向对象的变量,即存的是对象所处内存的地址值
用== 比较,只是比较的地址值,因为对象不同,所以地址不同,所以a==s会输出FALSE,
如果改为s.equals(a),就是比较对象里的内容,这样才会输出true
追问
那int型变量用“==”就不是比较地址了?为什么??为什么iEnd是char类型程序却没有报错??还有iEnd=2的话最后的a为什么是等于hell??
追答
你要明白堆栈的这个东西,一般的变量是存在栈里的,像int、float、double等类型,还有就是对象这个类型了,在生成对象类型时会在堆里面创建一个空间,在这里面存储对象的内容,而栈里会保存对象的地址,就是s、a之类的,所以int类型可以直接==比较
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
locu123
2015-06-05
知道答主
回答量:23
采纳率:0%
帮助的人:4.7万
展开全部

引用和引用的指是不一样的。s和a本身都只是引用

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-06-05
展开全部
首先,来分析 a=a+b.substring(iBeg,iEnd);
虽然,iEnd是char类型的,但是传到substring方法后它会转成整型值为3.
b.substring(iBeg,iEnd) 返回的是b自己的引用 (因为开始到结束位置形成的字符串跟自己相同,具体可见substring的source code). 值依旧为"llo"
而执行到 a=a+b.substring(iBeg,iEnd);
a+b.substring(iBeg,iEnd) 会创建一个新的String对象,而a会引用这个新的对象,且值为"hello".
所以,虽然,s和a的值都是"hello", 但是引用是不同的,所以s==a 会返回false.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
寸寸乱
2015-06-05 · TA获得超过514个赞
知道小有建树答主
回答量:564
采纳率:64%
帮助的人:211万
展开全部
字符串标比较不能用==,要用 s.equals(a)
追问
晕 我没报错 我是问结果为什么是那样的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式