class A
{
int a=1;
}
public class p142
{
public static void main(String args[])
{
A obj1=new A();
A obj2=new A();
String s1,s2,s3="abc",s4="abc";
s1=new String("abc");
s2=new String("abc");
System.out.println("s1.equals(s2)是"+(s1.equals(s2)));
System.out.println("s1==s3是"+(s1==s3));
System.out.println("s1.equals(s3)是"+(s1.equals(s3)));
System.out.println("s3==s4是"+(s3==s4)); //我觉得s3!=s4,因为不是指向同一首地址
System.out.println("s2.equals(s3)是"+(s2.equals(s3)));
System.out.println("s1==s2是"+(s1==s2));
System.out.println("obj1==obj2是"+(obj1==obj2));
System.out.println("obj1.equals(obj2)是"+(obj1.equals(obj2))); //这里我觉得
//应该是相同的吧,内容一样啊/
obj1=obj2;
System.out.println("obj1=obj2后obj==obj2是"+(obj1==obj2));
System.out.println("obj1=obj2后obj1.equals(obj2)是"+(obj1.equals(obj2)));
}
}
{
int a=1;
}
public class p142
{
public static void main(String args[])
{
A obj1=new A();
A obj2=new A();
String s1,s2,s3="abc",s4="abc";
s1=new String("abc");
s2=new String("abc");
System.out.println("s1.equals(s2)是"+(s1.equals(s2)));
System.out.println("s1==s3是"+(s1==s3));
System.out.println("s1.equals(s3)是"+(s1.equals(s3)));
System.out.println("s3==s4是"+(s3==s4)); //我觉得s3!=s4,因为不是指向同一首地址
System.out.println("s2.equals(s3)是"+(s2.equals(s3)));
System.out.println("s1==s2是"+(s1==s2));
System.out.println("obj1==obj2是"+(obj1==obj2));
System.out.println("obj1.equals(obj2)是"+(obj1.equals(obj2))); //这里我觉得
//应该是相同的吧,内容一样啊/
obj1=obj2;
System.out.println("obj1=obj2后obj==obj2是"+(obj1==obj2));
System.out.println("obj1=obj2后obj1.equals(obj2)是"+(obj1.equals(obj2)));
}
}
無語...
就是個引用對象和地址的區別,沒必要搞這么大陣仗吧?
除非你重写 public boolean equals(Object obj) {
return (this == obj);
}
上面是Object中equals方法,可以看到如果你不在A中重写这个方法就会默认按照地址比较
2.对于一般的对象,如果其类自己没有实现equals的话,一般是使用地址去比较的,也就是说此时是和==一样,都是用内存地址去比较,所以自己的类,一般要想比较内容是否一样就要自己实现equals方法你这里,s3,s4是一样内容的string,所以用==或equals都可以,记住,string是特殊的,且一般时候用equals最保险,所以这里它们相等
obj1和obj2的类是没有自己实现equals的,所以它采用了Object类的equals方法,而这种方式是只比较内存地址的,所以它们不等,可以参考string实现自己的equals
equals,指判断两个相同的对象(同一个类),不一定在heap中是同一个。
对象类型 == 指的是对象地址相同.
equals() 方法对于对象类型用户可以重写.
这样赋值的String 对象 在java里面会先去查看一个存放String的常量池空间
如果已经创建了相同的对象 ,则不再重复创建,直接指向常量池中的那个已经存在对象
s3 已经在常量池中创建了,所以s4也指向s3的那个对象
equals方法是Object的方法 默认是按照内存地址比较,当自定义类时,除非你重写equals;
上面是Object中equals方法,可以看到你没有在A中重写这个方法
就会默认按照地址比较
equals比较的是内容。
s2=new String("abc");明白了,没看到这两句
楼主,相信您能在我这里得到满意的答案...请看:
1:对于操作符 "=="和"equals",如果指向的是同一个对象,那么,返回"true"
例外原则:
对于一些覆盖了方法equals()的类(File,java.util.Date,String,八个包装类),只要比较的对象类型,内容相同
那么返回的就是"true".
而String类重写了equals()方法,如:c.equals("hello"),它是按字符序列逐个比较,如果所有字符都相等,则返回true,否则返回false
package cn;public class ttt {
int i;
String tt;
public static void main(String[] args )
{
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println("n1 and n2 "+n1.equals(n2));
String c1 = "kkk";
String c2 = "kkk";
System.out.println("c1 and c2 "+c1.equals(c2));
System.out.println("c1 and c2 "+(c1 == c2));
ttt a1 = new ttt();
ttt a2 = new ttt();
a1.i = 1;
a2.i = 1;
a1.tt = "sss";
a2.tt = "sss";
System.out.println("a1 equsls a2 "+a1.equals(a2));
//对于自定义的类,equals采用的是==的比较方法,比较地址
System.out.println(a1.i == a2.i);
System.out.println(a1.tt == a2.tt);//变量指向同一地址
}
}n1 and n2 true
c1 and c2 true
c1 and c2 true
a1 equsls a2 false
true
true
我也写了一个,可供参考