Java中equals以及==的区别

这属于数据类型的不同运用,Java中数据可以分为两种类型

1.基本数据类型,也称原始数据类型。

byte,short,char,int,long,float,double,boolean,他们之间的比较,应用双等号(==),比较的是他们的值。

只要是对应的数据的值相同则会返回true。

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

 

==:

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true。

equals:

  equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

  String s="abce"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String s="abce";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
  而String s = new String("abcd");和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。

  也可以这么理解: String str = "hello"; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。

package panbie;

public class one {
	public static void main(String[] args) {
		String x=null;
		int y;
		if (x==null||x.equals(""))
			y=100;
		else y=200;
		System.out.println(y);
	}
}
对于这种方法,我们会发现会出现在  y=100的那一行会出现死代码的提示,
主要原因是我们已经将x定义为空,
并且在代码中没有改变x的值,
所以会出现死代码警告

 对于这种方法,我们会发现会出现在  y=100的那一行会出现死代码的提示,
主要原因是我们已经将x定义为空,
并且在代码中没有改变x的值,
所以会出现死代码警告。

当我们对于x的值更改之后则会撤销这个警告

扫描二维码关注公众号,回复: 4137260 查看本文章
package panbie;
import java.util.*;
public class one {
	public static void main(String[] args) {
		String x=null;
		Scanner cin=new Scanner(System.in);
		int p=cin.nextInt();
		int y;
		if (p==1)x="ll";
		if (x==null||x.equals(""))
			y=100;
		else y=200;
		System.out.println(y);
		cin.close();
	}
}

当我们将equals放到前面时则会出现异常

package panbie;

public class one {
	public static void main(String[] args) {
		String x=null;
		int y;
		if (x.equals("")||x==null)
			y=100;
		else y=200;
		System.out.println(y);
	}
}


运行之后我们就会发现出现了异常
Exception in thread "main" java.lang.NullPointerException
	at panbie.one.main(one.java:7)

具体原因就在文章前面

猜你喜欢

转载自blog.csdn.net/lk888666/article/details/84145223