廖雪峰Java5集合-2List-2编写equals方法
List是一种有序链表:
- List内部按照放入元素的先后顺序存放
- 每个元素都可以通过索引确定自己的位置
- boolean contains(Object o) 是否包含某个元素
- int indexOf(Object o) 查找某个元素的索引,不存在返回-1
1.String\Integer等已经覆写了equals方法
import java.util.*;
public class Main {
public static void main(String[] args){
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add(null);
list.add(3,"java");
list.add(4,"python");
System.out.println(list.toString()+"是否包含null:"+list.contains(null));
System.out.println(list.toString()+"是否包含hello:"+list.contains("hello"));
System.out.println(list.toString()+"是否包含ruby:"+list.contains("ruby"));
System.out.println(list.toString()+"hello的索引::"+list.indexOf("hello"));
System.out.println(list.toString()+"ruby的索引:"+list.indexOf("ruby"));
}
}

问题:list.add("hello")和list.contains("hello"))是不是一个实例?如果不是,是否依然可以使用contains方法 ?
```#java
//先确保不是一个实例
List list = new ArrayList();
list.add(new String("C"));
System.out.println(list.contains(new String("C")));
```

原因:List内部使用equals方法判断2个元素是否相同
```#java
//演示代码
public class ArrayList{
Object[] elementData;
public boolean contains(Object o){
for(int i=0;i2.重写equals方法
Person.java
package com.testList;
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
@Override
public String toString(){
return "(Person:"+name+","+age+")";
}
}
Main.java
import java.util.*;
public class Main {
public static void main(String[] args){
List<Person> list = new ArrayList<>();
list.add(new Person("小明",12));
list.add(new Person("小红",15));
list.add(new Person("小军",13));
System.out.println(list);
System.out.println(list.contains(new Person("小军",13)));
}
}

在Person类中并没有覆写Objects.equals()方法,此时equals使用==来判断2个Object的引用,因此contains返回是false。为了修复这个逻辑,使contains返回true,此时要编写equals方法
重写equals方法
public boolean equals(Object o){
if (this == o){
return true;
}
if (o instanceof Person){
Person p = (Person) o;
return p.name.equals(this.name) && p.age == this.age;
}
return false;
}
System.out.println(list.contains(new Person("小红",15)));

当传入的name为null时,会报java.lang.NullPointerException
```#java
list.add(new Person(null,15));
System.out.println(list.contains(new Person(null,15)));
```

```#java
//为了解决java.lang.NullPointerException
public boolean equals(Object o){
if (this == o){ //判断传入的对象o是不是当前的对象this
return true;
}
if (o instanceof Person){ //判断传入的对象o是不是Person类型
Person p = (Person) o;
return (p.name == this.name||p.name != null && p.name.equals(this.name)) && p.age == this.age;
}
return false;
}
<img src="https://img2018.cnblogs.com/blog/1418970/201903/1418970-20190311200855542-421064474.png" width="500" />
使用JDK Objects自带的equals方法精简代码
```#java
public boolean equals(Object o){
if (this == o){
return true;
}
if (o instanceof Person){
Person p = (Person) o;
return Objects.equals(p.name,this.name) && p.age == this.age;
}
return false;
}

总结:
如果要在List中查找元素:
- List的实现类通过元素的equals方法比较两个元素
- 放入的元素必须正确覆写equals方法
* jdk提供的String、Integer等已经覆写了equals方法 - 编写equals方法可借助Objects.equals()判断
如果不在List中查找元素:
- 不必覆写equals方法
廖雪峰Java5集合-2List-2编写equals方法的更多相关文章
- 廖雪峰Java5集合-3Map-1使用Map
廖雪峰的视频不全,以下是疯狂Java关于Map的讲解 1.Map定义 Map是一种键值映射表,可以通过key快速查找value,同python的dict.key不允许重复,value可以重复. Map ...
- 廖雪峰Java5集合-4Set-1使用Set
集合 Set用于存储不重复的元素集合: boolean add(E e) boolean remove(Object o) boolean contains(Object o) int size() ...
- 廖雪峰Java5集合-3Map-Properties的使用
Properties用于读取配置 properties文件只能使用ASCII码 #表示注释 可以从文件系统读取.properties文件 Properties props = new Properti ...
- 廖雪峰Java5集合-1Java集合简介-1Java结合简介
1.集合 定义:集合就是一堆东西.集合里的东西,称为元素Element 数学中的集合: 有限集合: * 一个班所有的学生组成的集合 * 一个网站所有的商品组成的集合 无限集合: * 全体自然数集合 * ...
- 廖雪峰Java5集合-6Stack-1使用Stack
1.栈的定义 栈Stack是一种后进先出(LIFO: Last In First Out)的数据结构,可以看作一端封闭的容器,先进去的元素永远在底部,最后出来. 栈有2个重要的方法: push(E e ...
- 廖雪峰Java5集合-2List-1使用List
1.List定义 List是一种有序链表: List内部按照元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 类似数组,但大小可变 //List<E>是一种有序链表: //* Li ...
- 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述方法
下面给出一个实例,重新编写equals()方法,提供自定义的相等标准 public class PersonTest { public static void main(String[] args) ...
- 廖雪峰Java5Java集合-5Queue-1使用Queue
Queue特性和基本方法 Queue实现一个先进先出(FIFO, First In First Out)的队列.如收银台排队支付. Java中LinkedList实现了Queue接口,可以直接把Lin ...
- 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用
Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...
随机推荐
- 无用之flask
Oldboy s4 Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收 ...
- cenos7.0 安装docker
使用yum命令在线安装 yum install docker 安装后查看Docker版本 docker -v启动docker:systemctl start docker停止docker:syste ...
- Linux交叉工具链安装
这篇博文http://blog.csdn.net/u010957054/article/details/58056863 提到了一个好的百度网盘,里面有各个版本的交叉工具链. http://www.3 ...
- mysql条件查询-排除null ---oracle、mysql 区分总结
' AND IFNULL(c.`COURSE_NO`,'-1') != '-1' ;
- 【git】git使用
1.创建github账户 网站:https://github.com/ 注册省略 2.ssk-key客户端配置 作用:不用每次push,clone代码不需要输入用户名+密码 生成ssh-key ssh ...
- ionic1实现热更新以版本检测更新安装包的方法
1.需要下载热更新插件:插件名称是cordova-hot-code-push 首先打开cli,执行命令 npm install -g cordova-hot-code-push-cli 此功能主要是为 ...
- web网页【2】
前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...
- day25scala
PS:1.scala是开发spark平台的一种语言.2.如果开发spark的话,用scala开发是非常好的,Python的话一般,用java的话就是效果不好. -------------------- ...
- Unity 5.x Shader and Effects Cookbook(2nd) (Alan Zucconi Kenneth Lammers 著)
1. Creating Your First Shader 2. Surface Shaders and Texture Mapping 3. Understanding Lighting Model ...
- Python网络_TCP/IP简介
本章将介绍tcp网络编程,更多内容请参考:Python学习指南 Socket是网络编程的一个抽象概念,通常我们用一个Socket表示"打开了一个网络连接",而打开一个Socket需 ...