Java中的equals和==的差别 以及Java中等价性和同一性的讨论
==对基本数据类型比较的是值,对引用类型比较的是地址
equals()比较的是对象的数据的引用
等价性原理:
- 自反性 x.equals(x)为true
- 对称性 x.equals(y) 为true时,y.equals(x) 也为true
- 传递性 若x.equals(y) 为true , y.equals(z) 为true, 则x.equals(z) 为true
- 一致性 在未修改x,y的值的情况下x.equals(y)始终是相同的值
- 非空性 x.equals(null) 总是 false
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=3;
int m=3;
String str1 = "hello";//"hello"存在于常量池,str1,str2都指向该常量池
String str2 = "hello";
System.out.println("基本数据类型的 == 判定:"+(n==m)); //判断数据
System.out.println("引用数据类型的 == 判定"+(str1==str2));//判断地址
String str3 = new String("hello");//"hello"存在于堆的对象内存区,非常量区
String str4 = new String("hello");
System.out.println("对象的 == 判定:"+(str3 == str4)); //判断地址
System.out.println("对象的 equals() 判定"+str3.equals(str4));//判断数据
str4 = str3;
System.out.println("对象赋值后的 == 判定"+( str3 == str4 ) );
System.out.println("对象的 equals() 判定"+str3.equals(str4));
}
}
结果如下:
基本数据类型的 == 判定:true
引用数据类型的 == 判定true
对象的 == 判定:false
对象的 equals() 判定true
对象赋值后的 == 判定true
对象的 equals() 判定true
public class practice5 {
public static void main(String[] args) {
Dog spot = new Dog();
Dog scruffy = new Dog();
Dog spot1 = new Dog();
Dog spot2 = new Dog();
spot.setNameString("spot");
scruffy.setNameString("scruffy");
spot.setSayString("Ruff!");
scruffy.setSayString("Wurf!");
spot2.setNameString("spot");
spot2.setSayString("Ruff!");
spot1=spot;
System.out.println(spot.getNameString()+"\t"+spot.getSayString());
System.out.println(scruffy.getNameString()+"\t"+scruffy.getSayString());
System.out.println("spot1==spot\t"+(spot1==spot));
System.out.println("spot1.equals(spot)\t"+spot1.equals(spot));
System.out.println("spot2==spot\t"+(spot2==spot));
System.out.println("spot2.equals(spot)\t"+spot2.equals(spot));
System.out.println("spot2.nameString==spot.nameString\t"+(spot2.nameString==spot.nameString));
System.out.println("spot2.nameString.equals(spot.nameString)\t"+spot2.nameString.equals(spot.nameString));
}
}
class Dog{
String nameString;
String sayString;
public String getNameString() {
return nameString;
}
public void setNameString(String nameString) {
this.nameString = nameString;
}
public String getSayString() {
return sayString;
}
public void setSayString(String sayString) {
this.sayString = sayString;
}
}
结果
spot Ruff!
scruffy Wurf!
spot1==spot true
spot1.equals(spot) true
spot2==spot false
spot2.equals(spot) false
spot2.nameString==spot.nameString true
spot2.nameString.equals(spot.nameString) true
Java中的equals和==的差别 以及Java中等价性和同一性的讨论的更多相关文章
- String类型中 "=="和"equals"比较的差别
String类型中 "=="和"equals"比较的差别 先说明一下String类型的变量的创建方式 在创建新的String类型的变量时,首先会在缓冲区查找是否 ...
- 沉淀再出发:java中的equals()辨析
沉淀再出发:java中的equals()辨析 一.前言 关于java中的equals,我们可能非常奇怪,在Object中定义了这个函数,其他的很多类中都重载了它,导致了我们对于辨析其中的内涵有了混淆, ...
- java中的 equals 与 ==
Java中的"=="永远比较的是两个对象是否是同一个对象(引用指向同一块内存就是同一个对象) Java中equals() 在使用必须与类挂上钩,不能单独使用.有的人这样理解&quo ...
- Java里的equals总结
前段时间一直在工作中使用Java,由于有一些C++功底,于是简单看了一下Java相关的语法便开始编写代码,结果在创建一个自定义类,并将自定义类放入ArrayList中,之后查找ArrayList是否有 ...
- Java中String推断相等equals与==的差别以及StringBuilder的equals
Java中String类型具有一个equals的方法能够用于推断两种字符串是否相等,可是这样的相等又与运算符==所推断的"相等"有所不同,接下来进行分析,结论由程序进行验证 Str ...
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- (转)浅谈Java中的equals和==
原文地址: http://www.cnblogs.com/dolphin0520/p/3592500.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new S ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
随机推荐
- linux 打开一个文件现swap文件
转自:http://blog.csdn.net/eckelwei/article/details/17078187 有时候在用vim打开文件时提示类似以下的信息: 发现交换文件 ".expo ...
- 关于VUE调用父实例($parent) 根实例 中的数据和方法
this.$parent或者 this.$root 在子组件中判断this.$parent获取的实例是不是父组件的实例 在子组件中console.log(this.$parent) 在父组件中con ...
- Spring Bean 定义继承
本例子源于:W3CSchool,在此作记录 bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等. 子 bean 的定义继承父定义的配置 ...
- Android AndFix修复方式的限制
这里阅览了很多网上关于修复的资料,一一贴在这里便于查看: https://github.com/alibaba/AndFix 这是官方处 要了解使用,一定得看看这里. http://www.jia ...
- 从classloader的变更说起
classloader从1.6到1.7整体分成了两个版本.重点区别就是并行类加载. 1.6版本 protected synchronized Class loadClass(String name, ...
- 用C#二次封装虹软arcface
相信很多用C#又想用虹软的SDK的童鞋要花很多心思去研究怎么转换,所以写了一篇文章和一个demo方便用C#的童鞋方便调用虹软的接口,文章的地址是:https://blog.xgcos.com/show ...
- Codeforces 1062 E - Company
E - Company 思路: 首先,求出每个点的dfs序 然后求一些点的公共lca, 就是求lca(u, v), 其中u是dfs序最大的点, v是dfs序最小的大点 证明: 假设o是这些点的公共lc ...
- 安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消?
安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消? 安装xmlspy之后,大部分的链接就会用这个软件打开,比较糟心.所以尝试很多的方法,终于解决了. (1)打开控制面板,找到默认程序: ( ...
- MySQL utf8 和 utf8mb4 的区别
utf-8 时变化长度的编码,储存一个code point 需要1~4个字节. 然而,mysql的utf8只存储最多3个字节per code point. 所以,utf8字符集不能存储所有的unico ...
- English trip V1 - B 23. Nosy People 爱管闲事的人 Teacher:Parice Key: Be + Ving
In this lesson you will learn to talk about what happened. 谈论发生什么? 课上内容(Lesson) Nosy 好管闲事Noise 噪声 ...