equals 方法是 java.lang.Object 类的方法。

下面从两个方面来说明equals()和==的差别:
(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,故相等。
s1 == s3; //false
s1.equals(s3); //true
s3 == s4; //true,字符串常量所生成的变量,存放于常量池中,故其中所存放的内存地址是相等的
s3.equals(s4); //true

  【注意】

    在字符串构建中有个特殊字符串类型StringBuffer,StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较“地址”的。所以会有如下情形出现:

StringBuffer s1 = new StringBuffer("a");

StringBuffer s2 = new StringBuffer("a");

 s1.equals(s2) //false

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

A obj1 = new A();
A obj2 = new A();
obj1==obj2; //false
obj1.equals(obj2); //false A obj1 = new A();
obj2 = obj1;
obj1==obj2; //true
obj1.equals(obj2); //true

【总结】:

  1. equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。

    == 比较符是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。

  2. equals 方法是 java.lang.Object 类的方法,Object类中的equals方法是用来比较“地址”的,但是String类中重新定义了equals这个方法,而且比较的是值,而不是地址。

  . 如果是基本类型(byte, short, int, long, float, double, char,boolean)比较,那么只能用==来比较,不能用equals();

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

  5. 注意一个基本的原则:在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法

重写equals()方法的一般规则:

a、先用“==”判断是否相等(是否指向同一对象)。
 
b、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。
 
c、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。
 
d、判断类的成员是否对应相等。往下就随意发挥了。

【例子】判断被比较对象user的username 属性和待比较对象的username相等:

    public class User {
private String username; @Override
public boolean equals(Object obj){
if(obj == null){
return false;
}else {
if(this.getClass() == obj.getClass()){
User u = (User) obj;
if(this.getUsername().equals(u.getUsername())){
return true;
}else{
return false;
}
}else{
return false;
}
}
}
}

java学习——equals()和==的比较的更多相关文章

  1. java学习--equals

    Object类是所有类的基类. Object类有equals方法.而继承Object中的equals方法判断的是两个对象的引用是否相等,相当于"==",也就是说只有比较的两个对象为 ...

  2. Java学习--Equals与“==”

    在Java规范中,它对equals()方法的使用必须要遵循如下几个规则: equals 方法在非空对象引用上实现相等关系: 1.自反性:对于任何非空引用值 x,x.equals(x) 都应返回 tru ...

  3. java学习-- equals和hashCode的关系

    hashcode的目的就是在hashset或者hashmap等中比较两个对象相等时,减少equals的使用次数来提高效率 以下为摘录 java中hashcode和equals的区别和联系 HashSe ...

  4. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. 20145330第五周《Java学习笔记》

    20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...

  7. Java学习总结:飘逸的字符串

    Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字 ...

  8. Java学习-040-级联删除目录中的文件、目录

    之前在写应用模块,进行单元测试编码的时候,居然脑洞大开居然创建了一个 N 层的目录,到后来删除测试结果目录的时候,才发现删除不了了,提示目录过长无法删除.网上找了一些方法,也找了一些粉碎机,都没能达到 ...

  9. Java学习-031-JSON 之五 -- 特定数据获取(JSONObject满足特定键值)

    前面几篇博文分别讲述了 JSON 的 概要知识.简单数据获取.封装cssSelector数据获取方法.JSONObject 是否包含 key_value,请自行阅读相关博文. 在日常的接口测试脚本编写 ...

随机推荐

  1. IDEA + SSH OA 第一天(项目收获:Hibernate XML)

    之前都是用工具逆向生成代码,很少写配置文件,今天试着使用,有几点需要注意 Cascade(级联): Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系. Cascade属性的可能 ...

  2. Java String简单知识点总结

    1.字符串的比较 public void run(){ //str1在池中 String str1 = new String("String"); //str2,str3 存在于堆 ...

  3. 测试——约跑APP

    项目名:约跑APP 用户需求规格说明书URL:http://www.cnblogs.com/liquan/p/6071804.html 组长博客URL:http://www.cnblogs.com/l ...

  4. jenkin重新注册用户

    http://www.cnblogs.com/xiao-fy/

  5. 剖析Vue原理&实现双向绑定MVVM-2

    vue.js 最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化得不能再简化的代码实现一个简单的 hello world 示例. 一 ...

  6. [LeetCode] MaximumDepth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  7. SDOI2017 解题报告

    数字表格 \(T\)次询问,每次给出\(n,m(n,m\le 10^6)\),\(f\)为斐波那契数列,\(f_0=0,f_1=1\),求: \[ \prod _{i=1}^n\prod _{j=1} ...

  8. 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash

    题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...

  9. [BZOJ3507]通配符匹配

    3507: [Cqoi2014]通配符匹配 Time Limit: 10 Sec  Memory Limit: 128 MB Description 几乎所有操作系统的命令行界面(CLI)中都支持文件 ...

  10. 洛谷 P1171 售货员的难题 【状压dp】

    题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...