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