牛客网之刷题系列

牛客网

java专项练习

equals方法

【题目1】

有程序片段如下,以下表达式结果为 true 的是(B
Float s=new Float(0.1f);
Float t=new Float(0.1f);
Double u=new Double(0.1);

A. s==t
B. s.equals(t)
C. u.equals(s)
D. t.equals(u)

答案解析

  • Float类和Double类都重写对于的equals方法,在比较之前都会判断是否同属于Float对象或Double对象,如果不是直接返回false,如果是再继续比较对应的数值大小。
  • 题目A比较的是两个对象的地址,显然不同的对象地址不同,A是false。B同属于Float对象且值相等,true。C和D比较的对象不同,false。
  • JDK1.8的源码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >   // Float类重写了equals方法:
    > public boolean equals(Object obj) {
    > return (obj instanceof Float)
    > && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    > }
    > // Double类重写了equals方法:
    > public boolean equals(Object obj) {
    > return (obj instanceof Double)
    > && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value));
    > }
    >

Object类的描述

【题目1】

以下关于Object类的说法正确的是(B
A. Java中所有的类都直接或间接继承自Object,无论是否明确的指明,无论其是否是抽象类。
B. Java中的接口(interface)也继承了Object类
C. 利用”==”比较两个对象时,Java调用继承自Object的equals方法,判断是否相等。
D. 如果类的定义中没有重新定义toString()方法,则该类创建的对象无法使用toStrig()方法。

答案解析

  1. 类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。
  2. 接口和类是两个概念,但接口又和类具有一定的关系。类class是从java.lang.Object类派生而来,但接口interface并不是从某一个特定接口派生而来,两个interface可能没有任何交集,但两个class一定存在交集。接口不是Object的子类,但接口却隐士申明了Object中的所有可继承方法,类似于Object子类继承了它的所有可继承方法,区别只是这里申明的方法都是abstract形式,也即只有申明,没有方法体block。
  3. 对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即判断这两个对象时(不是比较这两个对象的内容)这时候需要用==操作符进行比较。但equals方法是用于比较两个独立对象的内容是否相同
  4. 所有对象(包括数组)都实现object的方法,object里面有toString() 这个方法,所以即使类的定义中没有重新定义toString()方法,但是它同样可以使用toString这个方法(因为它继承了Object这个类)

集合

【题目1】

判断对错。List,Set,Map都继承自继承Collection接口。(A
A. 错
B. 对

答案解析
png