【Java学习笔记(三-1)】Java中变量的比较方法

==运算符

如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,则返回true

  • 整型和字符型都是实际都是采用数值的形式进行存储,因此可以直接使用==运算符进行比较
  • String字符串类型本质上不属于基本数据类型,而是一种引用型变量,所以无法与整型和字符串使用==运算符进行比较

如果比较的是两个引用型变量(对象也可以视为引用型变量),只有它们指向相同时,==运算符的运算结果才为true

范例

  •   //整型和浮点型比较
      int in_num=79;
      float fl_num=79.0f;
      System.out.println("(int)79==(float)79.0? "+(in_num==fl_num));
      //结果为:(int)79==(float)79.0f? true
    
      //整型和布尔型比较
      //in_num=0;
      //boolean bl_num=false;
      //System.out.println("(int)0==(boolean)false?"+(in_num==bl_num)); 无法比较
    
      //整型和字符型比较
      char ch_char='O';//O的十进制编码为79
      char ch_num=79;//直接用数值赋值
      System.out.print("(int)79==(char)79? "+(in_num==ch_num)+" | ");
      System.out.println("(int)79==(char)'O'? "+(ch_num==ch_char));
      //结果为:(int)79==(char)79? true | (int)79==(char)'O'? true
    
      //整型和字符串类型比较
      //String str_char="O";
      //String str_num=79; String类型无法用数值赋值
      //System.out.print("(String)79==(char)79? "+(str_char==ch_char));String类型无法直接和字符串类型比较
      
      //字符串类型之间的比较
      String str_char1="O";
      //堆内存中开辟了一个空间存放"O"(姑且称为O1),栈内存中开辟了一个空间str_char1指向O1
      String str_char2="O";
      //堆内存中由于已经有了O1,所以不再重新开辟空间,栈内存中则开辟了一个新的空间str_char2继续指向O1
      String str_char3=new String("O");
      //这时堆内存中则重新开辟了一个空间存放"O"(称之为O2),栈内存中开辟了一个空间str_char3指向O2
      System.out.print("str_char1==str_char2? "+(str_char1==str_char2)+" | ");
      //此时==运算符比较的可以理解为str_char1和str_char2的指向,两者都指向O1,所以得到结果为true
      System.out.println("str_char2==str_char3? "+(str_char2==str_char3));
      //str_char2和str_char3的指向不同,所以结果为false
      //结果为:str_char1==str_char2? true | str_char2==str_char3? false
      
      str_char2=str_char3;
      //表面上来说可以看成是把str_char3的值赋给str_char2,但实际上是把str_char3的指向赋给str_char2的指向,两者最终都指向O2
      System.out.print("str_char1==str_char2? "+(str_char1==str_char2)+" | ");
      //此时str_char1和str_char2的指向已经不一样了,比较结果为false
      System.out.println("str_char2==str_char3? "+(str_char2==str_char3));
      //此时str_char2和str_char3的指向一样,比较结果为true
      //结果为:str_char1==str_char2? false | str_char2==str_char3? true
    

在上范例中,显然直接量”O”和new String(“O”)在Java中采用了不同的管理方式。这里作进一步拓展:当Java程序直接使用形如”O”的字符串直接量(包括在编译出来时就可以直接计算出来的字符串值)时,JVM将会使用常量池来管理这些字符串;当使用new String(“O”)时,JVM会先使用常量池来管理字符串”O”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。换句话说,new String(“O”)一共产生了两个字符串对象。JVM常量池是一堆内存中一块特殊的内存空间,它保证了相同的字符串直接量只有一个,不会产生多个副本

equals()方法

  • String对象的equals()方法:在很多时候,判断两个引用变量是否相等时,仅仅只需要判断值是否相等,并不严格要求它们指向同一对象。此时则可以使用String对象的equals方法进行判断
  • equals()方法本质上是Object类提供给实例的一个方法,因此所有引用变量都可以调用该方法来判断是否与其它引用变量相等。但是String类继承Object类后覆写了equals()方法,所以String的对象之间相互比较可以只比较值,而对于其它类的对象使用equals()方法与使用==运算符比较比较没有区别。如果希望采用自定义的比较标准,可以自行覆写equals()方法
  • 正确的覆写equals()方法应该满足下列条件

    • 自反性:对任意x,x.equals(x)一定返回true
    • 对称性:对任意x、y,x.equals(y)返回true,则y.equals(x)一定返回true
    • 传递性:对任意x、y、z,x.equals(y)返回true,y.equals(z)返回true,则z.equals(x)一定返回true
    • 一致性:对于任意x、y,如果对象中用于等价对比的信息没有改变,那么无论调用对少次,返回的结果应该始终保持一致
    • 对于任何不适null的x,x.equals(null)一定返回false

范例

  //String类型的equals()方法比较
  System.out.print("str_char1.equals(str_char2)? "+(str_char1.equals(str_char2))+" | ");
  System.out.println("str_char2.equals(str_char3)? "+(str_char2.equals(str_char3)));
  //结果为:str_char1.equals(str_char2)? true | str_char2.equals(str_char3)? true

  //Object类型的equals()方法比较
  class Person{//定义一个空类,所有的类都默认继承于Object类
  }
  Person Ming=new Person();
  Person Wang=new Person();
  System.out.print("Ming==Wang? "+(Ming==Wang)+" | ");
  System.out.println("Ming.equals(Wang)? "+(Ming.equals(Wang)));
  //结果为:Ming==Wang? false | Ming.equals(Wang)? false
  Ming=Wang;
  System.out.print("Ming==Wang? "+(Ming==Wang)+" | ");
  System.out.println("Ming.equals(Wang)? "+(Ming.equals(Wang)));
  //结果为:Ming==Wang? true | Ming.equals(Wang)? true

人已赞赏
PHP编程语言

【PHP学习笔记(四)】正则表达式

2020-3-24 22:38:13

PHP编程语言

【PHP学习笔记(五)】PHP与Web页面的交互

2020-3-25 22:55:13

3 条回复 A文章作者 M管理员
  1. 刚好需要 谢谢拉

  2. 我是来学习的

    • 欢迎交流~

个人中心
今日签到
有新私信 私信列表
搜索