浅谈equals和==
在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗?
首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现就是==;
public boolean equals(Object obj) {
return (this == obj);
}
如果是比较两个Object对象的大小,直接用==就可以了。
==
1、判断比较的两个对象是否是同一个对象,内存地址是否相同。
2、比较的两个对象必须是同一类型的数据,否则编译不通过。
3、如果是数字的比较,比较的是数值是否相等:
equals
1、equals用来比较的是两个对象的内容是否相等,
2、由于所有的类都是Object类的子类,如果一个类没有对该方法进行覆盖的话,在使用该方法时会调用Object类中的方法。
当我们用new创建一个对象的时候,会开辟一个新的地址,所以用==作比较时,回返回false。但是String重写了Object的equals方法,当创建两个相同值的String对象时,调用equals方法返回true。String类也比较特殊,它可以直接赋值产生对象,在比较两个String对象的时候,如果String对象都是直接赋值产生的,它们用==作比较的时候,就会返回true。例如:String s1 = “abc”,因为String是引用类型,s1中只是存放了地址,而值不是new出来的,被系统存放在常量池中,而不是在存放在堆中,这时候再创建一个s2=“abc”,因为同样是要放在常量池中,创建s2时发现常量池中已经存在同样的数据,直接把s2指向了该数据,所以s1和s2指向同一块地址。
String类重写的equals方法如下:
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;
}
对String的验证代码如下所示:
public static void main(String[] args) {
String s1,s2,s3,s4,s5;
s1=new String("we are students");
s2="we are students";
s3=new String("we are students");
s4=new String(s1);
s5 = "we are students";
System.out.println(s1.equals(s2));
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1.equals(s4));
System.out.println(s1==s4);
System.out.println(s2==s5);
}
输出结果如下所示:
true
false
false
true
false
true
如果是我们自己写的类,要按照属性比较两个对象是否相等时,需要重写equals方法,否则会直接调用Object的方法,判断两个对象的地址是否相等。
另外,"=="比"equals"的运行速度快,因为"=="只是比较引用的地址。
浅谈equals和==的更多相关文章
- 浅谈 equals 和 == 的区别
在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String(&qu ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 【转】浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈sql 、linq、lambda 查询语句的区别
浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC八大类扩展(上篇)
lASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操 ...
随机推荐
- Java基础学习篇---------封装
一.类和对象分配内存 二.Java中的内部类 : 可以直接去访问外部类的所有属性(包括私有成员) 1.Java中成员内部类 (1).内部类的方法可以直接访问外部类的类中的所有成员变量 (2).外部类 ...
- python爬虫1——获取网站源代码(豆瓣图书top250信息)
# -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...
- C# 证书打印《六》
整理思路,从新出发. 加载模版 public void loadtemplate(Label lable) { string p_tempateFile = @"fomate.xml&quo ...
- FlexMonkey实战
文章来源:http://www.cnblogs.com/raol/p/flexmonkey.html 我的有道云笔记:http://note.youdao.com/share/?id=22b79669 ...
- 将url动态转换成二维码插件 - 兼容IE8
插件地址 http://static.runoob.com/assets/qrcode/qrcode.min.js ,网页直接打开,然后ctrl+s保存到本地. <!DOCTYPE html& ...
- OpenCV --- 实现两幅图像并排合并(ROI)
Mat img1 = imread("1.png"); Mat img2 = imread("2.png"); int height = img1.rows; ...
- POJ 2371
#include<iostream> #include<stdio.h> #include<string> using namespace std; int com ...
- java --Method
MethodDemo class MethodDemo { public static void main(String[] args) { //调用自定义的方法. draw(4,5); draw(8 ...
- Numpy 数组的切片操作
实例+解释如下(表格):关键是要明白python中数组的下标体系.一套从左往右,一套从右往左. 1 import numpy as np 2 import sys 3 4 def main(): 5 ...
- android权限permission大全(权限提醒)
1.Android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写 ...