Java知识总结
3.java集合类
Collection
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。
直接上集合类的类图更加直观:
大家从图中可以直接明了的发现各子类集合之间的关系。
现在为大家大致的介绍一下个子类的特征:
下面给大家详细介绍一下:
- Collection:父接口;
- Set:接口 ---实现类: HashSet、LinkedHashSet
- List:接口---实现类: LinkedList,Vector,ArrayList
- SortedSet:接口---实现类:TreeSet
- Map接口---实现类:HashMap、Hashtable、LinkedHashMap、Properties
List:
List:有序列表,允许存放重复的元素;
实现类:
------ArrayList:数组实现,查询快,增删慢,线程不安全,轻量级;
------LinkedList:链表实现,增删快,查询慢
------Vector:数组实现,线程安全,重量级
levit应用中使用集合分布表:
集合类型 ------>应用数量
ArrayList---------184处
LinkedList---------2处
Vector-------------0处
分析:
从以上的分析结果来看ArrayList是用的最多的,Vector没有用到(有性能问题,不建议使用)
下面分析一下LinkLst的引用场景
private List<Long> getGroupIds(List<GroupMemberDO> groupMemberDOs) {
List<Long> groupIds = new LinkedList<Long>();
if (CollectionUtils.isEmpty(groupMemberDOs)) {
return groupIds;
}
// 后台任务调用该方法,此场景数据量很大,外面循环的集合类型是ArrayList(查询快),对查询出的数据保存应用LinkedList(增加快)。
for (GroupMemberDO groupMemberDO : groupMemberDOs) {
// 此处只做增加操作,上面分析LinkedList是基于链表它做增加删除很快。
groupIds.add(groupMemberDO.getGroupId());
}
return DistinctElementFilter.filterList(groupIds);
}
这个例子告诉我们什么?
这样的场景在大家对数据库操作的时候经常会出现,当我们从数据库中查询出某个集合的时候,这个时候可能是model,但是前台需要我们转为想要的VO,这个时候我们就可以采取这样的方式来提高程序的效率。
Set:
Set:无序集合,不允许存放重复的元素;允许使用null元素
HashSet 的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问; 如果有两个Key重复,那么会覆盖之前的
实现类 HashSet:equals返回true,hashCode返回相同的整数;哈希表;存储的数据是无序的。 实现类 LinkedHashSet:此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的
------子接口SortedSet:对Set排序实现类 :TreeSet:使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序;当我们想对set排序的时候就可以使用这样的方法。
Map:
HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;允许null的键或值;
Hashtable:线程安全的,不允许null的键或值;
Properties: key和value都是String类型,用来读配置文件;
TreeMap: 对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;
LinkedHashMap: 此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。
levit应用中使用集合分布表:
集合类型 ------应用数量
HashMap--------- 142处
Hashtable ---------- 0
Properties ---------- 0
TreeMap -------------0
LinkedHashMap ---- 3
分析:
从以上的分析结果来看与List的分析结果大致相同,HashMap应用场景最多。
最后给大家分享一个求集合的交集、并集、补集和差集的方法,希望对大家有所帮助。
public class CollectionUtilsIntro {
public static void main(String[] args) {
String[] arrayA = new String[] { "1", "2", "3", "3", "4", "5" };
String[] arrayB = new String[] { "3", "4", "4", "5", "6", "7" };
List<String> a = Arrays.asList(arrayA);
List<String> b = Arrays.asList(arrayB);
// 并集
Collection<String> union = CollectionUtils.union(a, b);
// 交集
Collection<String> intersection = CollectionUtils.intersection(a, b);
// 交集的补集
Collection<String> disjunction = CollectionUtils.disjunction(a, b);
// 集合相减
Collection<String> subtract = CollectionUtils.subtract(a, b);
Collections.sort((List<String>) union);
Collections.sort((List<String>) intersection);
Collections.sort((List<String>) disjunction);
Collections.sort((List<String>) subtract);
System.out.println("A: " + ArrayUtils.toString(a.toArray()));
System.out.println("B: " + ArrayUtils.toString(b.toArray()));
System.out.println("--------------------------------------------");
System.out.println("并集(A, B): "
+ ArrayUtils.toString(union.toArray()));
System.out.println("交集(A, B): "
+ ArrayUtils.toString(intersection.toArray()));
System.out.println("交集的补集(A, B): "
+ ArrayUtils.toString(disjunction.toArray()));
System.out.println("集合相减(A, B): "
+ ArrayUtils.toString(subtract.toArray()));
}
}
当然,这里需要引入apache的一个工具包,commons-collections4-4.0.jar