equal与== 个人笔记

首先看看以下的图,看清楚了图咱们要说的知识点也就说说清楚了一半


int a=10;
String b="ss";
String c=new String("kkk");
Person d=new Person("dlf");
String e=new String("kkk");
String f="ss";


jvm中有堆heap,栈stack,常量池constant。
我们的基本对象,包含int,double等都放在栈里,引用类型如String,Person(Person 就是一个pojo类而已)引用(如上面的c,d)放在栈里,真实的数据放在堆中。


== 比較的是两个对象在栈中存放的数据是否一样
b==f 比較的就是两个105的地址 (105就是指ss在常量池中的地址)
c==e 一个1063一个1095 自然就不相等了


equals 比較的事堆中的内容
c.equsls(e) 就是两个kkk在比較 答案不言自明


Objeck的equals方法例如以下
    public boolean equals(Object obj) {
        return (this == obj);
    }
换句话说object的类的==与equals就是一回事
有兴趣的能够看看String的equals方法


关于==与equals说完了,再说说字符串的构建
对字符串的构建 我们最常使用的有两种
String a1="bbb";
String a2=new String("ccc");
两种方式有不同
第一种方式,通过上面的图大家也看到了,bbb这个数据存放在常量池里;准确的说是用String a1="bbb"这样的方式产生字符串,jvm首先会在常量池里查找是否有bbb这个数据,假设有就把bbb这个数据的地址给a1,否则就在常量池里新建一个数据单元里面存放bbb,然后把这个单元的地址给a1。

(上图中的两个105 就是这个样例)
另外一种方式在于 在编译的时候会有一个ccc在常量池,等到执行的时候,会在堆区在创建一个数据单元里面存放ccc,然后a2里面就存放堆里面那个数据单元的地址!另外即使堆中已经有了这个字符串,通过new的方式,还会再产生一个堆区的数据(如上图中的1063与1095)


所以
String a=new String("bbb");
产生了两个对象,一个在堆一个在常量池。




String a=new String("bbb");
String c=new String("ccc");
产生了四个对象,两个在堆两个在常量池。


String a1=new String("sss");
String a2=new String("sss");


对于这样的情况,堆区肯定有两个对象,那常量池里面呢?

一个sss还是两个sss 我不敢肯定 但我预计应该是两个。

原文地址:https://www.cnblogs.com/gcczhongduan/p/5135887.html