在比较字符型数据时,==比较的是内存中的地址,比较的是对象的句柄;而equals()比较的是地址内的内容,比较的是对象.
解决方案 »
- 关于流关闭的一个问题
- Java怎么通过笔记本上的蓝牙与其他设备交互啊?
- 请问既然所有的类都是Object的子类, 为什么我的类无法使用Object的clone方法呢? protected的方法子类不是可以使用的吗?谢谢!
- 谁知道哪里有《爪哇夜未眠》的下载地址?? 很想看看这本书! 谢谢了!
- 我在Applet中创建了一个模态对话框,对话框显示时,只要点了对话框外面的东西,对话框跑浏览器后面去了。
- EditPlus能不能类似word那样调整行高啊?比如1.5倍行高,2倍行高等。
- 请问不用配置文件,如何在程序代码中直接配置LOG4J的各种配置啊?
- 第一次使用JCreator 为什么在其中录入的汉字显示的是乱码?怎么设置
- 有谁分发安装过JAVA客户端应用程序?比如,如何做安装程序?
- 急!!!如何求2次以上方根值
- 一个关于struts的简单问题(up有分)
- 怎么才能使用servlets ,apache和tomcat 怎么用?
public static void main(String[] args)
{
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
MyInt m1 = new MyInt();
MyInt m2 = new MyInt();
m1.value = 100;
m2.value = 100;
System.out.println("n1 == n2 : " + ( n1 == n2 ));
System.out.println("n1.equals(n2) : " + n1.equals(n2));
System.out.println("m1.equals(m2) : " + m1.equals(m2));
}
class MyInt
{
int value;
}
.equals()是Object的方法,可以理解为"相等"。显然两个object相等并不意味着相同;但是需要注意的是,也并不意味着他们对应内存区域的所有字节都相等,比如(但不限于这个原因)他们内部可能还有自己的引用。所以,两个对象是否相等,只有这个对象自己才知道如何判断,java并不知道。所以就需要该类自己提供一个equals方法
equals() 比较的东西是这个方法自己决定的,例如你自己重构它
一般情况下,java中的类是重构了它的,用来比较对象的内容。
注意,如果你的类不重构的话,equals() 的作用等同于 ==
String 的情况有点特殊,看下面这个例子:
class equals
{
public static void main(String[] args)
{
String a="java";
String b="java";
String c=new String("java");
String d=new String("java");
String ja="ja";
String va="va";
ja+=va;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==d);
System.out.println(ja==a);
System.out.println(ja==c); int[] a1={1,2,3,};
int[] b1={1,2,3,};
int[] c1=new int[3];
int[] d1=new int[3];
for (int n=0;n<3 ;n++ )
{
c1[n]=n+1;
d1[n]=n+1;
}
System.out.println(a1==b1);
System.out.println(a1==c1);
System.out.println(c1==d1);
}
}
如果String 在编译的时候就得到值的话,那么句柄指向的就是同一个对象。
这种情况对 数组 不适用
虽然鸟也来过了,但我还想再补点:equals()可以自己实现,但必须保证互反性原则,否则可能出问题(一般发生在使用集合类时)。在有些场合里,按自己的逻辑覆盖equals(),为使该类的对象作为Hashtable的key时达到唯一,还得按自己的逻辑覆盖hashCode()方法。
而==的比较分两种:一种是比较基本数据类型,例如int,那么比较的就是基本数据类型的值;
如果比较的是对象,例如String,那么比较的是两个句柄是否指向内存中的同一个对象。!
equals()是对象之间的比较,缺省(Object中)的是对象引用的比较,但是可以重载。
2:equals()和==在语义上是不同的,==是作为标识符嵌入到java语言的语法中,而equals()是作为一个类方法实现。java的指称语义,必须描述==,但是不用描述equals()方法。
equals()就不一定,虽然在大多数的条件下是
equals()比较的是 句柄的内容
==是数据类型和空值的相等:1==1, a==null;
经验之谈。不一定完全正确。
equals()方法在缺省条件下的含义同==一样,但是你可以对不同的类重载equals()方法类实现自己的相等定义,比如String类就重载了equals()类比较两个字符串的内容。
还有注意equals的参数是Object因此有可能传入的对象与你的类不同,因此在重载equals()方法是要检查类型,并作动态的“下溯造型”