equals() 万物为对象?

langzi606 2007-09-12 10:25:42
public class Dog
{
String name;
String says;
public static void main (String [] arg){
Dog D1 = new Dog();
Dog D2 = new Dog();
D1.name = "spot";
D1.says = "Ruff!";
D2.name = "scruffy";
D2.says = "wurf!";
System.out.println("D1.name:" + D1.name);
System.out.println("D1.says:" + D1.says);
System.out.println("D2.name:" + D2.name);
System.out.println("D2.says:" + D2.says);
System.out.println(D1.name == D2.name);
System.out.println(D1.name.equals(D2.name));
System.out.println(D1.says == D2.says);
System.out.println(D1.says.equals(D2.says));
}
};

按照API中:
equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
这样的话,那么
System.out.println(D1.name.equals(D2.name));的D1.name属性和D2.Name属性也是被看作对象来使用的?
这样说来的话,那么JAVA中真的到处是对象了。

PS:我也没搞清楚我在说什么。。迷糊了。。因为think in java 中说到。一切都是对象。。。
...全文
219 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
langzi606 2007-09-13
  • 打赏
  • 举报
回复
D1.name属性和D2.Name属性 是String类型 当然是对象
没注意 这一点,谢谢大家。。。。。可惜分放少了。。。别介意啊。
  • 打赏
  • 举报
回复
to: xietingyan

好好玩哦~~又没有人怪你的,不要自责啦 o(∩_∩)o
KingNE 2007-09-13
  • 打赏
  • 举报
回复
equlas.()比的是内容!
xietingyan 2007-09-13
  • 打赏
  • 举报
回复
楼上的众人们,我错了
我忘记了String 是特殊的了
String s1 = "123" 和String s2 = "123" 是同一个对象
String s1 = New String("123")和String s2 = New String("123")则不是。。。
饶了我吧 我也是好心....
mailtzy1 2007-09-13
  • 打赏
  • 举报
回复

初学 Java 有段时间了,感觉似乎开始入了门,有了点儿感觉
但是发现很多困惑和疑问而且均来自于最基础的知识
折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟

大家先来看看一段奇怪的程序:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
}
}
这个程序真是简单啊!可是有什么问题呢?

1. 来自 String 的忧虑
上面这段程序中,到底有几个对象呢?
可能很多人脱口而出:两个,s1 和 s2
为什么?
String 是 final 类,它的值不可变。
看起来似乎很有道理,那么来检测一下吧,稍微改动一下程序
就可以看到结果了:

public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
呵呵,很多人都会说已经不止两个对象了
编译并运行程序,输出:s1 == s2
啊!
为什么 s1 == s2 ?
== 分明是在说:s1 与 s2 引用同一个 String 对象 -- "Monday"!

2. 千变万化的 String
再稍微改动一下程序,会有更奇怪的发现:
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else
System.out.println("s1 not equals s2");
}
}
我们将 s2 用 new 操作符创建
程序输出:
s1 != s2
s1 equals s2
嗯,很明显嘛
s1 s2分别引用了两个"Monday"String对象
可是为什么两段程序不一样呢?

3. 在 String 的游泳池中游泳
哈哈,翻了翻书终于找到了答案:
原来,程序在运行的时候会创建一个字符串缓冲池
当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会
在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被
放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将 s2 引用 s1 所引用的对象"Monday"

第二段程序中,使用了 new 操作符,他明白的告诉程序:
“我要一个新的!不要旧的!”与是一个新的"Monday"Sting对象被创
建在内存中。他们的值相同,但是位置不同,一个在池中游泳
一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?
  • 打赏
  • 举报
回复
String s1 = "123"; String s2 = "123";

s1==s2 时返回的 true,因为它们的值是存放在常量池中的,在池中如有该值就引用这个值,没有的话,再在常量池中新建一个。所以对于 String 而言它们的指针地址是相等的。
amazeur 2007-09-13
  • 打赏
  • 举报
