java中==和equals的区别

xiaoxiao2022-06-11  31

项目遇到一个问题,if判断 "==" true的方法怎么也不会进

入,通过测试、学习明白了中间的问题,最后改用equals方法才实现

 

 

 

 

java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号(==),比较的是他们的值。  2.复合数据类型(类)    当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。   对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

 

再说一下怎么避免equals方法空指针的现象

首先看个例子

 

public static void main(String[] args) {

 String a=null;  if("aa".equals(a))//这种情形,不出现空指针异常  //if(a.equals("aa"))//出现空指针异常  {  System.out.println(true);  }  else {  System.out.println(false);  }  }

 

面的两句不同的比较语句测试,第一句不出现空指针异常,第二句出现。 所以在变量和常量比较的时候,一般把常量放在前面。为了避免空指针异常。 但是我的问题是:变量在前时候,读到变量,变量为空,就出现异常了。 为什么变量在后时候,a变量就不用读了吗?既然要比较肯定也要读啊,问题 只是先后的问题。为什么放在后面就就不报空指针呢?

 

看了一下string类的equals方法

 

  public boolean equals(Object anObject) {          if (this == anObject) {              return true;          }          if (anObject instanceof String) {              String anotherString = (String) anObject;              int n = value.length;              if (n == anotherString.value.length) {                  char v1[] = value;                  char v2[] = anotherString.value;                  int i = 0;                  while (n-- != 0) {                      if (v1[i] != v2[i])                              return false;                      i++;                  }                  return true;              }          }          return false;      }

源码我看了一下,也明白,但是在源码中如果anobject为空的时候,就不会出现空指针异常吗 ? 后来经过一番讨论后,我得出的结论是这样的:

问题是出现在调用方法上了。因为null值,并不是一个String对象。而你通过声明的String对象引用去 调用了String对象的实例方法。当然不可以了。null调用了方法。

所以系统报出了,空指针异常。

转载请注明原文地址: https://www.6miu.com/read-4930390.html

最新回复(0)