equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址。一般重写了equals()方法就表示比较它们“实际意义上相等”,比较的是内容,而不是引用地址。Java中String重写了equals方法,所以此时比较的是两者的内容是否相等,而==比较的永远是地址。

package testPage;

/*
* ==和equals有何区别
* 这是在网上偶然看到的一个帖子,如果让我说,还真说不清楚,所以决定一探究竟。
*
*/ public class StringAndEquals { public static void main(String[] args) {
// 案例1
String a = "abc";
String b = "abc";
System.out.println("a==b的结果是:" + (a == b)); // 结果:true
System.out.println("a.equals(b)的结果是" + (a.equals(b))); // 结果:true // 案例2
String c = new String("abc");
String d = new String("abc");
System.out.println("c==d的结果是:" + (c == d)); // 结果:false
System.out.println("c.equals(d)的结果是" + (c.equals(d))); // 结果:true // 案例3
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2) {
System.out.println("s1 == s2");
} else {
System.out.println("s1 != s2"); // 输出这句话
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2"); // 输出这句话
} else {
System.out.println("s1 not equals s2");
} // 案例4
String s3 = "Monday";
String s4 = new String("Monday");
s4 = s4.intern();
if (s3 == s4) {
System.out.println("s3 == s4"); // 输出这句话
} else {
System.out.println("s3 != s4");
}
if (s1.equals(s4)) {
System.out.println("s3 equals s4"); // 输出这句话
} else {
System.out.println("s3 not equals s4");
} } }

  对于案例1,在内存堆中还有个东西就“串池”,当你以赋值的形式,即String a = "abc";给a赋值,系统会先在“串池”里找有没有,没有就创建,如果有,就直接给赋值了。在这里例子中String a = "abc",之前“串池”中没有,于是系统创建了一个,String b = "abc"到“串池”中寻找的时候,有了,于是直接赋与内存地址,因此输出为true。

  对于案例2,直接new出来的字符串不在“串池”中,因此每次new的是不“==”的。

  对于案例3,结合前两个案例的解析,很容易开出原因。

  对于案例4,加入了inter()方法,intern()后字符串可以直接 == 进行比较,速度提高了3倍。java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。

  我们清楚了用法之后,看一下原理吧,首先是equals的源码:

public boolean equals(Object anObject) {
  if (this == anObject) {
    return true;
  }
}

  如果重写了equals方法,比如String类中的equals方法,源码如下:

 /**
* 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 = count; // 这里的count是事先定义的一个属性,初始值为字符串的size
if (n == anotherString.count) {
  char v1[] = value; // value为字符串转化的字符数组
  char v2[] = anotherString.value;
  int i = offset; // offset默认为0
  int j = anotherString.offset;
  while (n-- != 0) {
   if (v1[i++] != v2[j++])
    return false;
   }
  return true;
}
}
return false;
}

  从上面的代码,我们可以这样其实在地址不相等的情况下会继续比较值,如果值相等,返回true。而==返回的结果和重不重写equals没关系,重写equals只会对Object.equals(Object)的结果造成影响。

  所以,总的来说,我们可以得到下面的结论:

  java中的数据类型,可分为两类: 
    1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。

    2.复合数据类型(类) 
      当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

参考资料:

http://bbs.csdn.net/topics/300179403

http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html

http://geyubin.iteye.com/blog/1145464

JAVA中==与equals的区别的更多相关文章

  1. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  2. JAVA中“==”与equals()方法区别

    equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...

  3. Java中==与equals的区别及理解

    区别: "==" 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致. 如果两个对象的引用相同时(指向同一对象时)," ...

  4. Java中==与equals()的区别

    声明转载来源:http://blog.csdn.net/striverli/article/details/52997927 ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系 ...

  5. java 中 “==” 和 equals 的区别

    转自https://www.cnblogs.com/www123----/p/7857298.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new Strin ...

  6. Java 中 == 和 equals 的区别

    有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...

  7. java中==和equals的区别(转)

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  8. Java中==和equals()的区别

  9. Java中“==”与equals的区别以及equals方法的重写

    一.“==”与equals的区别: (1)==代表比较双方是否相同: 基本数据类型表示值相等. 引用数据类型表示地址相等,即同一个对象. (2)Object中的equals()方法:是否为同一个对象的 ...

随机推荐

  1. MAMP PRO 下安装 memcache

    本人PHP用的是 5.5.10,编译 memcache 模块需要用到 php 源码,mamp 不自带,到 php 官网下一个 php-5.5.11.tar.gz, 解压后,生成 zend_config ...

  2. 前端 fetch 通信

    随着前端异步的发展, XHR 这种耦合方式的书写不利于前端异步的 Promise 回调. 而且,写起来也是很复杂. fetch API 本来是在 SW(ServiceWorkers) 中提出的, 不过 ...

  3. rt-80启动tomcat

    1 #!/bin/sh 2 cd /mnt/tomcat/tomcat_8082; 3 ps -ef|grep /tomcat_8082/ |awk '{print $2}'|xargs kill - ...

  4. tomcat服务器重启后session可以继续使用

    原文:http://blog.csdn.net/e421083458/article/details/8651312 测试没有效果 配置server.xml文件,加入session保存操作 <C ...

  5. 7.volatile关键字

    volatile:一个线程修改了某一个共享变量的值,其他线程也是否能够立即知道这个修改的 1.主要是让该“变量”在多个线程中可见,在java中每一个线程都有一块自己的工作区,其中就存放着所有线程“共享 ...

  6. kali开启ssh服务,实现win远程登录

    本人问题:想通过windows7中的putty直接ssh到kali系统,而默认情况下,kali系统ssh服务没有开启. 具体按如下操作进行设置: 照以下步骤进行配置和操作: 1.修改sshd_conf ...

  7. ASP.Net生成静态HTML页

    动态网页开发技术中,为了降低网站维护的工作量,常常用到动态页面技术.目前因特网上流行的做法是将网站中需要经常更新的数据存放到数据库中,当客户端浏览器向服务器发出HTTP请求时,服务器通过执行.解释某个 ...

  8. 13个 ASP.NET MVC 的扩展

    ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏 ...

  9. 如何修改Git commit的信息

    原文地址: http://xiguada.org/change-git-commit-message   Git cimmit信息push后,如何修改,amend可以修改最后一次commit信息,但对 ...

  10. Thinkphp错误-phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连

    phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接.您应该检查配置文件中的主机.用户名和密码,并确认这些信息与 MySQL 服务器管理员所给出的信息一致. 原因有可能是因为修改了m ...