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

小结

  1. 如果在List中查找元素 自定义类必须正确的重写 equals方法 Java标准库提供的String、Integer等已经覆写了equals()方法
  2. 反之 如果不需要查找元素 则不用重写

equals之List的更多相关文章

  1. equals变量在前面或者在后面有什么区别吗?这是一个坑点

    我就不废话那么多,直接上代码: package sf.com.mainTest; public class Test { public static void main(String[] args) ...

  2. 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 ...

  3. 【特种兵系列】String中的==和equals()

    1. 小样示例 public static void main(String[] args) { String a = "a" + "b" + 123; Str ...

  4. (转)浅谈Java中的equals和==

    原文地址: http://www.cnblogs.com/dolphin0520/p/3592500.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new S ...

  5. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  6. List<T>Find方法,FindAll方法,Contains方法,Equals方法

    假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...

  7. 让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较

    重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提 ...

  8. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  9. Equals和ReferenceEquals

    稍微分析下一下两个方法的区别: public static bool Equals(object objA, object objB); public static bool ReferenceEqu ...

  10. 【原创】Java和C#下String类型中的==和equals的原理与区别

    一.Java下 1.几个例子 public static void main(String[] arge) { String str1 = new String("1234"); ...

随机推荐

  1. Mybatis出现错误org.apache.ibatis.executor.ExecutorException: No constructor found in

    错误显示没有发现构造器. 其实就是重写了构造器后,忘了补写一个默认的空参构造器了.此类的错误还经常出现在spring等这种大量使用反射的框架中.因为这些框架在调用反射的类后会默认调用默认的构造器 解决 ...

  2. 将svn项目导出,再导入到其他工作空间

    方法一: 对于一致svn地址,本地没有的项目,直接eclipse中svn检出即可. 若本地有项目,但想导入到另一个工作空间(即拷贝一份,不想再从svn拉),则需要用export方法. 方法二(expo ...

  3. go语言内存对齐

    内存对齐 为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址并占用合适的长度,这就是内存对齐 每种类型的对齐值就是他的内存边界 64位 类型 对齐边界 (对齐值) int8 1byte ...

  4. PC微信多开

    1.桌面上面新建一个  多开.txt . 2.将下面的内容拷贝进去 TASKKILL /F /IM wechat.exestart "" "E:\wechat\WeCha ...

  5. Shell脚本基础及基本常用命令

    1.概述 脚本语言(shell.python):解释性语言,用解释器解释 运行效率低 | c.java:描述性语言,运行效率高 以.sh结尾会有高亮显示 执行: sh hello.sh 或者 chmo ...

  6. Spring系列之Mybatis动态代理实现全过程?回答正确率不到1%

    面试中,可能会问到Spring怎么绑定Mapper接口和SQL语句的.一般的答案是Spring会为Mapper生成一个代理类,调用的时候实际调用的是代理类的实现.但是如果被追问代理类实现的细节,很多同 ...

  7. Django——数据库连接配置

    配置settings.py : DATABASES = { 'default': { #default表示默认,也可以指定app 'ENGINE': 'django.db.backends.mysql ...

  8. Linux下查看哪个网口插了网线

    场景: 一台服务器有多个网卡,一个网卡有多个网口,当插了一根网线的时候,不知道网线是插在哪一个网口. 1.查看网口信息 2.查看网口是否插了网线(命令ethtool) 命令:ethtool + 网口名 ...

  9. IPSec协议框架

    文章目录 1. IPSec简介 1.1 起源 1.2 定义 1.3 受益 2. IPSec原理描述 2.1 IPSec协议框架 2.1.1 安全联盟 2.1.2 安全协议 报文头结构 2.1.3 封装 ...

  10. Typescript详解

    typescript由微软开发的一款开源编程语言. ts是jacascript的超集,遵循ES6,ES5规范,ts扩展了js的语法. ts更像后端java,c#这样的面向对象的语言,可以让js开发大型 ...