关于比较的一点笔记

  在Java中要进行两个对象的比较时,会用到关系运算符。通常关系运算符生成的是一个boolean值结果。它们评价的是运算对象值之间的关系。一般关系运算符包括小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)以及不等于(!=)。等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型。

  关系运算符==和!=适用于所有对象,但是会有一些有趣的现象,下面是测试代码

 1 public class Equivalence {
 2     public static void main(String args[]){
 3
 4         Integer n1 = new Integer(47);
 5
 6         Integer n2 = new Integer(47);
 7
 8         System.out.println(n1 == n2);
 9
10         System.out.println(n1 != n2);
11     }
12 }

  可以猜测一下测试结果,是不是先是true,再是false。

运行结果
    false
    true

  很愉快测试结果刚好反过来了,这是因为两个Integer对象的内容尽管是相同的,但是n1和n2是两个不同的对象,这里比较的是两个不同的Integer对象而非比较两个对象的内容,输出结果过当然就是先false后true了。

  那么如何比较两个对象的实际内容是否相同呢?这时候就必须使用所有对象都适用的特殊方法equals()。但是equals()方法不适用于“主类型”,也就是基本数据类型,那些数据类型直接使用==和!=进行比较即可。下面再来看一个测试代码

public class Equivalence {
    public static void main(String args[]){

        Integer n1 = new Integer(47);

        Integer n2 = new Integer(47);

        System.out.println(n1.equals(n2));
    }
}

  这个程序的结果是符合我们的预期的,结果是true,但事情还没完。假设我们创建了自己的类,例如

public class Value {
    int i;
}
public class Equivalence {
    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));
    }
}

  这时候的结果又会变回false。出现这问题的原因是因为equals()的默认行为是比较两个指向对象的引用,所以除非在自己的类中改变了equals(),否则不会出现我们希望的行为。注意到equals()这种行为方式能够避免一些本该不用出现的问题。

时间: 2024-10-11 16:50:30

关于比较的一点笔记的相关文章

阅读xtrabackup代码的一点笔记

xtrabackup binary最重要的两个过程是backup和prepare,对应的函数分别是xtrabackup_backup_func()和xtrabackup_prepare_func(),这里做一些阅读代码时的笔记. xtrabackup backup的线程模型: 1. 一个log拷贝线程: 2. n个ibd文件拷贝线程: 3. 一个io监控线程: 4. 通过suspend_start/suspend_end文件来标注是否启动终止线程: typedef struct { datafi

[转&amp;精]IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序. IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有

一点笔记

去年年底的时候买了一只Kindle Paperwhite,因为尺寸较小,方便携带,所以也比较适合看一些非技术类的图书.加上每天上下班路上的2个小时,等电梯时间,以及吃饭等座的一些闲暇时间,看了一些书,有时候突然觉得,只有这些小的碎时间才是最自由的,平常上班时间为了生活,晚上回来要休息积蓄能量.几个月下来也零零散散的看了一些书,有时候看着看着很想写点东西,就在手机上用OneNote记了作为读书笔记,本来想在朋友圈分享的,由于字数限制就写了这篇水文,下面就按照觉得有意思的顺序来逐个些吧,共九本书,后

关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调用编写好的DLL进行计算的. 目标 使用c++把类封装到dll,并在vb.net中调用该dll,使用该dll中封装好的类.在查找资料的过程中,发现vb.net调用dll的方法主要有两种. (IDE:Visual Studio 2013 professional) 方法一:使用Declare语句 vb

IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序.IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有一

cookie随便写的一点笔记(抄书的)

cookie是保存在客户端的文本,能够在一定程度上提高用户体验.Servlet API 中提供了Cookie类,可以创建Cookie对象,并通过响应中的addCookie方法,将cookie保存到客户端. Cookie的概念与使用:    cookie是保存在客户端的文本    Servlet API提供了Cookie类,可以将文本信息封装成Cookie对象    HttpServletResponse接口中提供了addCookie方法,将cookie添加到响应中    HttpServletR

[JAVA Programming] 关于JList的一点笔记

这次写JAVA课的大作业,首先不得不佩服所给的dictionary.txt文件的厉害之处啊,各种大小写.连字符还有各种词组的不同情况在自己测试的时候都中奖了,我该高兴么... 其实要求不高,大概就是一个词典的查询软件,提供了后台词典,只要完成其中的文件I/O,进行String的处理就可以了. 下面其实主要是一些算法问题,查找的话,既然有序(但是从某些角度说,'-'的值要比a-z小啊,但是在dictionary中的顺序却不是这样啊~~所以我暴力地进行了一次QuickSort...)果断O(logn

在使用Linq中 遇到问题的一点笔记

直接上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 只作为快速的测试,没考虑编码规范的问题 /// </summary> class Program { static void Main(string[] args) { List<Student

C++中函数处理数组的一点笔记

// pointDemo0905.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" //写法1//int sum(int array[],int num);//写法2int sum(const int *array,int num); void revalue(int r,int *array,int num); int _tmain(int argc, _TCHAR* argv[]){ int adata[8]={1,2,3,4,5,6,7,8};