==与equals的却别的一个小问题

纳兰轻歌 2008-04-29 04:23:50

public class test {


public static void main(String args[]){
String a = "abc";
String b = "abc";
if (a==b){
System.out.println("a==b");
}
if (a.equals(b)){
System.out.println("a equals b");
}
}
}
为什么我的程序输出结果是
a==b
a equals b
a和b的地址也相同么?
==和equals的区别到底是什么
...全文
77 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
milo-higgs 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 numen_wlm 的回复:]
这里有一个常量池的概念:
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
String a = "abc";
String b = "abc";
首先,要知道Java会确保一个字符串常量只有一个拷贝,例子中的a和b中的"abc"都是字符串常量,
它们在编译期就被确定了,当已经定义了一个字符串常量"abc"的时候,如果再定义一个"abc"常量的时候,java会…
[/Quote]

呵呵,说的很详细
numen_wlm 2008-04-29
  • 打赏
  • 举报
回复
这里有一个常量池的概念:
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
String a = "abc";
String b = "abc";
首先,要知道Java会确保一个字符串常量只有一个拷贝,例子中的a和b中的"abc"都是字符串常量,
它们在编译期就被确定了,当已经定义了一个字符串常量"abc"的时候,如果再定义一个"abc"常量的时候,java会
自动直接引用常量池中已经定义的那个字符串常量,也就是说此时a和b实际上指向的是同一个引用,也就是为什么a==b会成立的原因,
当然,二者的引用相同那么a.equals(b)也必然成立了。
如果用new String() 创建的字符串那么就不是常量,不能在编译期就确定,所以new String()
创建的字符串不放入常量池中,它们有自己的地址空间,如果此时再用a==b的话,那么肯定是不成立的.
milo-higgs 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 anqini 的回复:]
Java codepublicclasstest {publicstaticvoidmain(String args[]){
String a="abc";
String b="abc";if(a==b){//比较的是引用地址!因为a和b指向同一个对象,所以相等System.out.println("a==b");
}if(a.equals(b)){//String类重写了从Object继承过来的equals方法,重写为比较他们的内容!System.out.println("a equals b");
}
}
}
[/Quote]

不是引用地址的,而是当作基本类型来处理的,不是字符串相同,地址就相同的。

java里面处理String a="abc"; 这样的字符串就是作为基本类型的,和String a= new String("abc");是截然不同的。
anqini 2008-04-29
  • 打赏
  • 举报
回复

public class test {


public static void main(String args[]){
String a = "abc";
String b = "abc";
if (a==b){ //比较的是引用地址!因为a和b指向同一个对象,所以相等
System.out.println("a==b");
}
if (a.equals(b)){ //String类重写了从Object继承过来的equals方法,重写为比较他们的内容!
System.out.println("a equals b");
}
}
}
key_hua 2008-04-29
  • 打赏
  • 举报
回复
老问题,自己看书
milo-higgs 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fuyou001 的回复:]
System.out.println("a equals b"); 这个也要写成这样:System.out.println(a.equals(b));
[/Quote]

不是吧,lz只是向输出表示a和b的内容相等
fuyou001 2008-04-29
  • 打赏
  • 举报
回复
System.out.println("a equals b"); 这个也要写成这样:System.out.println(a.equals(b));
fuyou001 2008-04-29
  • 打赏
  • 举报
回复
System.out.println("a==b");你这是输出字符串
这样就好了System.out.println(a==b);
你程序这样,地址是一样的!
==比较内在地址,
equals比较字符串的内容
milo-higgs 2008-04-29
  • 打赏
  • 举报
回复
==比较的是引用的地址。但是如果是String类型的话,java就不把它当作引用,而是当作基本类型来处理的。所以说两个都会有输出的。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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