第二种:使用list中的retainAll方法

java 取交集方法retainAll

有两个集合A和B,判断这两个集合是否包含相同的对象或元素,可以使用retainAll方法:A.retainAll(B)。如果存在相同元素,A仅保留相同的元素。如果不存在相同元素,A会变为空。

总的来说:如果集合A和集合B是完全相同的集合,也会返回false。两个集合没有交集,才会返回true

第三种:使用md5的加密算法(可以了解,最好不要使用,比第一种循环比较还慢)

String str = SecureUtil.md5(list.toString());     
String str1 = SecureUtil.md5(list1.toString());
return str.equals(str1);

第四种:java8的stream流

return list.stream().sorted().collect(Collectors.joining())
.equals(list1.stream().sorted().collect(Collectors.joining()));

第五种:使用list自带的sort方法先进性排序,然后转成toString去判断两个集合是否相等( 速度最优,推荐使用

list.sort(Comparator.comparing(String::hashCode));  
list1.sort(Comparator.comparing(String::hashCode)); 
return list.toString().equals(list1.toString());
public static boolean isSameCollections(List<String> list1,List<String>list2){ String listToStr1 = list1.stream().col.. 利用 JAVA 反射机制获取到类、所有字段、所有方法、字段值来进行比较, 两个 List实体遍历进行比较, 判断 内容 是否 完全 相同。一封装好工具类,调用者只需一行代码即可 判断 是否 相等 ,接收泛型 Java 接口定义disjoint(Collection> c1, Collection> c2) 方法返回true表示 两个 collection中没有相同的 元素 。disjoint()方法不需要传入类型相同的 集合 ,只要实现collection接口即可。如果 c1 集合 和 c2 集合 没有相同 元素 返回true。如果传入参数为 null 会引发空指针异常。disjoint在 判断 过程中对执行速度... 比较 两个 集合 是否 存在交集就可以了:于是我们马上就能能想到的方法:通过for循环逐 个元素 比较,遇到相同返回有相同的结果;我们也可以通过小名在之前文章提到的lambda表达式提高性能,等。今天小名想分享给大家的是来自“万能的Collections”中的一个静态方法顾名思义,它是用来 判断 两个 集合 "不相交的”的结果,但我们只要对返回结果取反,就可以高效获得我们想要的结果。 一,实现1. 最简单粗暴的方法,遍历循环1 packagelist.demo;23 import java .io.Serializable;4 import java .util.*;5 import java .util.stream.Collectors;67 /**8 * 判断 两个 集合 是否 相等 9 */10 public class CheckDiffList implementsSerializ... Boolean boolean =Collections.disjoint(Collection<?> c1, Collection<?> c2) 1.方法返回true表示 两个 集合 中没有相同的 元素 。 2.disjoint()方法不需要传入类型相同的 集合 ,只要实现collection接口即可。如果 c1 集合 和 c2 集合 没有相同 元素 返回true。如果传入参数为 null 会引发空指针异常。 3.disjoint在 判断 过程中对执行速度做了优化,因此比我们直接遍历 两个 li 求交集和并集的线性算法(原创) 对于给定的 两个 集合 ,使用哈希表可以在线性时间复杂度内得到他们的交集和并集,具体说明如下: 假设有 集合 A={1, 7, 5, 13, 9, 10, 11}, B={5, 7, 10, 1, 18, 12}, 1)求交集,需要得到结果:A∩B={1, 5, 7,10} 思路如下: ①建立一个哈希表(HashTable),其键(KEY)表示 集合 中数字的值,其值(VALUE)表示 集合 中数字出现的次数 ②遍历 集合 A,将 集合 中的每个数字(KEY)插入哈希表,每个数字的出现次数(VALUE)设置为1 ③遍历 集合 B,对于 集合 中的每个数字: 如果哈希表中已经存在该数字,将对应的VALUE改为2 如果哈希表中不存在该数字,忽略 ④遍历哈希表,输出VALUE为2的数字,即得到A和B的交集 2) 求并集,需要得到结果:AUB={1,5,7,9,10,11,12,13,18} 思路如下: ①建立一个哈希表(HashTable),其键(KEY)表示 集合 中数字的值,其值(VALUE)可以无视 ②遍历 集合 A,将 集合 中的每个数字(KEY)插入哈希表 ③遍历 集合 B,对于 集合 中的每个数字: 如果哈希表中已经存在该数字,忽略 如果哈希表中不存在该数字,将这个数字插入哈希表 ④遍历哈希表,输出哈希表中的每个KEY,即为A和B的并集 上面以 两个 集合 为例说明了交集和并集的求法,事实上,上述算法可以很方便的扩展到3个或3个以上的 集合 的求交集和求并集。另外求并集时,由于哈希表的值(VALUE)部分不需要用到,所以这个数据结构也可以更换为 哈希集(HashSet)。 转载请注明出处。 VB中HashTable 2012-08-20 14:43:21| 分类: asp.net|举报|字号 订阅 首先定义一个hashtable Dim hstl As New Hashtable hstl.Add(key, value) ' java 是用.put MS开始全面模仿 java 这说说vb.net中的hashtable基本用法: 添加值:hstl.add(key,value) 通过key取值: hstl.Item(key).ToString 判断 是否 含有Key: ContainsKey(key) 判断 是否 含有value: ContainsValue(value) 遍历hashtable: Dim de As DictionaryEntry '泛型类 For Each de In hstl console.write(de.key & de.value) Next de hashtable不支持通过value取key. 求2个 集合 的交集 第一种方法 最简单、粗暴的循环遍历2个 集合 判断 如果有相同的 元素 就取出来。假设 集合 1的长度为M, 集合 2的长度为N,那么,时间复杂度为:O(M*N) public static List<string> GetIntersection(List<string> list1, List<string> list2) List<string> list3 = new List<string>(); //第一种方法:循环遍历 //O(n×m) for (int i = 0; i < list1.Count; i++) for (int j = 0; j < list2.Count; j++) if (list1[i]==list2[j]) list3.Add(list1[i]); return list3; 第二种方法 利用hash这种很有用的数据结构来实现。我们知道,hash的特点之一就是不允许有重复 元素 ,即hash表中的 元素 都是唯一的。所以,我们的思路就是:先把第一个 集合 的所有 元素 都放进hashSet中,时间复杂度O(M);再把第二个 集合 中的 元素 放进hashSet中,如果有重复 元素 ,就是这2个 集合 的交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。 public static List<string> GetIntersection2(List<string> list1, List<string> list2) //第二种方法:hash List<string> list3 = new List<string>(); HashSet<string> hashSet = new HashSet<string>(); foreach (string item in list1) hashSet.Add(item); foreach (string item in list2) if (hashSet.Add(item) == false) list3.Add(item); return list3; static void Main(string[] args) List<string> list1 = new List<string>(); list1.Add("apple"); list1.Add("banana"); list1.Add("pear"); list1.Add("orange"); list1.Add("grape"); List<string> list2 = new List<string>(); list2.Add("nokia"); list2.Add("sumsung"); list2.Add("htc"); list2.Add("apple"); list2.Add("orange"); List<string> list =new List<string>(); //test for two set join //list = TwoSetsIntersection.GetIntersection(list1, list2); list = TwoSetsIntersection.GetIntersection2(list1, list2); foreach (string item in list) Console.Write(item + "\t"); hash的另一个特点是查找效率为O(1),惊人的高! 对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。 HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对 两个 集合 求交集、并集、差集等。 集合 中包含一组不重复出现且无特性顺序的 元素 。 HashSet<T>的一些特性如下: 1、HashSet<T>中的值不能重复且没有顺序。 2、HashSet<T>的容量会按需自动添加。 构造方法: HashSet() 默认 相等 比较器创建一个空的新实例。 HashSet(IEnumerable<T> collection)  把指定 集合 中的collection中的数据复制到集中 HashSet(IEqualityComparer<T> comparer)  使用指定的 相等 比较器创建一个空的新实例 HashSet(IEnumerable<T> collection,IEqualityComparer<T> comparer)  使用指定的比较器实例化数据,且将指定 集合 中的 元素 复制到 集合 中。 因为HashSet<T>是专门设计来做 集合 运算的,因此它提供的方法中有不少是和 集合 运算相关的。 以下给出它的一些常用方法介绍 成员        类型        说明 Add        方法        将指定的 元素 添加到 集合 中 Clear        方法         清空 集合 中的所有 元素 Contains     方法         确定某 元素 是否 在HashSet<T>中 Exists       方法         确定HashSet<T> 是否 包含于指定条件相匹配的 元素 ExceptWith    方法         从当前HashSet<T>移除指定 集合 中的所有 元素 IntersectWith   方法        修改当前的HashSet<T>对象,以仅包含该对象和指定 集合 中存在的 元素 IsProperSubsetOf  方法        确定HashSet<T>对象 是否 为指定 集合 的真子集 IsProperSupersetOf 方法        确定HashSet<T>对象 是否 为指定 集合 的真超集 IsSunsetOf     方法         确定HashSet<T>对象 是否 为指定 集合 的子集 IsSupersetOf    方法         确定HashSet<T>对象 是否 为指定 集合 的超集 Remove      方法         从HashSet<T>对象中移除指定的 元素 RemoveWhere   方法         从HashSet<T> 集合 中移除与指定谓词所定义的条件相匹配的所有 元素 SetEquals     方法         确定HashSet<T>对象与指定的 集合 是否 包含相同的 元素 SynmmetricExceptWith  方法     修改当前的HashSet<T>对象,以仅包含该对象或指定 集合 中存在的 元素 TrimExcess    方法         将HashSet<T>对象的容量设置为它所包含的 元素 的实际个数,向上舍入为接近的特性与实现的值。 UnionWith     方法         修改当前的HashSet<T>对象,以包含该对象本身和指定 集合 中存在的所有 元素 给个简单的例子,写不完的,总之记得HashSet<T>主要的作用是用来进行,交集、并集等运算的就OK了。 static void Main(string[] args) HashSet<string> hs = new HashSet<string>(); hs.Add("你"); hs.Add("好"); hs.Add("吗"); HashSet<string> hs1 = new HashSet<string>(); hs1.Add("你"); hs1.Add("好"); bool b = hs1.IsProperSubsetOf(hs); //确定hs1 是否 是hs的真子集 Console.WriteLine(b); //输出True HashSet<string> hs2 = new HashSet<string>(); hs2.Add("爱你"); IEnumerable<string> list = hs.Union(hs2); //返回并集 foreach (string str in list) Console.WriteLine(str); //输出 你 好 吗 爱你 Console.ReadKey();