java if判断里的“==”和equals(),与字符串相等判断有关。

abstractclassFood{voidtaste(){System.out.println(this+".taste()");}abstractpublicStri... abstract class Food{
void taste(){System.out.println(this+".taste()");}
abstract public String toString();
}

class Candy extends Food{
public Candy(){System.out.println("Candy Created!");}
public String toString(){return "Candy";}
}

class Cake extends Food{
public Cake(){System.out.println("Cake Created!");}
public String toString(){return "Cake";}
}

class Milk extends Food{
public Milk(){System.out.println("Milk Created!");}
public String toString(){return "Milk";}
}

public class SweetShop {
public static void main(String[] args) {
if(args.length>1){
System.out.println("The arguments are too many!");
System.exit(1);
}
if(args[0].equals("Candy")){
Food food=new Candy();
}else if(args[0]=="Cake"){
Food food=new Cake();
}else if(args[0]=="Milk"){
Food food=new Milk();
}else
System.out.println("The arguments is error!");
}
}

这个程序是根据args参数输入来确定创建不同的对象,我输入Candy,就创建Candy对象。

程序基本没问题,但是在判断args[0]的时候却有点问题:

程序的最初版本我在判断args[0]的时候是用 if(args[0]=="Candy")也就是“==”来判断的,但是不管怎么输入都是提示你"The arguments is error!"

然后我把==换成了equals,也就是上面那段代码,if(args[0].equals("Candy")),结果起作用了。

印象中java里的String类的equals已经被重写了,效果和“==”是一样的才对。于是我又另外做了测试:

public class aboutEquals {
public static void main(String[] args) {
String string="123";
System.out.println(string=="123");
System.out.println(string.equals("123"));
if(string=="123")
System.out.println("PASS \"==\"!");
if(string.equals("123"))
System.out.println("PASS \"equals\"!");
}
}
运行结果:
true
true
PASS "=="!
PASS "equals"!

====
让人郁闷啊,第一段代码的“==”和equal()不相等,第二段代码却又相等了。
有朋友知道这是怎么回事吗?谢谢了
我想我已经知道问题所在了

两种方式建立的字符串对象的内部机制是不同的!!
==是对比引用!
展开
 我来答
帐号已注销
推荐于2017-11-25 · TA获得超过5622个赞
知道大有可为答主
回答量:1459
采纳率:0%
帮助的人:1378万
展开全部
这个涉及到 Java 的内存管理。Java 字符串分两种情况,静态的和非静态的。只要出现引号 "xxx" 这样的形式就是静态的。Java 出于效率考虑,把静态的字符串和基本数据类型一起放在内存栈区,而不是放在堆区。这是一个特例而已,一般 Java 对象都存在堆区的。

放在栈区的数据是唯一的,不会重复,因此可以用 == 来比较。例如 "123" == "123" 这是 true,这本质上只生成了一个对象。但是第一种情况,你的变量是不确定的,就不是静态字符串,只能被分配到堆区。堆区的对象可能会出现内容重复,就不能用 == 来判断,得用 equals 方法。

还有一种情况:new String(123) == new String(123) 这样就是 false,因为 new 出来的对象是放在堆区的。只能用 equals 来判定内容是否相同。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式