今天在做金碟系统与我们系统的对接的时候需要做一个客户同步

在同步时,需要比较对象,对查询出的数据库的数据进行比较

for(int i=0;i<list2.size();i++){
if(! list1.contains(list2.get(i))){
//把对应的对象加入到返回的结果集List中去就可以了
List l = new ArrayList();
l.add(list2);
System.out.println(l.toString());
}
}

但是返回值总是false,在网上看到答案:需要在entity中重写equals方法:

    ArrayList的contains方法
java
今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放Student类的ArrayList 但在调用list.contains(user)时总是返回false。 去看了下ArrayList的源码,源码如下:
Java代码
public boolean contains(Object o) {
return indexOf(o) >= 0;
} public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
[java] view plaincopy
public boolean contains(Object o) {
return indexOf(o) >= 0;
} public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
} 发现在contains方法会调用 o.equals(elementData[i])方法,其中elementData[i]是个object类的实例。也就是说我在调用list.contains(user)时实际上比较的是user.equals(object) 这当然会返回false。 正确的方法,在Student类中改写equals方法。 改写的代码如下:
Java代码
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student u = (Student) obj;
return this.name.equals(u.name)
&& this.id.equals(id);
}
return super.equals(obj);

将需要对比的数据写到equals方法中,没写进去不比较,其他字段不同contains还是返回true,像这样:

Entity:

public class Student {
private Integer id;
private String name;
private Integer isBack;
// ......
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student u = (Student) obj;
return this.name.equals(u.name)
&& this.id.equals(id);
}
return super.equals(obj);
}
}
    public static void main(String[] args) {
List<Student> list1 = new ArrayList<Student>(); Student s = new Student();
s.setId(1);
s.setName("1");
list1.add(s); List<Student> list2 = new ArrayList<Student>();
Student student2 = new Student();
student2.setId(1);
student2.setName("1");
student2.setIsBack(1);
list2.add(student2); Student student3 = new Student();
student3.setId(1);
student3.setName("22");
student3.setIsBack(213123123);
list2.add(student3); for(int i=0;i<list2.size();i++){
if(! list1.contains(list2.get(i))){
//把对应的对象加入到返回的结果集List中去就可以了
List l = new ArrayList();
l.add(list2);
System.out.println(l.toString());
}
}
}

但是在重写equals方法的时候,如果一个值为null,就会报空指针异常,所以可以在重写equals方法的时候将equals改为 ==

public boolean equals(Object obj) {
if (obj instanceof Student) {
Student u = (Student) obj;
return this.name==(u.name)
&& this.id==(id);
}
return super.equals(obj);
}

执行效果:

public static void main(String[] args) {
List<Student> list1 = new ArrayList<Student>(); Student s = new Student();
s.setId(1);
s.setName("1");
list1.add(s); List<Student> list2 = new ArrayList<Student>();
Student student2 = new Student();
student2.setId(1);
student2.setIsBack(1);
list2.add(student2); Student student3 = new Student();
student3.setId(1);
student3.setName("111");
student3.setIsBack(213123123);
list2.add(student3); for(int i=0;i<list2.size();i++){
if(! list1.contains(list2.get(i))){
//把对应的对象加入到返回的结果集List中去就可以了
List l = new ArrayList();
l.add(list2);
System.out.println(l.toString());
}
}
}

