equals()和==的区别
这个问题,总是记不住,那我就动手多写几遍,加强自己的记忆。
先给结论:
1)==。主要作用于基本数据类型的变量,比较的是二者的 “值”是否相等;如果作用于两个对象之间,则比较的是对象的地址是否相同。
2)对于equals方法。注意:equals方法不能作用于基本数据类型的变量,如果你创建的对象没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
下面我就来详细的解释。
==,就多说了,基本类型比较就用==,对象比较记得用equlas()方法。
equlas()方法是怎么比较的呢,最好的办法就是去看源码,
Object类的equlas()
public boolean equals(Object obj) {
return (this == obj);
}
从equlas可以看出,用的是==比较,也就是比较两个对象的地址是否一致。如果我们创建对象没有改写equals()方法的话,则你创建的对象继承Object类的equlas()方法,比较的就是对象的地址。但是如果你相比较某个类的两个对象是否相等,那你就可以改写equlas方法。比如String类。
String类的equlas()源码:
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) {
//逐个比较两个字符串字符是不是一样的,这也是为什么String的
euqlas()方法比较的是内容。
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
既然说到这了,那就顺便整理下String这类的重点:
问题:
1.为什么说String对象是不可变?
其实,你传入的字符串在String对象里都是以字符数组保存的,而且字符数组是以final修饰的。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
2.String a = “abc”和String b = new String(“abc”)区别?
当你new创建String对象的时候,其实是创建两个对象,一个是在堆上的,一个是在常量池里的。而a指向的就是常量池了的对象,b指向的是堆上的对象。
String a = new String("abc");
String b = new String("abc");
String c = "abc";
String d = "abc";
System.out.println(a==b)//fasle堆上的两个对象
System.out.println(a.euqals(b))//true String的equals()比较的是值
System.out.println(c==d)//true 他们都是指向常量池里的那个唯一对象
System.out.println(c.euqals(d))//true 同一个对象,肯定的。
equals()和==的区别的更多相关文章
- java equals和==的区别
大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...
- equals与==的区别
equals与==的区别. 下面是equals的源码 public boolean equals(Object anObject) { if (this == anObject) { //如果两个对象 ...
- equals和==的区别 你真的掌握了吗?
PS:最近读Java编程思想的时候发现了一些小问题.就是equals方法和==,感觉自己是真正掌握了,其实并没有.简单的记录一下. 学习内容: 1.equals 和 == 的区别 equals和== ...
- 【ASP.net】Equals 和 == 的区别
在比较Equals 和 ==的区别前.我们先来了解下相关的知识 C#数据类型 1.值类型 值类型有: 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元. ...
- 【java】由equals和==的区别引出的常量池知识
equals和==的区别,百度查到的结果大都是:equals比较的是值,==比较的是引用地址. String str1 = "abc"; String str2 = "a ...
- 比较compareTo与equals及==的区别
1.compareTo: 附上:源码: public int compareTo(String anotherString) { int len1 = value.length; ...
- Java笔记——equals和==的区别
摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- equals()和hashCode()区别?
equals()和hashCode()区别? ------------------------------------------------- equals():反映的是对象或变量具体的值,即两个对 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
随机推荐
- python学习之while循环
Python While 循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语 ...
- pyqt5 在qt designer后以弹窗的方式连接多个UI图形界面
当我们通过pyqt开发时,eric6为我们提供了一个方便的工具:图形化的绘制UI工具--qt designer. 我们可以通过它开发多个UI,然后利用信号-槽工具,将功能代码附着在上面.也可以将多个界 ...
- 【Spring】关于SpringMvc监听的知识点
一,在使用Spring系列框架时,我们需要在Web.xml配置Spring的监听:ContextLoaderListener ContextLoaderListener的作用就是,在Web容器初始化时 ...
- [node] node 版本更新
一. 命令 node -v sudo npm cache clean -f // 清除缓存 sudo npm install -g n // 安装Node 模块 sudo n stable // 升级 ...
- vscode 开发.net core 从安装到部署 教程详解
一:环境准备: windows系统需要 win7 sp1 / windows 8 / windows 2008 r2 sp1 / windows10: 其他版本的windows系统在安装.NET C ...
- 主流页面编辑器比对:TinyMCE VS FCKeditor
开发中先用的是 FCKeditor 编辑器,感觉页面展示的东西太繁琐,所以换了 TinyMCE 编辑器. 为了方便理解,本文不采用穿插比对 先看 FCKeditor : 1.jsp :结束标签不能贴着 ...
- 解决删除元素动画的bug
效果说明 首先说明一下我需要做到的效果 其实很简单---点击删除按钮的时候,加入删除动画 删除动画是这样的,高度和宽度都会均匀的变小,内部的元素需要被隐藏(因为会有文字挤在一起):直到变为0结束,时长 ...
- Redux源码分析之applyMiddleware
Redux源码分析之基本概念 Redux源码分析之createStore Redux源码分析之bindActionCreators Redux源码分析之combineReducers Redux源码分 ...
- [补档]暑假集训D8总结
%dalao 今天有两位大佬来讲课,meaty来讲了Catalan(本来说好的莫比乌斯反演呢),聪聪来讲Splay呢 至于听课笔记= =,没来得及记= = 不过好不想上树啊,上了树就下不来了 考试 仍 ...
- Hibernate与 MyBatis的比较(转)
第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀 ...