equals之List
School类
package com.collection.equals;
/*
* 定义一个学校类 相当于一个学校模板
* 状态: 1.学校id 2.学校名称
* */
public class School {
private int id;
private String name;
public School(int id, String name) {
this.id = id;
this.name = name;
}
public School() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
前面也提到过 == 和equals的区别
具体链接:== 和 equals区别
直接赋值方式:创建的对象存放在字符串对象池里 如果再创建一个一模一样的 不会再创建
实例化方式: 每次创建都会分配一个新的内存空间出来
System.out.println(list.contains(new School(1,"上海交大")));
School school1 = new School(1, "上海交大");
School school2 = new School(1, "上海交大");
System.out.println(school1.equals(school2));
System.out.println(school1 == school2);
/*
* System.out.println(school1.equals(school2)); 返回值 false
* System.out.println(school1 == school2); 返回值 false
* 因为 每次实例化创建都会分配一个新的内存空间出来 哪怕数据是一模一样
* 在内存中的地址都是不同的
* */
list接口中的contains方法
package com.collection.equals;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/*
* list 接口
* 重写equals方法
* */
public class ListEquals {
@Test
public void test() {
// 1. 定义一个list对象
List list = new ArrayList();
// 2. 添加数据
list.add(123);
list.add(345);
list.add(666);
list.add(new School(1, "上海交大"));
// 3. contains方法判断
System.out.println(list.contains(new School(1, "上海交大")));
/*
* System.out.println(list.contains(new School(1,"上海交大"))); 返回值 false
* 因为 ArrayList 类中 contains 方法 通过 equals 方法来判断是否相等
* o相当于 new School(1,"上海交大")
* lementData[i] 则是 list中每一个元素
* o.equals(elementData[i])
* */
}
}
ArrayList源码contains方法

由上可以看出 当调用 list.contains(new School(1,"上海交大"))
实际比较的是Object类中 equals()方法 前提是 子类没有重写equals方法 否则就是调用自身的
public boolean equals(Object obj) {
return (this == obj);
}
由上可以看出 Object的equals方法 内部判断 return this == obj this是调用当前函数的对象 obj就是形参
如果循环遍历到了list中的new School(1, "上海交大")这一项 与 new School(1, "上海交大") 进行equals
对比 其实就跟上面例子表述的一样 返回值false 因为 new了两次 每次实例化都会有一个新的地址值
所以 如果是自定义类 必须要重写 equals方法
School重写equals方法
public class School {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
School school = (School) o;
if (id != school.id) return false;
return name != null ? name.equals(school.name) : school.name == null;
}
}
再次执行contains方法 返回true
小结
- 如果在
List中查找元素 自定义类必须正确的重写 equals方法 Java标准库提供的String、Integer等已经覆写了equals()方法 - 反之 如果不需要查找元素 则不用重写
equals之List的更多相关文章
- equals变量在前面或者在后面有什么区别吗?这是一个坑点
我就不废话那么多,直接上代码: package sf.com.mainTest; public class Test { public static void main(String[] args) ...
- How to implement equals() and hashCode() methods in Java[reproduced]
Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and ...
- 【特种兵系列】String中的==和equals()
1. 小样示例 public static void main(String[] args) { String a = "a" + "b" + 123; Str ...
- (转)浅谈Java中的equals和==
原文地址: http://www.cnblogs.com/dolphin0520/p/3592500.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new S ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- List<T>Find方法,FindAll方法,Contains方法,Equals方法
假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...
- 让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较
重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提 ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- Equals和ReferenceEquals
稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...
- 【原创】Java和C#下String类型中的==和equals的原理与区别
一.Java下 1.几个例子 public static void main(String[] arge) { String str1 = new String("1234"); ...
随机推荐
- STM32+Air202+Air530+HXDZ-30102-ACC心率血氧GPS采集上传到阿里云
所有资料都在QQ群1121445919 主要功能 HXDZ-30102-ACC采集心率血氧数据 STM32通过串口将数据转发到air202模块 air202将数据上传到阿里云平台进行展示与处理 整合合 ...
- BootStrap Table超好用的表格组件基础入门
右侧导航条有目录哟,看着更方便 快速入门 表格构建 API简单介绍 主要研究功能介绍 快速入门 最好的资源官方文档 官方文档地址****https://bootstrap-table.com/docs ...
- 在C++中使用openmp进行多线程编程
在C++中使用openmp进行多线程编程 一.前言 多线程在实际的编程中的重要性不言而喻.对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的st ...
- DDL和客户端ip监控
DDL触发器监控脚本部署步骤 以下操作请使用sys用户: --第一步:创建表(此表主要保存ddl触发器产生的信息),可以根据不同的业务,使用相关的监控用户,在此监控用户为c##upctest 从可维护 ...
- gimp 缩放图片 python script
滤镜 -> Python Fu -> 控制台,复制粘贴下面代码. 然后 scale_image(800, 800) 图片自动缩放为 800*800 了 这个代码是傻傻的缩放,你可以把它改成 ...
- python实现分水岭算法分割遥感图像
1. 定义 分水岭算法(watershed algorithm)可以将图像中的边缘转化为"山脉",将均匀区域转化为"山谷",在这方面有助于分割目标. 分水岭算法 ...
- adb 常用命令大全(1)- 汇总
adb 常用命令大全系列 基础命令 查看手机设备信息 应用管理 日志相关 模拟按键输入 其他实用功能
- Linux内核中的Workqueue机制分析
1. 什么是workqueue Linux中的workqueue(工作队列)主要是为了简化在内核创建线程而设计的.通过相应的工作队列接口,可以使开发人员只关心与特定功能相关的处理流程,而不必关心内核线 ...
- CSS002. 字体穿透蒙层(用img设置字体的color)
之前在逛Apple Store时看到了下面的UI: 交互图标非常圆滑上手也很舒服,虽然背景底色本就是白底,但是只依赖css能不能使 "+" 穿透背景看到底色 ? 大致思路如下: ...
- 任由文字肆意流淌,更自由的开源 Markdown 编辑器
对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...