Java 中equals 与 == 的 区别
2016-06-18 16:33
471 查看
先来看以下代码
public static void main(String args[]) {
int i1 = 1; int i2= 1;
char c1 = 'a'; char c2 = 'a';
String s1 = new String("Hello"); String s2 = new String("Hello");
System.out.println(i1 == i2);
System.out.println(c1 == c2);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
输出结果:
true
true
false
true
分析:
对于基础数据类型(boolean,byte,char,short,int,float,double,long),“==”比较的是他们的值。如i1和i2,c1和c2。
对于复合数据类型,“==”比较的是他们在内存中的存放地址。s1和s2虽然内容相同,但是他们指向的对象地址不同。
equals默认(Object类中)是比较对象的内存地址,但是一些类库中重写了equals方法,如:String、Integer和Date类,应该按照重写的方法进行比较。一般都是比较对象的内容
![](https://img-blog.csdn.net/20160618165901779?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
局部变量s1和s2是存放在栈内存中,而new出来的对象是放在堆内存中,s1和s2所指向的对象不同,地址不同,故s1==s2输出false,前面说equals方法默认也是比较地址,但为何输出true呢?因为:s1.equals(s2)处的equals不是Object类中的,而是String类中,String类中重写了Object类中的该方法,因此比较的是对象中的内容(Hello)。附上Object和String中equals方法源码:
//Object
public
boolean equals(Object obj) {
return (this == obj);
}
//String
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public static void main(String args[]) {
int i1 = 1; int i2= 1;
char c1 = 'a'; char c2 = 'a';
String s1 = new String("Hello"); String s2 = new String("Hello");
System.out.println(i1 == i2);
System.out.println(c1 == c2);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
输出结果:
true
true
false
true
分析:
对于基础数据类型(boolean,byte,char,short,int,float,double,long),“==”比较的是他们的值。如i1和i2,c1和c2。
对于复合数据类型,“==”比较的是他们在内存中的存放地址。s1和s2虽然内容相同,但是他们指向的对象地址不同。
equals默认(Object类中)是比较对象的内存地址,但是一些类库中重写了equals方法,如:String、Integer和Date类,应该按照重写的方法进行比较。一般都是比较对象的内容
局部变量s1和s2是存放在栈内存中,而new出来的对象是放在堆内存中,s1和s2所指向的对象不同,地址不同,故s1==s2输出false,前面说equals方法默认也是比较地址,但为何输出true呢?因为:s1.equals(s2)处的equals不是Object类中的,而是String类中,String类中重写了Object类中的该方法,因此比较的是对象中的内容(Hello)。附上Object和String中equals方法源码:
//Object
public
boolean equals(Object obj) {
return (this == obj);
}
//String
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序