Commons-Collections(一)之list
Bag
Bag继承自Collection接口,定义了一个集合,该集合会记录对象在集合中出现的次数。
假设你有一个包,包含{a, a, b, c}。调用getCount(a)方法将返回2,调用uniqueset()方法将返回{a, b, c}的set集合。
public interface Bag<E> extends Collection<E> {}
顾名思义,它是包的意思,所以也是拿来装数据的。
HashBag
HashBag使用HashMap作为数据存储,是一个标准的Bag实现。
public static void main(String[] args) {
Bag hashBag = new HashBag();
String s1 = "s1";
String s2 = "s2";
hashBag.add(s1);
hashBag.add(s1);
//一次性放置多个元素
hashBag.add(s2, 3);
// 获得包中元素迭代器
Iterator<?> iterator = hashBag.iterator();
System.out.println("包中元素为:");
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("包中元素个数为:" + hashBag.size()); //5
//下面两个特有的方法 使用起来较为方便
System.out.println("包中entity1个数为:" + hashBag.getCount(s1)); //2
System.out.println("去重后个数为:" + hashBag.uniqueSet().size()); //2
}
结果输出:
包中元素为:
s1
s1
s2
s2
s2
包中元素个数为:5
包中entity1个数为:2
去重后个数为:2
TreeBag
TreeBag使用TreeMap作为数据存储,用法与HashBag类似,只是TreeBag会使用自然顺序对元素进行排序。
总结
使用的方式和List差不多,效果也大同小异。
场景:比如我们需要具体知道每个元素出现的次数的时候,并且实现快速去重,使用Bag会非常便捷
对应的BagUtils,能提供BagUtils.EMPTY_BAG、synchronizedBag、unmodifiableBag等编程同步、只读的快捷方法
BoundedCollection:有限制的集合
继承自Collection,他提供了一些列的有用的实现
FixedSizeList:固定长度大小的List
public static void main(String[] args) {
FixedSizeList<String> c = FixedSizeList.fixedSizeList(Arrays.asList("fang", "shi", "xiang"));
System.out.println(c); //[fang, shi, xiang]
System.out.println(c.size()); //3
//c.remove("fang"); //java.lang.UnsupportedOperationException: List is fixed size
//c.add("fang"); //UnsupportedOperationException: List is fixed size
//虽然不能增加和删除 但可以改
c.set(2, "heng");
System.out.println(c); //[fang, shi, heng]
System.out.println(c.get(2));
//BoundedCollection提供的两个方法
c.isFull(); //如果是FixedSizeList 永远返回true 因为大小肯定是固定的
c.maxSize(); //值同size()方法
}
UnmodifiableBoundedCollection:不能修改的List
CircularFifoQueue:环形的先进先出队列
当达到指定的size长度后,符合FIfo先进先出的原则被环形覆盖
public static void main(String[] args) {
CircularFifoQueue<String> c = new CircularFifoQueue<>(3);
// 这个siz二和MaxSize就有差异化了
System.out.println(c.size()); //0
System.out.println(c.maxSize()); //3
c.add("fang");
c.add("shi");
c.add("xiang");
//我们发现虽然长度是3 但是因为循环的特性 再添加一个并不会报错 而是
c.add("heng");
System.out.println(c); //[shi, xiang, heng]
// 继续添加 就会把前面的继续挤出来 满员了之后,符合先进先出的原则
c.add("heng2");
c.add("heng3");
System.out.println(c); //[heng, heng2, heng3]
}
GrowthList LazyList :list自增长效果
GrowthList修饰另一个列表,可以使其在因set或add操作造成索引超出异常时无缝的增加列表长度,可以避免大多数的IndexOutOfBoundsException。
public static void main(String[] args) {
List<String> src = new ArrayList<>();
src.add("11");
src.add("22");
src = GrowthList.growthList(src);
System.out.println(src);
//经过GrowthList.growthList一修饰后 这个list能够最大程度的避免空数组越界问题 有时候还是挺有用的
// 索引超出,自动增长
src.set(4, "44");
System.out.println(src); //[11, 22, null, null, 44]
}
备注:LazyList修饰另一个列表,当调用get方法时,如果索引超出列表长度,列表会自动增长,我们可以通过一个工厂获得超出索引位置的值。LazyList和GrowthList都可以实现对修饰的列表进行增长,但是LazyList发生在get时候,而GrowthList发生在set和add时候,我们也可以混合使用这两种列表。
SetUniqueList
SetUniqueList实现了一个不允许重复元素的列表,有点和Set类似。但是由有List,保证了顺序
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("fang");
list.add("shi");
list.add("shi");
list.add("xiang");
System.out.println(list); //[fang, shi, shi, xiang]
//完美实现去重 且还完美保证了顺序
list = SetUniqueList.setUniqueList(list);
System.out.println(list); //[fang, shi, xiang]
// 但是需要注意 因为已经是SetUniqueList 类型了 这个时候add相同元素就不再好使了
list.add("shi");
System.out.println(list); //[fang, shi, xiang]
}
我表示这个List在我们既希望去重,有需要保持原来顺序的时候,特别特别好用。装饰一下就行,使用也非常方便
TreeList
TreeList实现了优化的快速插入和删除任何索引的列表。这个列表内部实现利用树结构,确保所有的插入和删除都是O(log n)。
public static void main(String[] args) {
List<String> list = new TreeList<>();
list.add("fang");
list.add("shi");
list.add("shi");
list.add("xiang");
System.out.println(list); //[fang, shi, shi, xiang]
}
ListUtils
emptyIfNull:同上
defaultIfNull:可以在为null的时候,自己给个默认值返回
fixedSizeList:不解释
hashCodeForList:给List吧它的HashCode计算出来
intersection:取交集,生成一个新的List
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>(){{
add("a");
add("b");
add("c");
}};
List<String> list2 = new ArrayList<String>(){{
add("c");
add("d");
add("e");
}};
//取出交集 并且返回一个新的List
List<String> intersection = ListUtils.intersection(list1, list2);
System.out.println(intersection); //[c]
//这个方法也能取出交集的效果 但是会直接改变list1里面的元素 list2不变
list1.retainAll(list2);
System.out.println(list1); // [c]
System.out.println(list2); //[c, d, e]
}
partition:切割 把一个大的List切割成多个List 非常好用
常用场景:有10000个id需要批量查询,我们可以切割一下,200个发一次请求去查询一次,还可以开多个线程,用闭锁去弄
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>(){{
add("a");
add("b");
add("c");
add("a");
add("b");
add("c");
add("a");
add("b");
add("c");
}};
List<List<String>> partition = ListUtils.partition(list1, 4);
System.out.println(partition); //[[a, b, c, a], [b, c, a, b], [c]]
}
subtract:相当于做减法,用第一个List除去第二个list里含有的元素 ,然后生成一个新的list
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>(){{
add("a");
add("b");
add("c");
}};
List<String> list2 = new ArrayList<String>(){{
add("c");
add("d");
add("e");
}};
//取出交集 并且返回一个新的List
List<String> subtract = ListUtils.subtract(list1, list2);
System.out.println(subtract); //[a,b]
}
sum:把两个List的元素相加起来 注意:相同的元素不会加两次 生成一个新的List.
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>(){{
add("a");
add("b");
add("c");
}};
List<String> list2 = new ArrayList<String>(){{
add("c");
add("c");
add("c");
add("d");
add("e");
}};
//取出交集 并且返回一个新的List
List<String> sumlist = ListUtils.sum(list1, list2);
System.out.println(sumlist); //[a, b, c, d, e]
}
此方法注意了,有相加的功能和去重的功能,很多场景还是很好用的
union:这个和sum方法不一样,它不带去重的功能。内部调用的addAll方法,但是生成一个新的List
Commons-Collections(一)之list的更多相关文章
- 关于java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap的错误解决办法
在JavaEE开发中,在把配置文件中的数据或用户表单提交上来的数据,封装在相应JavaBean的对象的对应属性中时:在实际开发中,使用第三方法工具包BeanUtils(commons-beanutil ...
- Apache Commons Collections 反序列化详细分析学习总结
0x01.环境准备: Apache Commons Collections 3.1版本,下载链接参考: https://www.secfree.com/a/231.html jd jui地址(将jar ...
- java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap报错解决
在使用 commons-beanutils-1.9.2.jarcommons-logging-1.1.1.jar 的时候报错 java.lang.NoClassDefFoundError: org/a ...
- java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap
七月 26, 2017 1:52:15 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for ...
- 出现java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap错误问题解决
首先出现这个问题,你应该是用了 BeanUtils.populate(meter,map); import org.apache.commons.beanutils.BeanUtils;并且导入了co ...
- ysoserial分析【一】 之 Apache Commons Collections
目录 前言 基础知识 Transformer 利用InvokerTransformer造成命令执行 Map TransformedMap LazyMap AnnotationInvocationHan ...
- Apache Commons Collections
http://commons.apache.org/proper/commons-collections/userguide.html 1. Utilities SetUtils Collection ...
- 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer
原因: 这里添加的jar包和android自带的jar产生了冲突
- 关于使用工具类org.apache.commons.collections.ListUtils合并List的问题
今天在做项目时,需要将几个List进行合并,于是就用到了apache提供关于List操作的工具类ListUtils,但是在使用的过程中发现一些问题. public static void main(S ...
- java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap-----commons-ctions版本问题
今天用到了一系列的第三方jar包,一环扣一环, 记住一个: 倘若你所导入的第三方jar包中的类一直显示未找到,那就是你的路径出问题了, /WEB-INF/lib目录下才是放第三方jar包位置, 但是今 ...
随机推荐
- urllib的使用和进阶——urllib.request
urllib是python中常用的一个基本库,以后的许多库包括一些框架如Scrapy都是建立在这个库的基础上的.在urllib中,为用户提供了一系列用于操作URL的功能,其提供的功能主要就是利用程序去 ...
- [刘阳Java]_Spring常用注解介绍_第6讲
Spring的注解是在Spring2.5的版本中引入的,目的简化XML配置.在企业开发过程中使用注解的频率非常高,但是学习注解的前提是大家一定要对Spring基于XML配置要熟悉,这是我个人建议,因为 ...
- POJ 尺取法
poj3061 Subsequence 题目链接: http://poj.org/problem?id=3061 挑战P146.题意:给定长度为n的数列整数a0,a1,...,a(n-1)以及整数S, ...
- Guava Cache使用的三种姿势
姿势一 使用expiredAferWriter 优点 简单 粗暴 缺点 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞 ...
- aria2+uget+chrome
1.安装aira2 sudo apt install aria2 2.安装及配置uget sudo apt install uget 编辑 -> 设置: 分类 -> 属性: 3.chrom ...
- (python函数02)列表生成式
(python函数02)列表生成式 示例代码 num = [i for i in range(1, 10)] print(num) num = [i for i in range(1, 10) ...
- java封装基础详解
java封装基础详解 java的封装性即是信息隐藏,把对象的属性和行为结合成一个相同的独立单体,并尽可能地隐藏对象的内部细节. 封装的特性是对属性来讲的. 封装的目标就是要实现软件部件的"高 ...
- AAAI 2021 最佳论文公布
作者:Synced 翻译:仿佛若有光 第三十五届 AAAI 人工智能会议 (AAAI-21) 以虚拟会议的形式拉开帷幕.组委会在开幕式上公布了最佳论文奖和亚军.三篇论文获得了最佳论文奖,三篇被评为 ...
- 🔥 LeetCode 热题 HOT 100(31-40)
75. 颜色分类 思路:将 2 往后放,0 往前放,剩余的1自然就放好了. 使用双指针:left.right 分别指向待插入的 0 和 2 的位置,初始 left 指向数组头,right 指向数组尾部 ...
- 点云上的深度学习及其在三维场景理解中的应用(PPT内容整理PointNet)
这篇博客主要是整理了PointNet提出者祁芮中台介绍PointNet.PointNet++.Frustum PointNets的PPT内容,内容包括如何将点云进行深度学习,如何设计新型的网络架构 ...