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()不相等,第二段代码却又相等了。
有朋友知道这是怎么回事吗?谢谢了
我想我已经知道问题所在了
两种方式建立的字符串对象的内部机制是不同的!!
==是对比引用! 展开
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()不相等,第二段代码却又相等了。
有朋友知道这是怎么回事吗?谢谢了
我想我已经知道问题所在了
两种方式建立的字符串对象的内部机制是不同的!!
==是对比引用! 展开
1个回答
展开全部
这个涉及到 Java 的内存管理。Java 字符串分两种情况,静态的和非静态的。只要出现引号 "xxx" 这样的形式就是静态的。Java 出于效率考虑,把静态的字符串和基本数据类型一起放在内存栈区,而不是放在堆区。这是一个特例而已,一般 Java 对象都存在堆区的。
放在栈区的数据是唯一的,不会重复,因此可以用 == 来比较。例如 "123" == "123" 这是 true,这本质上只生成了一个对象。但是第一种情况,你的变量是不确定的,就不是静态字符串,只能被分配到堆区。堆区的对象可能会出现内容重复,就不能用 == 来判断,得用 equals 方法。
还有一种情况:new String(123) == new String(123) 这样就是 false,因为 new 出来的对象是放在堆区的。只能用 equals 来判定内容是否相同。
放在栈区的数据是唯一的,不会重复,因此可以用 == 来比较。例如 "123" == "123" 这是 true,这本质上只生成了一个对象。但是第一种情况,你的变量是不确定的,就不是静态字符串,只能被分配到堆区。堆区的对象可能会出现内容重复,就不能用 == 来判断,得用 equals 方法。
还有一种情况:new String(123) == new String(123) 这样就是 false,因为 new 出来的对象是放在堆区的。只能用 equals 来判定内容是否相同。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询