java中equals方法重写详解(彻底搞定)
首先上案例:
public static void main(String[] args){String str1 = "abc";String str2 = "abc";String str3 = new String("abc");//new出来的新地址System.out.println(5==5);//基本数据类型比较值System.out.println(str1==str2);//比较的是地址 跟重写前的equals的方式一样//trueSystem.out.println(str1.equals(str2));//比较的是值System.out.println(str1==str3);//比较的是地址 //flaseSystem.out.println(str1.equals(str3));//比较的是值
从上述中我们可以看到:基本数据类型5==5
是比较值,注意这里是基本数据类型
要从String区分:
因为String是引用类型引用类型比较的是地址
有人问了:那str1==str2
肯定是false //错
其实应该是true,下面来看为什么 由于我们java虚拟机会讲定义的变量和存放的位置 区
分,这和c中的指针差不多 ,java就有了引用这一说 下面看一下为什么:
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化为字符串开辟一个字符串常量池,类似于缓存区创建字符串常量时,首先坚持字符串常量池是否存在该字符串存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中
所以大家肯定会说str1==str2是相同的地址,那为什么str1==str3
肯定也是true?
答案是 false因为 是新New的空间地址,看下图:
好了 我们再说equals比较,由于String类已经重写了equals 为了避免废话我们直接上源码:
看不懂没关系我们下面用实体类进行演示重写:
实体类案例:
public class Person {private String name;private int age;//无参构造public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}//重写equals方法@Overridepublic boolean equals(Object obj) {//判断内存地址if (obj == this) {return true;}if (obj == null) {return false;}//判断是否是同一类型的对象if (obj instanceof Person) {//强制转换成Person类型Person per = (Person) obj;//判断他们的属性值 注:这里的age为什么要用==?可以在评论区回答if (this.name.equals(per.name) && this.age == (per.age)) {return true;}}return false;}
}
最后总结:
基本数据类型比较的是值
引用数据类型”:
比较的是地址
想要比较引用类型的值
就重写equals
比如没重写前==等同于equals,都是比较的地址重写后前者是比较地址,后者是比较值
java中equals方法重写详解(彻底搞定)相关推荐
- Java中getBytes()方法--使用详解
getBytes()方法详解 在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! 1. str.getByte ...
- Java中equals()方法重写
Java中的equals()方法是在Object类中定义,Object类是所有类的父类.换句话说,任何类都隐含地继承了该方法.判断两个对象的内容是否相同,必须使用equals()方法,对于没有重写该方 ...
- equals方法重写详解
/**首先要新建一个类,定义成员变量,通过重写* equals()方法比较成员变量的值*/package july.star.equals;/*** 首先要新建一个类,定义成员变量,通过重写* equ ...
- JAVA中intern()方法的详解
很多童鞋可能在Java考试中或者笔试中遇到String字符串比较相等的问题,今天就来谈一谈 在JAVA虚拟机中,有运行时数据区,包含线程共享的:堆,方法区 和线程隔离的:程序计数器,Java虚拟机栈, ...
- java中list和map详解
java中list和map详解 一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedL ...
- Java中的static关键字详解
** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...
- java中的进制输出转换_Java I/O : Java中的进制详解
作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...
- Java中的Runtime类详解
Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...
- Java中equals()方法和==的区别分析
Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...
最新文章
- 单片机要学多久才能自己开发?学单片机以后做什么?
- selenium 实现网页截图
- java 字符串拼接优化_JAVA字符串拼接效率
- 【若依(ruoyi)】jQuery.validator
- 地壳中元素含量排名记忆口诀_Nature:利用熔融包裹体的元素和同位素示踪俯冲带流体来源...
- fedora操作系统优缺点_不同类型的操作系统的优缺点
- Python笔记-类的单例模式及重载打印
- 怀念童年啊!周二下午没有动画片……
- 【Elasticsearch】ElasticSearch Cluster的一致性问题
- java 页面 传送参数,Struts2的action接收JSP页面传输的参数
- 32怎么将mcu内的代码擦除_凭借这款MCU产品,瑞萨电子竟然超越了ARM?
- ViewModel中C# Property自动添加OnPropertyChanged处理的小工具, 以及相应Python知识点...
- Windows 批处理(bat)语法大全
- ETL设计详解(数据抽取、清洗与转换)
- 车辆信息查询api,通过车系名称查询相关信息
- Windows/Ubuntu搭建RTMP服务器+OBS推流+VLC拉流
- 2FSK频谱matlab,数字调制系统在Matlab下的分析
- Definition of Dichotomy
- Tofu Icecream and Tai-chi man
- 16线激光雷达3Dslam建图算法BLAM使用