浅谈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浏览器(操 ...
随机推荐
- 如何利用Python绘制一个爱心
刚学习Python几周,闲来无事,突然想尝试画一个爱心,步骤如下: 打开界面 打开Python shell界面,具体是Python语言的IDLE软件脚本. 2.建立脚本 单击左上角’File’,再单击 ...
- APP间传递消息
https://www.jianshu.com/p/d640ccfcea5f 1: URL Scheme 常用的App间传值方式.常见于分享等. 2: Keychain 借助系统类 Keychain ...
- tomcat安装配置常见问题详解
历经波折,终于把tomcat装好了.记录下过程供自己和后来的初学者参考吧! 本文先后介绍了tomcat的下载安装方法.安装和启动不成功的常见原因 以及启动tomcat后如何配置上下文. 一.下载安装 ...
- grub覆盖mbr引导系统
grub覆盖mbr引导系统 0.个人PC,WIN 7 + Kali,easybcd 不起作用,需要制作 kali 安装盘 PS:推荐使用 universal usb installer 制作. 方案一 ...
- WKWebView 里 JS 和 native 通信的例子
native 端 初始化 wkwebview,设置 message handler webView = WKWebView.init() let usecc = self.webView.config ...
- 【bzoj2422】 Times 前缀和
本来想练一下树状数组的,看到网上某人的blog后点了进来. 第一眼发现不会,出去上了个厕所发现离散化后不是一道简单前缀和题吗. 考虑到每一个人出现且仅出现一次,且出现的时间是在一个连续的区间内. 那么 ...
- Android 开发工具类 30_sendXML
String xml = "<?xml version=\"1.0" encoding=\"UTF-8"?> <persons> ...
- 关于符号Symbol第二篇
来看一下继承自Symbol的具体实现类. 1.TypeSymbol /** A class for type symbols. * Type variables are represented by ...
- Nginx的几个常用配置和技巧
文章列举了几个Nginx常见的,实用的,有趣的配置,希望看过之后能说一句:学到了! 一个站点配置多个域名 server { listen 80; server_name ops-coffee.cn b ...
- Python中文分词 jieba
三种分词模式与一个参数 以下代码主要来自于jieba的github,你可以在github下载该源码 import jieba seg_list = jieba.cut("我来到北京清华大学& ...