java中equals方法的用法以及==的用法(参考一)
equals 方法是 java.lang.Object 类的方法。
两种用法说明:
(1对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
比如:

String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");

那么:

s1==s2   //false     两个变量的内存地址不一样,也就是说它们指向的对象不 一样,
s1.equals(s2)     // true     两个变量的所包含的内容是abc,故相等。

注意(1:
如果:

StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a"); 

结果:

s1.equals(s2)  //是false         

解释:

StringBuffer类中没重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的,所以等于false.

注意(2:

对于s3和s4来说,一点不一样要引起注意,由于s3和s4是两个字符,串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没s3=s4这样一个赋值语句)

(2对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
比如:

class A{
A obj1 = new A();
A obj2 = new A();
}
//那么:obj1==obj2是false obj1.equals(obj2)是false
//但是如加上这样一句:obj1=obj2;
//那么 obj1==obj2 是true obj1.equals(obj2) 是true

总之:

equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。
关于equals与==的区别从以下几个方面来说:
(1 如果是基本类型比较,那么只能用==来比较,不能用equals
比如:

public class TestEquals {
public static void main(String[] args){
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}

(2 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:

public class TestEquals {
public static void main(String[] args){
Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。

(3 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这个类作进一步的说明。
(a首先,介绍String的用法,请看下面的实例:

public class TestEquals {
  public static void main(String[] args) {
    String s1 = "123";
    String s2 = "123";
    String s3 = "abc";
    String s4 = new String("123");
    String s5 = new String("123");
    String s6 = new String("abc");
    System.out.println(s1 == s2);//(1true
    System.out.println(s1.equals(s2));//(2true
    System.out.println(s1 == s3);//(3flase
    System.out.println(s1.equals(s3));//(4flase
    System.out.println(s4 == s5);//(5flase
    System.out.println(s4.equals(s5));//(6true
    System.out.println(s4 == s6);//(7flase
    System.out.println(s4.equals(s6));//(8flase
    System.out.println(s1 == s4);//(9false
    System.out.println(s1.equals(s4));//(10true
  }
}

答案解释:

s1与s2分别指向由字符串常量”123” 创建的对象,在常量池中,只一个对象,内容为123,两个引用s1和s2指向这个对象,故这两个引用变量所指向的地址是相同的,因而(1处的运行结果为true,又因为s1.equals(s2)是比较s1和s2所指向的对象的内容是否相等,而我们知道这两个对象的内容都是字符串常量”123”,故标记(2处的运行结果是true。
用同样的方法分析,s1和s3所指向的对象不一样,内容也不一样,故标记(3和(4处运行结果是false。
再看看s4和s5,这两个引用变量所指向的对象的内容都是一样的(内容都是123,但是这两个对象是用new操作符创建处类的,是在内存中分配两块空间给这两个对象的,因而这两个对象的内存地址不一样,故事两个不同的对象,标记(5处的s4 == s5 运行结果为false,但是内容一样,故标记(6处的s4.equals(s5)运行结果为true。同理,s4和s6所指向的对象地址不同,内容也不相同。故标记(7(8处运行结果为false。
s1和s4分别指向两个不同的对象(之所以这样称呼,是因为这两个对象在内存中的地址不相同,故而对象不相同,故标记为(9处的s1 == s4运行结果为false,而标记为(10处的s1.equals(s4)运行结果为true.

(4 再看一种情况,先看一个例子(该例子是Java编程思想第章的例子:

class Value {
    int i;
} public class EqualsMethod2 {
    public static void main(String[] args) {
        Value v1 = new Value();
        Value v2 = new Value();
        v1.i = v2.i = 100;
        System.out.println(v1.equals(v2));// (1flase
        System.out.println(v1 == v2);// (2false
    }
}

运行结果疑问:乍一看结果,有点惊讶,为什么不是true呢,不是说equals方法是比较内容的吗?
解释:

不错,如果在新类中被覆盖了equals方法,就可以用来比较内容的。但是在上面的例子中类Value并没覆盖Object中的equals方法,而是继承了该方法,因此它就是被用来比较地址的,又v1和v2的所指向的对象不相同,故标记(1处的v1.equals(v2)运行结果为false,标记为(2处的v1 == v2运行结果也为false。

java中equals方法和==的用法的更多相关文章

  1. 简述java中equals()方法和==的区别

    ==与equals的主要区别是: ==: ==常用于比较原生类型(基本数据类型):byte,short,char,int,long,float,double,boolean,比较的是他们的值. 若用= ...

  2. Java中equals方法null造成空指针异常的原因及解决方案

    正文 bug描述 当查找已修改的与未修改的做比较的时候,之前为null的值调用equals方法与其他值做比较的时候,会导致抛出空指针异常 知识补充 关于null,你不得不知道的几件事: 1.null是 ...

  3. Java中equals方法简略描述

    所有类都从Object中继承了equals方法,源码:public boolean equals(Object o){return this == o;} 直接判断this与o本身是否为同一对象(是否 ...

  4. JAVA中equals方法与hashCode方法学习

    首先参考文章:http://www.oschina.net/translate/working-with-hashcode-and-equals-methods-in-java 1,equals方法的 ...

  5. 深入探究Java中equals()和==的区别是什么

    目录 相等判断符"==" "=="判断基本类型数据 "=="判断引用类型数据 相等判断方法equals() 思考:为什么要设计equals( ...

  6. java中equals和hashCode方法随笔二

    前几天看了篇关于java中equals和hashCode方法的解析 1.Object类中的equals方法和hashCode方法. Object类中的equals和hashCode方法简单明了,所有的 ...

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

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  8. Java中equals与==和comparaTo的区别

    一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...

  9. 【转】Java中equals和==的区别

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

随机推荐

  1. 有赞 MySQL 自动化运维之路 — ZanDB

    转自:https://tech.youzan.com/youzan-mysql-auto-ops-road/ 一.前言 在互联网时代,业务规模常常出现爆发式的增长.快速的实例交付,数据库优化以及备份管 ...

  2. recreate dbcontrol on database 11.2.0.1 using emca

    [oracle@osb ~]$ env | grep ORA ORACLE_SID=ACE ORACLE_BASE=/oracle ORACLE_TERM=xterm ORACLE_HOME=/ora ...

  3. Luogu P1041 [2003NOIP提高组]传染病控制

    P1041 传染病控制 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染 ...

  4. Maven学习总结(28)——Maven+Nexus+Myeclipse集成

    Maven简介 Maven 是一个基于项目对象模型(POM)的,提倡约定优于配置(ConventionOver Configuration)的,跨平台的项目管理和构建自动化工具. 首先它是一个优秀的构 ...

  5. ZOJ 5579 Stean

    Stean Time Limit: 1 Second      Memory Limit: 65536 KB      Special Judge Tom is good at making stea ...

  6. LMDB installation

    Official Website: http://lmdb.readthedocs.io/en/release/ Install commands for Ubuntu: $ sudo apt-get ...

  7. springCloud学习-服务链路追踪(Spring Cloud Sleuth)

    1.简介 Spring Cloud Sleuth 是 Spring Cloud 的一个组件,它的主要功能是在分布式系统中提供服务链路追踪的解决方案. 常见的链路追踪组件有 Google 的 Dappe ...

  8. hdu_1863_畅通工程_201403122000

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. 洛谷—— P1077 摆花

    https://www.luogu.org/problem/show?pid=1077 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客 ...

  10. Linux统计行数命令wc(转)

    Linux wc命令用于计算字数. 利用wc指令我们可以计算文件的Byte数.字数.或是列数,若不指定文件名称.或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据. 语 ...