- 浏览: 1248874 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
masuweng:
嗯,写的很好
Mysql之Incorrect string value: '\xF0\x9F\x98\x89 \xE6...' -
秋水涛静:
来来来 你告诉我你贴的这代码有什么用??你给的下载包又有什么 ...
利用diyUpload做多图片上传及预览 -
andseny:
如果可以的话,求一份源码,谢谢 邮箱:846526948@q ...
利用diyUpload做多图片上传及预览 -
alloyer:
不错!可以使用,已验证。
Spring与jcaptcha集成 -
bewithme:
这和我去官网看有啥区别?
web之日期组件My97DatePicker
Java中的List是可以包含重复元素的(hash code 和equals),那么对List进行去重操作有两种方式实现:
方案一:可以通过HashSet来实现,代码如下:
class Student { private String id; private String name; public Student(String id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } Student other = (Student) obj; if (id == null) { if (other.id != null) { return false; } } else if (!id.equals(other.id)) { return false; } if (name == null) { if (other.name != null) { return false; } } else if (!name.equals(other.name)) { return false; } return true; } }
必须实现hashCode和equals两个方法,一会我们会看为啥必须实现
具体的操作代码如下:
private static void removeListDuplicateObject() { List<Student> list = new ArrayList<Student>(); for (int i = 0; i < 10; i++) { Student student = new Student("id", "name"); list.add(student); } System.out.println(Arrays.toString(list.toArray())); Set<Student> set = new HashSet<Student>(); set.addAll(list); System.out.println(Arrays.toString(set.toArray())); list.removeAll(list); set.removeAll(set); System.out.println(Arrays.toString(list.toArray())); System.out.println(Arrays.toString(set.toArray())); }
调用代码:
public static void main(String[] args) { removeListDuplicateObject(); }
利用HashSet进行去重操作,为啥必须覆盖hashCode和equals两个方法呢?
我们查看HashSet的add操作源码如下:
public boolean add(E e) { return map.put(e, PRESENT)==null; }
调用了HashMap进行操作的,我们看HashMap的put操作:
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
需要注意的是:
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { ...... }
也就是说hash code相等且equals(==)。
复杂度:一边遍历即可,O(n)
方案二:直接遍历一遍List进行通过contains和add操作实现
代码如下:
private static void removeListDuplicateObjectByList() { List<Student> list = new ArrayList<Student>(); for (int i = 0; i < 10; i++) { Student student = new Student("id", "name"); list.add(student); } System.out.println(Arrays.toString(list.toArray())); List<Student> listUniq = new ArrayList<Student>(); for (Student student : list) { if (!listUniq.contains(student)) { listUniq.add(student); } } System.out.println(Arrays.toString(listUniq.toArray())); list.removeAll(list); listUniq.removeAll(listUniq); System.out.println(Arrays.toString(list.toArray())); System.out.println(Arrays.toString(listUniq.toArray())); }
其他等同上面。
复杂度:
一边遍历,同时调用了contains方法,我们查看源码如下:
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; }
可以看到又对新的list做了一次遍历操作。也就是1+2+....+n这样复杂度为O(n*n)
结论:
方案一效率高,即采用HashSet的方式进行去重操作
发表评论
-
Java中的非对称加密算法RSA实现
2018-08-01 11:14 682需求:实现RSA非对称加密算法实现:public stati ... -
apache common包的configuration2使用
2018-08-01 11:13 1152需求:利用apache的common包中的configura ... -
Java标准库提取URL的域名
2018-08-01 11:12 1297需求:基于Java的标准库提取URL对应的域名并拼接成base ... -
Solr之Solrj封装
2018-04-10 22:08 943基本信息: 版本:7.0.0 单机版,cloud版本有所 ... -
Solr之IKAnalyzer集成
2018-04-10 22:12 1066基本信息: 版本:7.0.0 Solr安装路径记作$SO ... -
linux之jdk安装
2018-04-04 21:41 643环境: jdk-8u161-linux-x64.tar.g ... -
使用jsoup或者httpclient解析https协议通用方法
2018-04-04 18:19 896需求: 基于jsoup或者httpclient爬取htt ... -
javax.mail发email报501 Syntax: HELO hostname
2016-04-07 14:46 3999问题描述: 在linux服务器下用javamail发ema ... -
Gson之map解析
2015-10-20 18:26 2715需求: 把json字符串解析成map 实现: Gson ... -
Java之浮点运算
2015-06-01 16:20 703Java中的浮点数计算主要涉及float和double,他 ... -
Java之IO字节流和字符流
2015-03-19 17:43 1028Java中的IO分为两大线,字节流和字符流 字节流基类:I ... -
apache common之CSV文件操作
2015-03-18 18:39 2766依赖jar: <dependency> & ... -
poi组件读取xls文件
2014-11-25 17:24 958依赖: <dependency> < ... -
java检测文本(字节流)的编码方式
2014-10-30 18:37 2362需求: 某文件或者某字节流要检测他的编码格式。 实现: ... -
fastjson报can not access a member of class with modifiers ""错误
2014-07-08 17:22 1974执行json解析的时候报错如下: Caused by: j ... -
Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory
2014-05-04 15:38 6036异常信息: Java HotSpot(TM) 64-Bit ... -
Java以行读写文件
2014-04-10 16:56 1697场景: 基于行读写文件是基本的需求,有时候数据文件比较大那 ... -
Map之Value排序实现
2014-03-20 10:07 1272需求: 在做统计分析的时候,有时候需要最value做排序, ... -
Java之UncaughtExceptionHandler
2014-01-23 11:09 2591概述: UncaughtExceptionHandler ... -
Java之wait()和notify()
2014-01-22 17:32 1490概述: Java多线程并发模型中的实现可以基于wait() ...
相关推荐
在Java中,对List对象列表实现去重或取出及排序是一种常见的操作。下面将详细介绍相关的方法和实现。 1. 实体类重写equals和hashCode方法 在Java中,想要去重List对象列表,首先需要重写实体类的equals和hashCode...
在Java中处理JSON数据时,经常需要对JSON数组进行各种操作,其中去重是一个常见的需求。本文将详细介绍如何使用Java对`JSONArray`进行去重操作,并深入探讨背后的原理和技术细节。 ### JSON与Java JSON...
List去重是Java中的一种常见操作,对于List中的重复元素进行去重,从而使得List中的元素变得独一无二。 Java中提供了多种方法来实现List去重,下面我们将对其中的一些方法进行介绍。 使用HashSet去重 HashSet是一...
因此,我们可以将上述两种操作结合起来,以实现去重并排序的操作。 例如,以下代码演示如何使用HashSet和Comparator对List进行去重并排序操作: ```java List,Object>> listMap1 = new LinkedList,Object>>(); // ...
【Java中List集合对象去重及按属性去重的8种方法】 在Java编程中,当我们处理包含重复元素的List时,有时需要去除其中的重复项。以下文章将详细介绍8种针对List集合对象去重的方法,包括基于对象整体以及按特定属性...
这两种方法都可以有效地实现基于`name`字段的去重。需要注意的是,第一种方法会保持去重后的元素顺序,而第二种方法则不保证顺序。在实际应用中,应根据具体需求选择合适的方法。 总的来说,Java 8的Stream API为...
下面将详细介绍两种常用的数组去重方法。 ##### 方法一:For双循环法 这种方法通过两层循环来检查数组中的元素是否重复。其主要步骤如下: 1. **初始化变量**:声明一个整型变量`index`,用于记录不重复元素的...
本文将详细介绍两种Java中对List进行去重的方法,分别是不带类型参数的写法和带类型参数的写法,并通过示例代码进行演示。 1. 不带类型写法: 这种方法适用于Java版本较低或者不使用泛型的情况。基本思路是创建一个...
但是,需要注意的是,在将List集合转换为Set集合时,需要考虑两种情况:一种是List集合中的数据类型是基本数据类型,另一种是List集合中的数据类型是对象类型。 基本数据类型 如果List集合中的数据类型是基本数据...
Java List去重是Java编程中的一种常见操作,用于从List中删除重复的元素。在本文中,我们将介绍五种不同的方法来实现Java List去重。这些方法包括使用Java 8的Stream API、双重for循环、Set集合判断、遍历后判断赋给...
在Java 8中,Stream API引入了许多新特性,极大地增强了集合操作的能力,其中包括多条件过滤和去重。这里我们将深入探讨这两个概念,并结合提供的代码示例进行解释。 1. **多条件过滤** 示例中的多条件过滤是通过...
本文将详细介绍如何在Java中去除重复元素,主要关注数组和列表这两种常见数据结构。 一、数组去重 1. 使用HashSet HashSet是一个不允许有重复元素的集合,当我们尝试将一个数组中的所有元素添加到HashSet时,它会...
Java 中的集合是指一种数据结构,用于存储和操作一组数据。 Java 集合框架提供了多种类型的集合,包括 Collection、List、Set、Map 等。这些集合类型都具有不同的特点和用途,了解它们的实现原理和使用方法是 Java ...
今天我们将深入探讨Java中的数据处理,特别是内连接(Inner Join)、外连接(Outer Join)、集合操作以及去重查询。这些概念在实际项目开发中经常被用到,能够帮助我们有效地管理和操作数据。 1. 内连接(Inner ...
ArrayList和LinkedList是List的两种常见实现。在这个应用中,List可能用于临时存储处理的单词,或者记录单词的出现顺序。如果需要频繁地在列表末尾添加元素,ArrayList通常是更好的选择;而如果需要频繁地在任意位置...
Java是一种面向对象的编程语言,它提供了许多有用的集合类来存储和操作数据,其中List集合是最常用的集合之一。在实际开发中,我们经常需要判断两个List集合是否相等,不考虑元素的顺序。今天,我们将探讨如何在Java...
- 这些导入语句是为了使用Java标准库中的`ArrayList`、`Collections`以及`List`接口。其中`ArrayList`用于存储开奖数字,`Collections`提供了一些静态方法对集合进行操作,如排序等。 - **类声明与注释**: - `...
### Java集合排序及java集合类详解(Collection、...以上是对Java集合框架中的`Collection`、`List`、`Set`和`Map`的详细介绍,涵盖了它们的基本概念、常用方法、实现原理等方面,希望对理解和使用Java集合有所帮助。