Java程序中判断两个变量是否相等有两种方式:

一、利用 == 运算符:

  1.1、如果两个变量是基本类型变量,且都是数值型(不一定要求数值类型完全相同),则只要两个变量的值相同,就返回true

  1.2、对于两个引用类型变量,只有它们指向同一个对象时,== 判断才会返回true

  1.3、== 运算符不可用于比较类型上没有父子关系的对象

代码示例:

  1. import static java.lang.System.*;
  2. public class EqualTest{
  3. public static void main(String[] args){
  4. int it=65;
  5. float f1=65.0f;
  6. out.println("65和65.0f是否相等?"+(it==f1));
  7.  
  8. char ch='A';
  9. out.println("65和A是否相等?"+(it==ch));
  10.  
  11. String str1=new String("hello");
  12. String str2=new String("hello");
  13. out.println("str1和str2是否相等?"+(str1==str2));
  14. out.println("str1是否equals str2?"+(str1.equals(str2)));
  15.  
  16. //-由于java.lang.String与EqualTest类没有继承关系,下面代码会编译错误
  17. //out.println("hello"==new EqualTest());
  18. }
  19. }

运行结果:

知识点拓展:

  1、String str=“hello”;

  2、String str=new String("hello");

  如上两行代码中的两个变量str的区别:

  1行代码中的“hello”被称为 字符串直接量(在编译时就计算出来的字符串值),JVM通过 常量池 来管理这些字符串

  2行中的 new String("hello"),当使用这种定义方式时,JVM会先使用常量池来管理“hello”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中,

  换句话说,new String("hello") 一共产生了两个字符串对象

常量池(constant pool):专门用于管理在编译时被确定并被保存在已编译的.class文件中的一些数据,包括了关于类、方法、接口中的常量,还包括字符串常量,如下代码示例:

  1. import static java.lang.System.*;
  2. public class CompareTest{
  3. public static void main(String[] args){
  4. //-a直接引用常量池中的"张三李四"
  5. String a="张三李四";
  6. String b="张三";
  7. String c="李四";
  8.  
  9. //-d后面的字符串值在编译时就确定下来了
  10. //-d直接引用常量池中的"张三李四"
  11. String d="张三"+"李四";
  12.  
  13. //-e后面的字符串值在编译时就确定下来了
  14. //-e直接引用常量池中的"张三李四"
  15. String e="张"+"三"+"李四";
  16.  
  17. //-f后面的字符串值不能在编译时就确定下来了
  18. //-f不能直接引用常量池中的字符串
  19. String f=b+c;
  20.  
  21. //-使用new调用构造器会重新创建一个新的String对象
  22. //-g引用堆内存中新创建的String对象
  23. String g=new String("张三李四");
  24.  
  25. out.println(a==d);//-true
  26. out.println(a==e);//-true
  27. out.println(a==f);//-false
  28. out.println(a==g);//-false
  29. }
  30. }

总结:

1、JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本

2、例如上面代码中a、d、e所引用的字符串可以在编译期就确定下来,因此他们都将引用常量池中同一个字符串对象,所以用 == 运算符计算是返回 true 的

3、使用 new String()创建的字符串对象是运行时创建出来的,它被保存在运行时内存区内(即堆内存内),不会放入常量池中

二、利用 equals()方法:

1、equals()方法是Object类提供的一个实例方法,所有引用变量都可以引用这个方法判断与其它引用变量是否相等

2、判断是否相等的标准与 == 没有区别,都是看引用变量是否指向相同的对象,从这个作用上来说equals()方法没有太大意义

3、equals()方法最大的意义是可通过重写该方法,实现自定义的相等判断,如:String类就重写了equals()方法:只要两个字符串所包含的字符序列相等,即判断相等,返回true

重写equals()方法,实现两个类相等:

  1. class Person{
  2. //-重写Object类的equals()方法
  3. public boolean equals(Object o){
  4. //-相等规则自己定义
  5. return true;
  6. }
  7. }
  8.  
  9. class Dog{
  10. //-空类
  11. }
  12.  
  13. public class OverrideEquals{
  14. public static void main(String[] args){
  15. Person p=new Person();
  16. System.out.println(p.equals(new Dog()));
  17. System.out.println(p.equals(new String("张三")));
  18.  
  19. }
  20. }

运行结果:

