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方法的更多相关文章

  1. 关于Java中的equals方法

    关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...

  2. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  3. 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

    Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...

  4. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  5. JAVA中复写equals方法

    在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...

  6. JAVA中“==”与equals()方法区别

    equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...

  7. 如何在Java中避免equals方法的隐藏陷阱

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...

  8. 如何重写Java中的equals方法

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  9. java中的equals方法

    这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...

  10. Java中的equals方法和自定义比较器

    Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...

随机推荐

  1. springmvc+hibernate

    <本文摘要他人> 1.设计数据库:设计好表结构,最好符合3NF,采用Hibernate tools将设计好的表自动生成对应的实体entity. 1.创建Maven项目,按需映入Maven包 ...

  2. archlinux下安装acroread打开pdf

    虽说acroread是个好东西,但是在打开pdf几秒后总是自动退出呢 在其aur网页下找到了这么一解决办法: 打开终端输入 sudo unshare -n sudo -u ${USER} ACRO_A ...

  3. 20175320 2018-2019-2 《Java程序设计》第7周学习总结

    20175320 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 本周学习了教材的第八章的内容,在这章中介绍了常用的实用类,着重讲了如何利用String类.S ...

  4. filter 过滤器的基本使用

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  5. Centos 安装Java jdk

    1/ yum search java|grep jdk 2/ yum install java-......... 3/ vi /etc/profile 在最后添上: 4/ source /etc/p ...

  6. js比较两个单独的数组或对象是否相等

    所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,boolean,number,string) 传引用也就是说的那个引用数据类型,(array和object) 基本数据类型 ...

  7. 『转载』判断一个正整数是不是素数,时间复杂度为O(根号n)

    原文链接:https://blog.csdn.net/liangdagongjue/article/details/77895170#commentsedit PS:新手上路,实在找不到怎么转载,所以 ...

  8. PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)

    Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...

  9. VisualVM监控远程服务器JVM

    VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用.JVM堆内存消耗.线程.类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很 ...

  10. Cocos Creator(圆形遮罩头像)动态增加遮盖层 mask 并设为圆形生效

    var avatar = new cc.Node('avatar'); var sp = node.addComponent(cc.Sprite); sp.spriteFrame = new cc.S ...