Java中==和equals方法
Java程序中测试两个变量是否相等有两种方式:1、== ;2、equals()方法
当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是基本数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true。
但对于两个引用类型的变量,只有他们指向同一个对象时,==判断才会返回true。==不可用于比较类型上没有父子关系的两个对象。
public class EqualTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int it = 65;
float fl = 65.0f;
System.out.println("65和65.0f是否相等?" + (it == fl));
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1是否与str2相等?" + (str1==str2));
System.out.println("str1是否与str2相等?" + (str1.equals(str2)));
}
}
结果如下:
65和65.0f是否相等?true
str1是否与str2相等?false
str1是否与str2相等?true
解析:对于str1和str2,因为它们都是引用类型变量,它们分别指向两个通过new关键字创建的String对象,因此str1和str2两个变量不相等。
对初学者而言,String还有一个非常容易迷惑的地方,“hello”直接量和new String("hello")有什么区别?JVM将会使用常量池来管理这些字符串;当使用new String("hello")时,JVM会先使用常量池来管理“hello”直接量,再调用String类的构造函数来创建一个新的String对象,新创建的String对象被保存在堆内存中,换句话说,new String("hello")一共产生两个字符串变量。
常量池
常量池专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据。包括关于类、方法、接口中的常量,还包括字符串常量。
public class EqualTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "helloworld";
String s2 = "hello";
String s3 = "world";
String s4 = "hello"+"world";
String s5 = s2+s3;
String s6 = new String("helloworld");
System.out.println("s1是否与s4相等?" + (s1==s4));//true
System.out.println("s1是否与s5相等?" + (s1==s5));//false
System.out.println("s1是否与s6相等?" + (s1==s6));//false
}
}
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本。故例子中s1和s4所引用的字符串可以在编译期就确定下来。它们引用常量池中同一个字符串对象。
使用new String()创建出来的字符串对象时运行时创建出来的,它被保存在运行时内存区(堆内存),不会放到常量池中。
但很多时候希望,程序判断两个引用变量是否相等时,也希望有一种类似“值相等”的判断规则,并不严格要求两个引用变量指向同一对象,可以利用equal()方法。
equal()方法是Object类提供的一个实例方法,因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等。但使用该方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。如果采用自定义的相等标准,则可采用重写equals方法实现。
String已经重写了equals()方法,判断两个字符串相等的标准:只要两个字符串所包含的字符序列相同。
class Person
{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdStr() {
return idStr;
}
public void setIdStr(String idStr) {
this.idStr = idStr;
}
private String name;
private String idStr; public Person(){}
public Person(String name , String idStr)
{
this.name = name;
this.idStr = idStr;
}
public boolean equals(Object obj)
{
if(this == obj)
return true;
if(obj != null && obj.getClass() == Person.class)
{
Person personobj = (Person)obj;
if(this.getIdStr().equals(personobj.getIdStr())){
return true;
}
}
return false;
}
}
public class OverrideEqualsRight { public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("xiaoming","123");
Person p2 = new Person("xiao","123");
Person p3 = new Person("da","12345");
System.out.println("p1和p2是否相等?"+p1.equals(p2)); System.out.println("p2和p3是否相等?"+p2.equals(p3));
} }
p1和p2是否相等?true
p2和p3是否相等?false
Java中==和equals方法的更多相关文章
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- JAVA中复写equals方法
在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...
- JAVA中“==”与equals()方法区别
equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...
- 如何在Java中避免equals方法的隐藏陷阱
摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...
- 如何重写Java中的equals方法
Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...
- java中的equals方法
这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
随机推荐
- less 基础+ flex
1.less 中的变量 @ 符号 引入 /*普通变量*/ @color:pinker; .styles{ color:@color; } /*选择器变量*/ @I:img; @{I}{ width: ...
- 黑盒测试实践-day02
一.任务进展情况 了解测试环境,分析测试步骤. 二.存在的问题 对测试软件还不是很了解 三.解决方法 主要查看网上资料,请求同学帮助 四.下一步计划 先熟悉测试软件,然后进行下一步.
- JPA(Hibernate)
JPA 1,JPA:Java Persistence API.JPA通过JDK 5.0注解-关系表的映射关系,并将运行期的实体对象持久化到数据库中.JPA是JavaEE中的标准.JPA标准只提供了一套 ...
- PHP的数据类型和魔术常量
一. 1.boolean 布尔类型 (布尔值本身,整型0,浮点型0.0,空字符串,不包含任何元素的数组,不包括任何成员变量的对象 NULL,未赋值的变量) 2.integer 整型 3.float 浮 ...
- jexus System.BadImageFormatException Details: Non-web exception. Exception origin (name of application or object): App_global.asax_ai3fjolq.
Application ExceptionSystem.BadImageFormatExceptionInvalid method header format 0Description: HTTP 5 ...
- iOS UIView 选择性倒角
有些APP中会有卡券,卡券做成了选择性倒角,例如左上,右上倒角.非常美观.看一下iOS的实现: #import "Masonry.h" @interface WJWDaojiaoV ...
- 使用sysbench压测磁盘io
Ⅰ.sysbench安装 cd /usr/local/src yum -y install make automake libtool pkgconfig libaio-devel git clone ...
- flask shell命令
在flask项目目录下,使用pipenv shell激活flask虚拟环境后,调用flask shell能够使用虚拟环境的python解释器进入交互式环境,并且工作目录还保留在flask项目目录. f ...
- Postman接口自动化测试实例二
在<Postman接口自动化测试实例>一文中,我是在获取随机因子的接口的Tests中对用户的密码进行加密处理的.其实正常做法应该是在请求验证接口前,即在Pre-request Script ...
- Cocos Creator JS 时间戳日期转换
/*** 时间戳换算日期* */function formatDateTime (timeStamp) { var date = new Date(); date.setTime(timeStamp ...