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

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()不相等,第二段代码却又相等了。
有朋友知道这是怎么回事吗?谢谢了
我想我已经知道问题所在了

两种方式建立的字符串对象的内部机制是不同的!!
==是对比引用!

 

接下来解释一下原因

这个涉及到 Java 的内存管理。Java 字符串分两种情况,静态百的和非静态的。只要出现引号 "xxx" 这样的形式就是静态的。Java 出于效率考虑,把静态的字符串和基本数据类型一起放在内存栈区,而不是放在堆度区。这知是一个特例而已,一般 Java 对象都存在堆区的。

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

还有一答种情况:new String(123) == new String(123) 这样就是 false,因为 new 出来的对象是放在堆区的。只能用 equals 来判定内容是否相同。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值