有意义的去判断两个类相等。代码示例:

  1. class Penson{
  2. private String name;
  3. private String id;
  4.  
  5. public Penson(){
  6.  
  7. }
  8.  
  9. public Penson(String name,String id){
  10. this.name=name;
  11. this.id=id;
  12. }
  13.  
  14. public void setName(String name){
  15. this.name=name;
  16. }
  17.  
  18. public String getName(){
  19. return this.name;
  20. }
  21.  
  22. public void setId(String id){
  23. this.id=id;
  24. }
  25.  
  26. public String getId(){
  27. return this.id;
  28. }
  29.  
  30. public boolean equals(Object obj){
  31. if(this==obj){
  32. return true;
  33. }
  34.  
  35. //-obj.getClass()==Penson.class用到了反射基础,暂时不用深究
  36. if(obj!=null&&obj.getClass()==Penson.class){
  37. //-强制转换,把将要比较的参数转换成Penson类,便于后面获取类变量id
  38. Penson penson=(Penson)obj;
  39. //-只有两个对象的id相等,才判定相等
  40. if(this.getId().equals(penson.getId())){
  41. return true;
  42. }
  43. }
  44. return false;
  45. }
  46. }
  47.  
  48. public class OverrideEqualsRight{
  49. public static void main(String[] args){
  50. Penson p1=new Penson("张三","9527");
  51. Penson p2=new Penson("李四","9527");
  52. Penson p3=new Penson("王五","9526");
  53. //-p1与p2的id相等,返回true
  54. System.out.println(p1.equals(p2));
  55. //-p1与p2的id不等,返回false
  56. System.out.println(p1.equals(p3));
  57. }
  58. }

运行结果:

通常而言,重写equals()方法应满足下面的条件:

1、自反性:对任意x,x.equals(x)一定返回true

2、对称性:对任意x、y,如果x.equals(y)返回true,那么y.equals(x)一定返回true

3、传递性:对任意x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)一定返回true

4、一致性:对任意x、y,如果对象中用于等价比较的信息值没有发生改变,那么无论调用x.equals(y)多少次,返回的结果应该始终保持一致,要么一直true,要么一直false

5、对任何不是null的x,x.equals(null)一定返回false

==和equals方法:的更多相关文章

  1. List<T>Find方法,FindAll方法,Contains方法,Equals方法

    假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...

  2. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  3. java中的equals()方法重写

    如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...

  4. java提高篇(十三)-----equals()方法总结

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...

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

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

  6. equals()方法

    equals()方法是根类Object中的一个方法,子类可以根据需要重写该方法(比如:String类). 一.Object类中的equals()方法实现如下: public boolean equal ...

  7. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  8. java重写equals方法

    @Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...

  9. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  10. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

随机推荐

  1. DB性能-隐式转换

    1        什么是隐式转换 当源数据的类型和目标数据的类型不同的时候,如果没有转换函数,就会发生隐式转换,也称自动转换.当然, 有些情况下有些类型是不可以发生转换的,比如说从DATE类型转换到N ...

  2. oracle报ora-12519错误

    具体信息如下: ora-12519 tns:no appropriate service handler found the connection descriptor used by the cli ...

  3. Linux---CentOS 定时运行脚本配置练手

    1.安装crontab yum install vixie-cron yum install crontabs vixie-cron软件包是cron的主程序: crontabs软件包是用来安装.卸装. ...

  4. hadoop命令帮助

    安装完hadoop后,在hadoop的bin目录下有一系列命令: container-executor hadoop hadoop.cmd hdfs hdfs.cmd mapred mapred.cm ...

  5. hbase命名空间

    在HBase中,namespace命名空间指对一组表的逻辑分组,类似于数据库,便于对表在业务上划分 HBase系统默认定义了两个缺省的namespace hbase:系统内建表,包括namespace ...

  6. linux 下创建文本的方法

    1.   打开终端,输入  vi  1.txt 输入:wq 文本创建成功 2.  打开终端,输入  vim  1.txt 输入:wq 文本创建成功 3. 打开终端 , 输入 touch  1.txt ...

  7. 使用seaborn制图(柱状图)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 设置风格, ...

  8. Mysql 函数, 存储过程, 任务调度

    官网链接:   https://dev.mysql.com/doc/refman/5.7/en/stored-programs-views.html

  9. favicon.ico

    favicon.ico 作为网页的图标,被当前的所有浏览器都支持. 可直接放在主目录下,自动加载,也可设置在header中. <link rel="shortcut icon" ...

  10. ios App 文件夹

    转:http://stackoverflow.com/questions/16561779/nssearchpathfordirectoriesindomains-nsuserdomainmask D ...