深入理解 == 与 equals 的区别,

    大家基本都知道:

1、==:

        基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是它们的值。

        复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

2、equals :

       在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址

        但在一些类库中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,比较的是对象本身了

        没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的。

看如下代码:

public class Test {
	public static void main(String[] args) {
		String s1="abc";
		String s2="abc";
		String s3=new String("abc");
		char []a= {'a','b','c'};
		String s4=new String(a);
		
		StringBuffer s5=new StringBuffer("abc");
		StringBuffer s6=new StringBuffer("abc");
		
		
		System.out.println(s1==s2);
		System.out.println(s1==s3);
		System.out.println(s3.equals(s4));
		System.out.println(s5.equals(s6));

	}}

打印结果如下:

true
false
true
false

  1、为什么第一为true呢?      

        说明s1和s2引用了同一个String对象,这就涉及到java中  常量池   的概念了。


程序在运行的时候会创建一个字符串缓冲池当使用,理解为常量池,每次创建一个常量引用时  都会先在池中寻找,如果没有  才会创建一个新的,并放入 池中;

S1和S2都是引用,所以他们同时指向了放在常量池的"abc"。所以他们指向的地址是相同的,即结果为 true

2、那第二个,S3不是也是"abc"吗?为啥是false呢??

        这是因为,每次  new  的时候,都会在堆区创建一个新的对象,如上图。即 == 比较为 false。

3、第三个  为 true

        通过查看源码,我们能看到,String 类 重写了equals方法,比较的是对象本身,即  true。

        同时S4是是使用了String的构造函数,传入字符数组,返回字符串。

4、为什么第四个为 false???

        这是因为在 StringBuffer 类并没有重写equals方法,所以它比较的仍是地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值