在《学习Java,容易被你忽略的小细节(2)》中我们已经深入讨论过String类中equals()方法的使用,在本文中我们将进一步讨论equals()方法在其他境况下的使用方法。

  首先,我们先提供一个网址http://docs.oracle.com/javase/7/docs/api/,长期从事Java程序设计的程序员都知道这个网址。没错这里展示的就是Oracle公司提供的Java API的技术文档,以后大家如果在Java程序设计时遇到什么问题基本都可以在这里找到答案。

  大家都知道Java中根类是Object,在Java中每一个类都来源与java.lang.Object类。所以熟悉Object类提供的方法是非常重要的,这样才能在自己定义的类中使用它们。本文中我们仅讨论Object中equals()方法。

  Object类中默认实现equals()方法的语句如下:

public boolean equals(Object o)
{
return (this == o)
}

  显然,在Object类中使用equals()方法等价于使用==运算符,难道Java语言设计者闲的没事做定义了一个没用的方法吗?很明显这是不可能的,于是我们想测试一下在自定义类中equals()方法是否也等价于==运算符呢?

  测试代码:

public class Student{
String name;
int age;
String sex;
Student(String n,int a,String s){
name = n;
age = a;
sex = s;
}
public static void main(String[] args){
Student s1 = new Student("zhang",20,"male");
Student s2 = new Student("zhang",20,"male");
if(s1.equals(s2))
System.out.println("s1.equals(s2) 结果为true");
else
System.out.println("s1.equals(s2) 结果为false");
}
}

  显然s1和s2内容相同,但是并非同一对象。下面我们看一下运行结果:

  从运行结果上我们可以看出的确在自定义类中equals()方法也等价于==运算符,这是怎么一回事呢?

  但是我们来仔细回想一下String类中equals()方法调用的结果,很明显与我们上面做的测试不符。很多聪明的读者大概猜到是String类对equals()方法进行了覆盖。其实,在很多情况下程序员都会在自定义的类中覆盖equals()方法,使其变成用来判断对象内容是否相等的方法。这也是学习Java程序设计应该熟练掌握的技巧之一。

  下面提供Student类中equals()方法的具体实现。

    public boolean equals(Object o)
{
if(o instanceof Student)  //判断o是否是Student类
{
Student s = (Student)o;  //强制类型转换
return this.name.equals(s.name) &&
this.age == s.age &&
this.sex.equals(s.sex);
}
else
{
return false;
}
}

  测试结果:

  经过上面覆盖我们自定义的类中的equals()方法就可以实现类似String类中equals()方法的功能,用来判断对象内容是否相同了。

  下面再介绍一个有关equals()方法使用常见的集中错误:  

//No1
String s1;
String s2 = new String();
s1.equals(s2); //这时s1为null,程序编译时抛出异常NullPointerException

  

  上面就是学习Java,容易被你忽略的小细节(3)。

  欢迎继续关注本博更多新鲜动向,博主QQ:2584451009,有什么建议和忠告欢迎评论或留言。

学习Java,容易被你忽略的小细节(3)的更多相关文章

  1. 学习Java,容易被你忽略的小细节(2)

    昨天心情真的太糟糕了,写完<学习Java,值得注意你注意的问题(1)>之后,迎来些许的支持以后就是一片片的谴责.我的主页上涌现出许许多多Java方面的牛人,谴责我水平太低,写的问题太初级. ...

  2. 学习Java,值得你留意的问题(1)更名为《学习Java,容易被你忽略的小细节(1)》

    记得大二快要结束的时候,有个女孩子突然问我“你会Java吗,帮我做大作业好吗?” 实话说,那个女孩真的很漂亮,我当时也非常想帮她.但是我从来没有接触过Java,让我在短短的几天内完成Java程序设计课 ...

  3. java 性能优化:35 个小细节,让你提升 java 代码的运行效率

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  4. JAVA性能优化:35个小细节让你提升java代码的运行效率

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  5. java中的@Override标签,小细节大作用

    转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途                         ...

  6. Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)

    Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...

  7. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  8. 从零开始学习JAVA(入门基础)

    目录 博主从零开始学习JAVA(入门基础) 1.搭建JAVA开发环境 卸载JDK(未安装的请忽略) 安装JDK 2.编程语言中,何为编译型与解释型 编译型 解释型 3.第一个JAVA应用程序 4.JA ...

  9. 论新手该如何学习java?

    由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的时间,还有一个很重要的原因就是java这门语言更适合商业应用,所以高校里大部分博士老师们对此语言的了解甚至不比本科生多. 在这种环境下, ...

随机推荐

  1. M创aterial Design作风Android申请书--创建列表和卡

    本人全部文章首先公布于个人博客,欢迎关注,地址:http://blog.isming.me 上次说过使用主题,应用Material Design的样式,同一时候卡片布局也是Material Desig ...

  2. 发布与订阅SQLServer

    SQLServer 中发布与订阅 在对数据库做迁移的时候,会有很多方法,用存储过程,job,也可以用开源工具lettle,那么今天这些天变接触到了一种新的方法,就是SqlServer中自带的发布与订阅 ...

  3. WPF中 PropertyPath XAML 语法

    原文:WPF中 PropertyPath XAML 语法 PropertyPath 对象支持复杂的内联XAML语法用来设置各种各样的属性,这些属性把PropertyPath类型作为它们的值.这篇文章讨 ...

  4. 王立平--GC

    Gabage Collection:垃圾回收 是.net中对内存管理的一种功能. 垃圾回收器跟踪并回收托管内存中分配的对象,定期运行垃圾回收以回收分配给没有有效引用的对象的内存. 当使用可用内存不能满 ...

  5. Virtualization of iSCSI storage

    This invention describes methods, apparatus and systems for virtualization of iSCSI storage. Virtual ...

  6. 安装mysql5.7.17

    参见 网易云课堂的视频教程 :mysql视频教程

  7. STL优先级队列

    priority_queue 这是一个优先级队列的所有权值概念单向队列queue.在这个队列中.全部元素是按优先级排列的(也能够觉得queue是个按进入队列的先后做为优先级的优先级队列--先进入队列的 ...

  8. python3 基本使用多线程

    #coding=utf-8 import threading #进口threading from time import sleep import time def task1(): print (& ...

  9. react学习(7)——路由配置

    1. 新建文件routes.js,分别定义页面的路由信息和其他信息 const Routes = { : { title: "home", pageName: "home ...

  10. 记一次虚拟化环境下Windows IO性能的解析

    前言随着云计算技术与服务的发展和进步,越来越多的客户选择将业务部署到云端.但由于引入了虚拟化层,在业务部署过程中经常会遇到IO问题,通常也不易调试.本文主要介绍利用perf.systemtap等工具, ...