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. sysbench测试阿里云ECS云磁盘的IOPS,吞吐量

    测试阿里云ECS 对象:在aliyun上买了一个ECS附加的云盘,使用sysbench测试云盘的IOPS和吞吐量 sysbench prepare 准备文件,10个文件,1个1G [root@iZwz ...

  2. php第十二节课

    练习 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...

  3. 【JAVA】AES加密

    import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; imp ...

  4. java折半插入排序

    代码如下: public class BinaryInsertSort { public static void binaryInsertSort(DataWrap [] data) { System ...

  5. Vue中数据的处理

    临时变量参数的存储 1.引用类型和值类型的差异,及存储 2.在项目中做的绑定值,首先v-model 存储到临时变量,同时把数据在提交到api之前,需要做处理,因为是引用类型的数据,在处理之前,会修改掉 ...

  6. RSAROLL

    题目:http://www.shiyanbar.com/ctf/1918 # -*- coding: utf-8 -*- import gmpy2 ciper = [704796792, 752211 ...

  7. sicily 10330. Cutting Sausages

    #include<stdio.h> int main() {    int n,m,j,k;    while(scanf("%d%d",&n,&m)! ...

  8. NEMA-0183(GPRMC GPGGA)详细解释

    NEMA-0183(GPRMC GPGGA)详细解释 nmea数据如下:  $GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5. ...

  9. printf()参数的处理

    下面程序的输出为? #include <stdio.h> int main(void) { ,b=,c=; printf(),(c = c*)); ; } 答案是110..40..60 这 ...

  10. 【ACM】NYOJ_288_Time_20130725

    Time时间限制:1000 ms  |  内存限制:65535 KB 难度:2描述 Digital clock use 4 digits to express time, each digit is ...