AbstractList 重写 equals() 方法
题目内容

题目内容很简单,就是创建 ArrayList 和 Vector 集合,向两者添加相同内容的字符串,最后用 equals() 方法比较是否相等。
这里就考察了 "==" 和 equals() 方法的知识点。
这里我最开始以为输出为 false,但实验了一下,结果为 true!
为什么呢?因为我不知道 ArrayList 和 Vector 的共同父类 AbstractList 重写了 Object 类的 equals() 方法。
重写方法体如下:
public boolean equals(Object o) {
// 这里利用 == 判断两个集合是否为同一引用同一地址,因为是 == 比较的
if (o == this)
return true;
// 这里判断比较集合是否为 List 的实例,如果不是直接返回 false
if (!(o instanceof List))
return false;
// 创建迭代器
ListIterator<E> e1 = listIterator();
ListIterator<?> e2 = ((List<?>) o).listIterator();
// 在两者都有元素的情况下,比较两者元素是否相等
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
// 这里的比较规则如下:
// 1. 两者元素其中一个为 null, 但另一个不为 null, 则返回 false
// 2. 其中一个元素不为 null, 但两者使用 equals() 方法比较为 false, 则返回 false
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
// 集合元素变量完之后,且循环体没有返回 flase, 则 如果任意一个集合还有元素则返回 false
return !(e1.hasNext() || e2.hasNext());
}
由于题目中集合的泛型为 String,而 String 也重写了 equals() 方法,所以,题目中的集合内容也是相同的,即比较结果为 true。
如果元素内容为其他的,且没有重写 equals() 方法,那么比较结果就为 false。
如:
public void test() {
StringBuilder sb = new StringBuilder("demo");
StringBuilder sb1 = new StringBuilder("demo");
ArrayList<StringBuilder> arrayList = new ArrayList<StringBuilder>();
arrayList.add(sb);
Vector<StringBuilder> vector = new Vector<StringBuilder>();
vector.add(sb1);
System.out.println(arrayList.equals(vector));
}
补充:
很多人并不知道 Integer 类也重写了 equals() 方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
//这里很明显,看似使用 == 比较,但是调用了 intValue() 方法返回 int 类型,所以就是使用 == 比较基本数据类型,比较的也就是值是否相等了
return value == ((Integer)obj).intValue();
}
return false;
}
public int intValue() {
return value;
}
AbstractList 重写 equals() 方法的更多相关文章
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- java重写equals方法
@Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...
- 重写equals()方法时,需要同时重写hashCode()方法
package com.wangzhu.map; import java.util.HashMap; /** * hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,<br/&g ...
- 为什么重写equals方法还要重写hashcode方法?
我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写 ...
- 为什么要重写equals()方法与hashCode()方法
在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object ...
- C#中在比较自定义对象的时候要重写Equals方法
using System;using System.Collections.Generic;using System.Text; namespace Equal{ using System; c ...
- 为什么重写 equals 方法 必须重写 hashCode
自己学到这,就记录了下来,代码都是自己敲得,有不对的地方希望大神指点出来 为什么重写 equals 方法 必须重写 hashCode 如果你重写了equals,比如说是基于对象的内容实现的,而不重写 ...
- Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- java开发----自定义对象,重写equals方法
javaweb开发中,用到了好多自定义对象,这时候如果不重写equals方法,很多时候都会返回false, 因此我们必须习惯重写这个方法. 重点: 1.equals比较俩对象时比较的是对象引用是否指向 ...
随机推荐
- 401 Binary Watch 二进制手表
详见:https://leetcode.com/problems/binary-watch/description/ C++: class Solution { public: vector<s ...
- 所有版本chrome、chromedriver、firefox下载链接
1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是原版的就不得而知了. http://www.slimjet.com/ch ...
- 循环语言(for)
循环语句: 给出初始条件,先判断是否满足循环条件,如果不满足条件则跳过for语句,如果满足则进入for语句循环,for语句内的代码执行完毕之后,将按照状态改变改变变量,然后判断是否符合循环条件,符合继 ...
- 21 调试我们的C#程序
我们写的C#程序,很多的时候不是能一次就写对的.尤其是在实际的项目中,你经常要做的工作就是不断修改你写的程序,让它正常运行.程序有错误,主要是两种情况.一种是程序报错了,不能正常运行下去.另一种是程序 ...
- 数据库恢复挂起解决办法【MSSQL】
新建查询输入如下代码运行 - -把test改成你需要修复的数据库名 USE master GO ALTER DATABASE test SET SINGLE_USER GO ALTER DATABAS ...
- LN : leetcode 515 Find Largest Value in Each Tree Row
lc 515 Find Largest Value in Each Tree Row 515 Find Largest Value in Each Tree Row You need to find ...
- 创建对象——单例(Singleton)模式
单例(Singleton)模式: 保证一个类在系统里只能有一个对象被实例化. 如:缓存池.数据库连接池.线程池.一些应用服务实例等. 难点:在多线程环境中,保证实例的唯一性. ...
- MySQL——基本安装与使用
基本安装 下载地址:https://dev.mysql.com/downloads/mysql/ 选择解压版本:mysql-5.7.21-winx64.zip 以管理员身份打开cmd(除了安装服务不要 ...
- DIV自动居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【sqli-labs】 对于less34 less36的宽字节注入的一点深入
1.AddSlashes() 首先来观察一下是如何通过构造吃掉转义字符的 先将less 34的网页编码换成gbk 加上一些输出 echo "Before addslashes(): &quo ...