我的第一篇博客
来源:互联网 发布:合肥飞友网络招聘 编辑:程序博客网 时间:2024/06/10 10:33
2016年3月15日,昨天开通了CSDN博客,今天写下第一篇博客,正式开启我的博客之旅。一点一点写,一步一步成长。目前在巩固Java基础知识,这篇博客就写关于Java中的一个知识点:【==与equals】
Object类的equals方法如下:
public boolean equals(Object obj) { return (this == obj); }
可以看到,equals方法和==没有区别,equals方法还是在比较引用的地址是否相同。
看如下例子:
public static void main(String[] args) { String str_1 = "hello world"; String str_2 = "hello world"; String str_3 = new String("hello world"); System.out.println(str_1 == str_2); System.out.println(str_1.equals(str_2)); System.out.println(str_1 == str_3); System.out.println(str_1.equals(str_3)); }
程序输出如下:
true
true
false
true
第一条输出true,可以看到str_1和str_2引用地址相同。首先,创建的str_1变量被赋值为”hello world”常量,String常量会被分配在JVM常量池,然后创建的str_2变量同样要被赋值为”hello world”,JVM会首先查找常量池是否存在该常量,如果存在,便将str_2指向该常量,如果不存在,存储新的String常量并使str_2指向该常量,很显然”hello world”已经存在于常量池,所以str_1和str_2均指向”hello world”常量,所以str_1和str_2 的地址相同,故输出true。这是JVM对String类的优化。
第二条输出true,是因为equals比较str_1和str_2的指向的内容是否相同,很显然是相同的,故输出true。
第三条输出false,可以看到str_1和str_3的引用地址不同,这是因为str_3指向new字符新建的String对象,使用new字符创建的对象被JVM分配在堆中,所以str_1和str_3的引用地址不同,这也是创建String变量的两种方式的不同之处。
第四条输出true,可以从第三条中看到str_1和str_3的引用地址是不同的,根据从Object类继承而来的equals方法来看,两者引用地址不同,那么(this == obj)应该返回false,现在输出true,这是因为String类重写了equals方法,如下:
private final char value[]; 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; }
可以看到,虽然str_1和str_3的引用地址不同,但其长度和对应字符均相同,也就是内容相同,则返回true。
- 我的第一篇博客
- 我的博客 第一篇
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- codeforces598A(快速幂)
- WKWebView与js交互
- java.io.Serializable浅析
- get post mysql存储引擎
- 电商数据分析基础指标体系
- 我的第一篇博客
- Swift - 操作SQLite数据库(引用SQLite3库)
- FragmentTransaction add 和 replace 区别
- <span>&<p>有区别么
- 自制大体模仿ios 四位密码输入界面
- 支付宝支付
- 成为高级程序员的 10 个步骤
- HDFS API文件上传报错 Exception in thread "main" .......: Wrong FS: file:///
- Go语言核心之美 1.5-作用域