List集合中的对象比较,取出不同对象的更多相关文章

  1. 使用LinkedList类生成一个集合对象,循环加入“小样1”,“小样2”,“小样3”,“小样4”,“小样5”……“小样100”。输出这个集合的大小。再使用循环删除这个集合中所有名字为偶数的对象,比如“小样6”,“小样100”,都是偶数名。最后:循环输出集合中所有的对象,看是否删除成功。

    package com.lanxi.demo1_8; import java.util.Iterator; import java.util.LinkedList; public class Test ...

  2. Map集合中value()方法与keySet()、entrySet()区别

    http://blog.csdn.net/liu826710/article/details/9001254 在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, ...

  3. map集合中value()、keySet()、entrySet()区别

    在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet():将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代方式取出所有的键, ...

  4. Map集合中value()方法与keySet()、entrySet()区别 《转》

    在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet(): 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代方式取出所有的键 ...

  5. 牛客网Java刷题知识点之泛型概念的提出、什么是泛型、泛型在集合中的应用、泛型类、泛型方法、泛型接口、泛型限定上限、泛型限定下限、 什么时候使用上限?泛型限定通配符的体现

    不多说,直接上干货! 先来看个泛型概念提出的背景的例子. GenericDemo.java package zhouls.bigdata.DataFeatureSelection; import ja ...

  6. Map集合中的方法

    Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...

  7. 后端list集合中的数据传递到前台HTML中显示(表格形式)

    关键字:web项目中前后台数据传递问题 在学习web项目的过程中,我们肯定会遇到前后台数据交换问题.这个问题我也思考了很久,今天借此总结一下.由于博主水平有限,如有不当之处,还请大家多多指正,,废话不 ...

  8. java8 从对象集合中取出某个字段的集合

    public class FeildTest { public static void main(String[] args) { //定义list集合 List<P> list = Ar ...

  9. java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

    import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...

  10. 使用Properties集合存储数据,遍历取出Properties集合中的数据和Properties集合中的方法store和load

    package com.yang.Test.PropertiesStudy; import java.io.FileWriter; import java.io.IOException; import ...

随机推荐

  1. (五)TortoiseSVN 客户端-----安装

    svn客户端类型 svn客户端需要通过网络访问svn服务端提交文件.查询文件等,可通过以下客户端类型访问svn服务端: 使用Subversion提供的客户端命令,使用方式:在命令行下输入命令操作. 使 ...

  2. Laravel Service Provider 开发时设置延迟加载时遇到的问题

    因实际项目需求,近日在开发 laravel-database-logger 包的时候,发现设置 ServiceProvider defer 属性设置为 true 时,会导致在register 方法中注 ...

  3. 安装OUD报错,unsupported classversion 51.0

    查找,错误代码,在一篇博客中看到:补充:后经实例证明,在eclipse中进行开发的时候,build path 中JDK进行类库的编译(就是你使用类在不在这个JDK中),java compiler co ...

  4. MySQL联合索引最左匹配范例

    MySQL联合索引最左匹配范例 参考文章:http://blog.jobbole.com/24006/ 创建示例表. 示例表来自MySQL官方文档: https://dev.mysql.com/doc ...

  5. 关于 org.hibernate.TransientObjectException 异常

    在Hibernate的关联关系中,如果一个对象A 持有 对象 B 的引用,如果先保存 A ,再保存B,那么会出现 org.hibernate.TransientObjectException 异常. ...

  6. pthread 的几个结构体

    http://blog.csdn.net/yangzhongxuan/article/details/7397139 /* Copyright (C) 2002,2003,2004,2005,2006 ...

  7. SSH 本地和服务器传输

    [转]https://www.cnblogs.com/magicc/p/6490566.html SCP 使用方式如下: 1.上传本地文件到服务器 scp /path/filename usernam ...

  8. sparkStreamming原理

    一.Spark Streamming 是基于spark流式处理引擎,基本原理是将实时输入的数据以时间片(秒级)为单位进行拆分,然后经过spark引擎以类似批处理的方式处理每个时间片数据. 二.Spar ...

  9. 【洛谷P1774】最接近神的人

    最接近神的人_NOI导刊2010提高(02) 用类似于桶的方法,树状数组记录原序列的某位置之前已经插入了多少个数, 插入时树状数组单点加1即可 先排一遍序,从大到小插入所有数在原序列的位置, 统计每次 ...

  10. windows mysql密码设置与破解

    1.设置密码 mysqladmin -uroot -p password "1234" 查看当前用户: 2.破解密码 关闭 MySQL 服务 执行 mysqld --skip-gr ...