还在傻傻分不清楚equal和==
目录:
1.==
2.equal
3.==和equal的区别
1.==
(1)我们都知道数据类型分为基本数据类型和引用数据类型,== 在比较不同的数据类型所比较的东西也不一样
比较基本数据类型:比较的是表面的值
比较引用数据类型:比较的是两个引用是否引用的是一个对象
2.equal
(1)比较基本数据类型:注意这里equal不能作为比较基本数据类型的方法
(2)比较引用数据类型:这里分为两种情况
对String和Date等重写了equal的类来说比较的是对象的内容
对没重写的类来说比较的是是否指向同一个对象
看看String源码:
* Compares this string to the specified object. The result is {@code* true} if and only if the argument is not {@code null} and is a {@code* String} object that represents the same sequence of characters as this* object.** @param anObject* The object to compare this {@code String} against** @return {@code true} if the given object represents a {@code String}* equivalent to this string, {@code false} otherwise** @see #compareTo(String)* @see #equalsIgnoreCase(String)*/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;}可以看出来equal是object里边的方法,而他的底层也是依赖 == 所以在没重写equal的时候,就和 == 一样比较是不是同一个对象
(3)我们知道String在创建对象的时候可以用new也可以不用new直接赋值
即:
那么二者有啥不同呢
看下面这一题:
这里有一个常量区:
如果想深究参照博主另一篇博客:
内存分析详解
我们new出来的对象会重新在堆区开辟一块空间存放对象,但是我们直接赋值的话就会在常量区寻找有没有一个字符串和赋值用的字符串相同,相同的话就把已经存在的常量区字符串的引用赋给要被赋值的引用,拿上边得的最后一个c==d举例,这里为啥是true呢,那是因为c="abc"首先会在方法区查看有没有一个字符串等于“abc”发现没有,那么就在方法区创建一个“abc”的对象,然后把这个对象的引用赋值给c,然后d又等于”abc“一样的在方法区寻找发现方法区有这么一个”abc“的对象,那么就把这个对象的引用给d所以c和d实际上是指一个对象所以返回true
注意这里方法区也在堆区,但是new出来的对象在虽然在堆区里但是在方法区之外
总结
以上是生活随笔为你收集整理的还在傻傻分不清楚equal和==的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: java重载与重写的区别你懂了吗
- 下一篇: 深入String、StringBuild