java == 和equals()
==
== 是运算符
:可以使用在基本数据类型变量和引用数据类型变量当中
: 如果比较的是基本数据类型变量,比较两个变量保存的数据是否相等(不一定类型相同)
如果比较的是引用数据类型变量, 比较两个对象的地址值是否相等, 即两个引用是否指向同一个对象实体
int i = ;
int y = ;
System.out.println(i==y); // True TestEquals testOne = new TestEquals(,"laowang");
TestEquals testTwo = new TestEquals(,"laowang");
System.out.println(testOne==testTwo); //false 比较的是内存地址值都是两个对象了内存地址值肯定不同
equals()
equals()方法是Object类中所带有的 因为所有类都直接或间接的继承了Object类所以所有类有equals()
一: 是一个方法而非运算符
二: 只能适用于引用数据类型
三:Object类中的定义
public boolean equals(Object obj){
return (this==obj);
}
说明Object中equals()和==是相同的 判断
当比较的是引用数据类型时 == 和equals的作用是相同的
四: String Date, File,包装类都重写了根父类的equals()方法,重写之后比较的不是引用地址是否相同,而是比较的 两个对象的"实体内容"是否相同 五: 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相等.那么我们如果想比较两个对象的值的时候就要在类中重写equals()方法了
总结:
== 比的是地址值 equals() 比的是内容值 == 使用必须保证左右两边类型一致
Once类
public class Once {
String name = "老王";
int age = ;
public Once(String name, int age) {
this.name = name;
this.age = age;
}
public Once(){}
}
Tes类
public class Test {
String name = "老王";
int age = ;
}
TestEquals类
public class TestEquals {
public static void main(String [] args){
Once once = new Once();
Test test = new Test();
Once once1 = new Once("隔壁老王", );
Once once2 = new Once("隔壁老李", );
System.out.println(once.equals(test)); //false
System.out.println(once.name.equals(test.name)); // true String重写了 equals()方法
System.out.println(once1.equals(once2)); // false 因为引用数据类型的是对比所有的属性
}
}
重写equals
重写Test类中的equals方法
在Test类中重写 equals()
@Override
public boolean equals(Object object){
if(this == object){
return true;
}
if(object instanceof Test){
Test test = (Test) object; //强制转为相同类
// if(this.age == ((Test) object).age && this.name.equals(((Test) object).name)){ //因为基本数据类型必须用==
// return true;
// }else{
// return false;
// }
//上面也可以用着一段
//return (this.age == ((Test) object).age && this.name.equals(((Test) object).name));
return this.age == test.age && this.name.equals(test.name);
}
return false;
}
练习:
.编写Order类,有int型的orderId,String型的orderName,相应的 getter()和setter()方法,两个参数的构造器,重写父类的equals()方法: public boolean equals(Object obj),并判断测试类中创建的两个对象是否 相等。
.请根据以下代码自行定义能满足需要的MyDate类,在MyDate类中覆盖 equals方法,使其判断当两个MyDate类型对象的年月日都相同时,结果 为true,否则为false。 public boolean equals(Object o)
public class EqualsTest {
public static void main(String[] args) {
MyDate m1 = new MyDate(, , ); MyDate m2 = new MyDate(, , ); if (m1 == m2) {
System.out.println("m1==m2"); } else {
System.out.println("m1!=m2"); // m1 != m2 }
if (m1.equals(m2)) {
System.out.println("m1 is equal to m2");// m1 is equal to m2
} else {
System.out.println("m1 is not equal to m2");
} }
}
//1.编写Order类,有int型的orderId,String型的orderName,
// 相应的 getter()和setter()方法,两个参数的构造器,
// 重写父类的equals()方法: public boolean equals(Object obj),并判断测试类中创建的两个对象是否 相等。 public class ORder { int orderId;
String orderName; public int getOrderId(){
return orderId;
}
public void setOrderId(int orderId){
this.orderId = orderId;
} public String getOrderName(){
return getOrderName();
} public void setOrderName(String orderName){
this.orderName = orderName;
} public ORder(){ } public ORder(String orderName, int orderId){
this.orderName = orderName;
this.orderId = orderId;
} @Override
public boolean equals(Object object){
if(object == this){
return true;
}
if( object instanceof ORder ){
ORder oRder = (ORder) object;
if(this.orderId == ((ORder) object).orderId && this.orderName.equals(((ORder) object).orderName)){
return true;
} } return false;
}
} : //请根据以下代码自行定义能满足需要的MyDate类,在MyDate类中覆盖 equals方法,
// 使其判断当两个MyDate类型对象的年月日都相同时,结果 为true,否则为false public class EqualsTest { public static void main(String[] args) {
MyDate m1 = new MyDate(, , );
// MyDate m2 = new MyDate(14, 3, 1976);
MyDate m3 = new MyDate(,,);
if (m1 == m3) {
System.out.println();
System.out.println("m1==m2");
} else {
System.out.println();
System.out.println("m1!=m2"); // m1 != m2 }
if (m1.equals(m3)) {
System.out.println("m1 is equal to m2");// m1 is equal to m2
} else {
System.out.println("m1 is not equal to m2");
}
}
}
} public class MyDate {
int age;
int monty;
int day; public MyDate(int age, int monty, int day) {
this.age = age;
this.monty = monty;
this.day = day;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public int getMonty() {
return monty;
} public void setMonty(int monty) {
this.monty = monty;
} public int getDay() {
return day;
} public void setDay(int day) {
this.day = day;
} @Override
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof MyDate){
MyDate myDate = (MyDate) obj;
if(this.age == myDate.age && this.day == myDate.day && this.monty == myDate.monty){
return true;
}else{
return false;
} }
return false;
}
}
解答
面试题:==和equals的区别
== 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型 就是比较内存地址
equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也 是==;我们可以看到String等类的equals方法是被重写过的,
而且String类在日常开发中 用的比较多,久而久之,形成了equals是比较值的错误观点。
具体要看自定义类里有没有重写Object的equals方法来判断。
通常情况下,重写equals方法,会比较类中的相应属性是否都相等
int it = ; float fl = 65.0f;
System.out.println(“65和65.0f是否相等?” + (it == fl)); //true char ch1 = 'A'; char ch2 = ;
System.out.println("65和'A'是否相等?" + (it == ch1));//true System.out.println(“12和ch2是否相等?" + (12 == ch2));//true String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等?"+ (str1 == str2));//false System.out.println("str1是否equals str2?"+(str1.equals(str2)));//true
System.out.println(“hello” == new java.util.Date()); //编译不通过
java == 和equals()的更多相关文章
- Java中equals与==和comparaTo的区别
一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- java里 equals和== 区别
1.java中equals和==的区别 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中.2.==操作比较的是两个变量的值是否相等,对于引 ...
- Java:重写equals()和hashCode()
Java:重写equals()和hashCode() 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instan ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- java中equals和hashCode方法随笔二
前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...
- 深入探究Java中equals()和==的区别是什么
目录 相等判断符"==" "=="判断基本类型数据 "=="判断引用类型数据 相等判断方法equals() 思考:为什么要设计equals( ...
- java中equals方法和==的用法
java中equals方法的用法以及==的用法(参考一)equals 方法是 java.lang.Object 类的方法.两种用法说明:(1对于字符串变量来说,使用“==”和“equals()”方法比 ...
- Java中equals和hashcode的区别?
Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...
随机推荐
- phpredis报错信息:protocol error, got 'o' as reply type byte解决方案
今天在前端调用PHP的接口时,有报错信息为:protocol error, got 'o' as reply type byte另外此错误有几率会重现,并不是必现的.十分疑惑,遂百度一下,发现是red ...
- thinkphp 相关
路径重写,既模式2 需要.htaccess文件放到index.php同级, http.config文件 中当前项目目录配置 AllowOverride All LoadModule rewrite_ ...
- 用js实现摇一摇功能
function init(){ if (window.DeviceMotionEvent) { // 移动浏览器支持运动传感事件 window.addEventListener('devicemot ...
- 提高redis cluster集群的安全性,增加密码验证
节点设置密码 1.修改配置文件 在配置文件里面增加密码选项,一定要加上masterauth,不然Redirected的时候会失败. masterauth redispassword requirepa ...
- Nginx代理与反向代理、负载均衡实践
通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力;同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...
- WireShark 自带工具 editcap 和 text2pcap 配合完成改包操作
一.拆包 首先声明这种方法比较复杂而且需要点技术水平,不建议菜鸟尝试(可以使用WireEdit编辑pcap包,不过要联网)其实在熟练这种方法后也可以很快的,但这种方法主要还是方便吧,不用下载其他什么软 ...
- SQL语句优化方式
不要使用*号进行查询操作,使用具体字段. 索引 在where子句和order by 涉及的字段上合理的添加索引. where 子句优化 避免在where子句中对null值进行判断,应对字段设置默认值 ...
- 【BZOJ2138】stone
题目 好厉害的题啊 这道题不难看成一个二分图模型,但是给人一种求最大匹配的感觉,这实在不是很好求的样子,于是自闭了 但是不妨这样来考虑,对于一个需求\(k_i\),我们求一个最大的\(x\leq k_ ...
- hashtable C++实现
模仿stl,实现了开链法形式的hashtable.纯属练手,仅仅实现其基本功能,不当之处还望指正.本文为实现独立的空间配置器. #include<iostream> #include< ...
- jquery 给a标签绑定click
一. <div id="main"> <div class="tab-content"> <div class="con ...