equals与==的区别

萧华璋 2007-07-18 09:07:52
public static void main(String args[]){
//当实例化对象a时
String a=new String("0");
if(a.equals("0")){
System.out.println("a.equals('0')");
}
if(a=="0"){
System.out.println("a=0");

}

}

输出a.equals('0')"

2.public static void main(String args[]){
//当声明字符串a时
String a="0";
if(a.equals("0")){
System.out.println("a.equals('0')");
}
if(a=="0"){
System.out.println("a=0");

}

}

输出a.equals('0')和a=0

这是怎么回事?
谢谢

...全文
586 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuandy 2007-07-21
  • 打赏
  • 举报
回复
equals比较内容,==比较内存地址和内容
正解,不过这是指字符串比较方面
IloveSpring 2007-07-21
  • 打赏
  • 举报
回复
内容和内存地址
yijie1206688 2007-07-21
  • 打赏
  • 举报
回复
呵呵,一个是把数据放在堆里面,一个是把数据入在栈里面,
当你用String str1 = "aaa"; String str2 = "aaa"; 这种形式是放在堆里面,所以str1 == str2 结果是为true的,当你用String str1 = new String("aaa");String str2 = new String("aaa");, 这种形式是放在栈里面,当你用str1 == str2进行比较的其实是地址,所以结果当然为false了,用这种形式时就应当用equals,它是比较指针所指向的内容
KingNE 2007-07-20
  • 打赏
  • 举报
回复
equals比较内容,==比较内存地址和内容
正解
lixiuying23 2007-07-20
  • 打赏
  • 举报
回复

你用双引号引起来程序把那解析为字符串
当然你写什么就输出什么拉!!
我感觉是这样的吗?
s74110s 2007-07-19
  • 打赏
  • 举报
回复
楼上的说的好
job1983 2007-07-18
  • 打赏
  • 举报
回复
equals是字面上比较,==通过hashcode比较,比较是不是同一个地址。
zhbking 2007-07-18
  • 打赏
  • 举报
回复
同意上上楼.
alex_homer 2007-07-18
  • 打赏
  • 举报
回复
同意楼上!
rainyheart 2007-07-18
  • 打赏
  • 举报
回复
equals比较内容,==比较引用。
grady0926 2007-07-18
  • 打赏
  • 举报
回复
一个是对象,一个不是对象,后者为NULL时会报错
sz_dongli 2007-07-18
  • 打赏
  • 举报
回复
因为第一个 是实例话一个新的 String 它的值是 0 和"0"的值是一样的 但地址不一样 equals 比的是值 所以输出 a.equals('0')"
下面是因为直接把 "0"的地址给a 所以值和地址都相等 应该两个都输出的..
doudou8407 2007-07-18
  • 打赏
  • 举报
回复
equals比较内容,==比较内存地址和内容
M_Cupid 2007-07-18
  • 打赏
  • 举报
回复
没错 equal比较的是两个变量的值是否相同。==比较的事引用
jiangxc2004 2007-07-18
  • 打赏
  • 举报
回复
==比较的是引用,也就是内容的地址,
String.equals()(例如a.euqals(b))先进行(a==b)的比较,如果false,再用a的第i(1<=i<=a.length())个字符和b的第i个字符比较,if(a.length==b.length&&a[i]==b[i])(1<=i<=a.length())则返回true

public class TestEquals
{
public static void main(String[] args)
{
String tail="java String";
String a="hello "+"java String";
String b="hello "+tail;
String c="hello java String";

System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);

System.out.println("a=b "+(a==b));
System.out.println("a=c "+(a==c));
System.out.println("a.equals(b) "+a.equals(b));
System.out.println("a.equals(c) "+a.equals(c));
}
}
输出:
a=hello java String
b=hello java String
c=hello java String
a=b false
a=c true
a.equals(b) true
a.equals(c) true

String类型在用常量进行初始化时(例如a)在编译期间只开辟一次内存空间,以后如果有String c="hello java String"这样的语句,都不会再分配内存空间,而是让c指向a指向的内存区域,即
a和c是同一个对象的两个引用,不管怎么比较都是true!

而String b="hello "+tail;不是用常量进行初始化的,编译期间没有上面的内存限定,所以会重新开辟一块地址,存放"hello java String",因此==返回false,equals()返回true

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