java中equals()和==的区别
java中的数据类型
基础数据类型
基础数据类型有byte、short、char、int、long、float、double、bool、String。除了 String 会比较地址,其它的基础类型的比较,使用 == 和 equals() 两者都是比较值。
String类的equals()方法源码
public boolean equals(Object anObject) {
if (this == anObject) { //先比较地址,如果相同直接返回true
return true;
}
if (anObject instanceof String) {//如果地址不相同,判断要比较的对象是不是String实例,如果不是直接返回false
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {//比较两个对象的长度,如果不相等直接返回false
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
//比较两个string对象的每个字符,如果都相等,就返回true,有一个不相等就返回false
return true;
}
}
return false;
}查看源码可知,String 类型的 equals 方法既会比较地址,也会比较字符串的每个字符(值).
String类型的equals()比较
public class Main {
public static void main(String[] args) {
String name1 = new String("123");
String name2 = new String("123");
System.out.println(name1 == name2);//false
System.out.println(name1.equals(name2));//true
}
}结果分析: name1 和 name2 是 String 的两个不同实例,name1==name2 是比较 name1 与 name2 的地址,所以返回 false。而 name1.equals(name2) 先是比较两者的地址,发现不同后接着比较两者的值,相同,所以返回 true。
复合数据类型(类)
Object类中equals()方法源码
public boolean equals(Object obj) {
return (this == obj);
}查看源码可知,当自己定义的类如果不重写 Object 类中 equals() 方法时,调用 equals() 方法其实和直接用 == 判断的效果一样。
未重写时
public class Person {
private String name; public Person(String name) {
this.setName(name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}Person.java
public class Test {
public static void main(String[] args) {
Person person1 = new Person("zze");
Person person2 = new Person("zze");
System.out.println(person1 == person2);//false
System.out.println(person1.equals(person2));//false
}
}重写时
public class Person {
private String name; public Person(String name) {
this.setName(name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object obj) {
if(obj instanceof Person){
return this.name==((Person) obj).name;
}
return false;
}
}Person.java
public class Test {
public static void main(String[] args) {
Person person1 = new Person("zze");
Person person2 = new Person("zze");
System.out.println(person1 == person2);//false
System.out.println(person1.equals(person2));//true
}
}
结论
首先,基本数据类型与复合数据类型在内存中存储的的方式是不同的:
- 基本数据类型在栈中存储的是值。
- 复合数据类型在栈中存储的是地址,来指向堆内存的实例。
可以这样理解:使用 == 比较的时候都是比较变量中存储的值,但基础类型的变量中存储的值就是实际值,而复合数据类型变量中存储的值是指向堆对象的引用地址。而 equals() 方法就是一个依赖于 == 实现普通函数,只不过它的实现是在所有对象的基类 (Object) 中.
java中equals()和==的区别的更多相关文章
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- java中.equals和==的区别?
Java中的equals是十分重要的,和= =要区别开来,孙卫琴的JAVA面向对象编程一书对这个做了阐述,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式 ...
- (转)Java中equals和==的区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号( ...
- Java 中 Equals和==的区别(转)
另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...
- Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?
首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...
- java中equals和==的区别详解
java中的数据类型,可分为两类: 1.基本数据类型. byte,short,char,int,long,float,double,boolean这八大原始数据类型他们之间的比较,使用“==”,比较的 ...
- java中equals和"=="的区别
"=="号,它比较的是一个对象在内存中的地址值, 比如2个字符串对象String s1 = new String("str");String s2 = new ...
- Java中equals和“==””的区别,String特殊
public class TestString { /* * java中的数据类型,可分为两类: * 1.基本数据类型,也称为原始数据类型.byte,short,char,int,long,float ...
随机推荐
- jQuery(三) javascript跨域问题(JSONP解决)
加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...
- ES容易忽视的集群配置
一 前言 目前生产系统由Solr转ES了,在这边就记录下在使用过程中容易忽视的配置吧,其实我也是才用,如果有什么错误的地方,多指正. 二.配置 1.ES的段合并是限速设置 默认是20MB/s ,如果是 ...
- 【转】JAVA反射与注解
转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...
- hdoj:2053
#include <iostream> #include <string> #include <vector> using namespace std; /* 无穷 ...
- 群晖搭建webssh
拷贝工程到系统根,然后需要赋予权限 sudo chmod 777 -R WebSSH2/ git clone https://github.com/zhaocundang/WebSSH2.git de ...
- SwipeToLoadLayout
SwipeToLoadLayout SwipeToLoadLayout is a reusable pull-to-refresh and pull-to-load-more widget. Supp ...
- opencv利用Cascade Classifier训练人脸检测器
opencv默认提供了haar特征和lbp特征训练的人脸分类器,但是效果不太好,所以我们可以用opencv提供的跑opencv_traincascade函数来训练一个LBP特征的分类器.(由于open ...
- Easy UI combogrid动态加载数据
场景: datagrid的每一行允许编辑,一行中有一个字段,编辑时,提供下拉框选项,供选择. 下拉框选项有多个列.如下图所示:(点击红框内的下拉按钮,会弹出绿框内的内容) 要求: 每行弹出的下拉框内容 ...
- Dynamic attention in tensorflow
新代码在contrib\seq2seq\python\ops\attention_decoder_fn.py 和之前代码相比 不再采用conv的方式来计算乘,直接使用乘法和linear 给出了两种at ...
- Git-简单的利用SourceTree提交代码(转载)
http://www.cnblogs.com/shenyangxiaohuo/p/5239723.html