java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要给大家介绍了 Java 中 Object.equals 和 String.equals 的区别,文中通过一个小示例让大家轻松的明白这两者的区别,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
前言
Java 中的堆和常量池的区别是什么呢?Object.equals 与 String.equals 的区别呢?下面让我妈通过一个小示例让你明白它~
1、基础知识
Java 的存储空间:寄存器、栈、堆、静态存储区、常量存储区 (常量池)、其他存储位置。
此处重点介绍堆和常量存储区:
堆:存储 new 的对象;
常量池:用来存储 final static、String 的常量。
2、Object.equals 与 String.equals 的区别
Object.equals(==):比较内存地址;
String.equals: 比较内容即可,不管内存地址。
总结:
Object.equals 相等,String.equals 一定相等;
String.equals 相等,Object.equals 不一定相等。
3、实战演练
- public class TestString {
- public static void main(String[] args) {
- // 维护在常量池里面
- String a = "hello";
- String b = "hello";
- // new出来的所有对象都在堆内存中
- // 只要是new出现来的都是新对象
- String c = new String("hello");
- String d = new String("hello");
- // 对比内存地址
- //true
- System.out.println(a == b);
- //false
- System.out.println(a == c);
- //false
- System.out.println(c == d);
- //对比内容
- //true
- System.out.println(a.equals(b));
- //true
- System.out.println(a.equals(c));
- //true
- System.out.println(c.equals(d));
- }
- }
解释:
a,b 都是常量,a 和 b 都是指向常量存储区中的常量'hello',所以无论内容还是内存地址都是一样的,因此 a==b 以及 a.equals(b) 都是 true;
c,d 都是变量,他们都是 new 出来的对象,里面存在两个 hello 变量,c 和 d 分别指向自己的 hello 变量,所以 c 和 d 内容一样,但是内存地址不一样,因此 c==d 是 true,但是 c.equals(d) 为 true。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/17/1224/357339.html