回复
up
Davis129 2007-09-13
  • 打赏
  • 举报
回复
D1.name属性和D2.Name属性 是String类型 当然是对象
不过java中也保留这int,double等简单类型 他们不是对象 这是为了方便我们原本思维 他们做做的事完全可以用他们的封装类型来实现
jdk1.5以后 已支持简单类型到其封装类型的自动转换

一切都是对象 这是一种思维方式 是面向对象的一种思维方式 他把一切封装在对象里来实现 不必太装牛角尖
mailtzy1 2007-09-13
  • 打赏
  • 举报
回复
String s1 = "123"; String s2 = "123";
System.out.println(s1 == s2);

会打印true的
Davis129 2007-09-13
  • 打赏
  • 举报
回复
s1="123"
s2="123"
"123"是同一个对象 s1 s2是对他的引用 s1==s2为true
java 专门开辟了字符串存储区 不会为相同的"xxx"开辟新的空间
所以两个"123"具有同一个地址 是同一个对象
Zero2One 2007-09-13
  • 打赏
  • 举报
回复
那么 == 与 equals()的区别在哪里呢?当你这样做 String s1 = "123"; String s2 = "123";你想比较两个字符串是否相等,那很理所当然的你使用了==, 判断 s1 == s2 的结果?结果是什么呢,true?当然不是,为什么不是,前面说了它们都是引用类型,保存的都是地址,那么除非他们两个对象指向同一个地址那么s1 == s2的结果就是true了,在这里,他们指向同一个地址吗?不是的,这里创建了两个字符串对象,他们两个的地址当然不会相同,所以是false,那么我们要怎么判断两个字符串是否相同呢?
——————————————————————

楼上的你说的都对,非常的对,但是,我只是不明白String s1 = "123"; String s2 = "123";为什么不是同一个对象呢?
zxl_long 2007-09-13
  • 打赏
  • 举报
回复
equals()比较内容,==比较内存地址
foryourkiss 2007-09-13
  • 打赏
  • 举报
回复
实际上String在JAVA中就是类啊!
另外,在Object类中的equals方法的定义是这样子的:
public boolean equals(Object o)
{
return o==this;
}
这说明在这个方法是比较的引用变量是否相等,即二者是否引用同一个对象,
而在String 类中,equals方法被重写了,
包含了Object类中的定义,还包含了比较对象的内容是否相等!
xietingyan 2007-09-12
  • 打赏
  • 举报
回复
偶认为这个问题时这样的;java中的变量有两种,一种是基本的数据类型 比如int,double,float,char..其他的就属于引用类型。虾米是引用类型呢,好吧 你比较一下
(1)int x =2;
System.out.println(x);他会打印出2 是不是
(2)int[] y = {2};
System.out.println(y);你认为它会打印出什么呢,是2吗?不是,是一串数字,这串数字是什么呢?是地址,是y数组这个对象在虚拟机中的地址。所有的java对象都是用引用类型,比如String,数组阿什么的
那么 == 与 equals()的区别在哪里呢?当你这样做 String s1 = "123"; String s2 = "123";你想比较两个字符串是否相等,那很理所当然的你使用了==, 判断 s1 == s2 的结果?结果是什么呢,true?当然不是,为什么不是,前面说了它们都是引用类型,保存的都是地址,那么除非他们两个对象指向同一个地址那么s1 == s2的结果就是true了,在这里,他们指向同一个地址吗?不是的,这里创建了两个字符串对象,他们两个的地址当然不会相同,所以是false,那么我们要怎么判断两个字符串是否相同呢?用equals()方法, s1.equals(s2);他会依次比较两个字符串相应位置的字符是否相等。
如果你自己创建了对象,比如MyObject m1,m2 你要比较m1和m2是否相等,你需要覆盖实现equals()方法,如果你要判断m1是否和m2是同一个对象就用==

62,623

社区成员

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

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