集合操作
以下集合操作返回的都是个Collection
- 并集
CollectionUtils.union(容器1,容器2); - 交集
CollectionUtils.intersection(容器1,容器2);
或者retainAll()用法一样 - 差集
CollectionUtils.subtract(容器1,容器2);
因为具体程序很简单,就不放示例程序了。需要注意的是,返回的都是Collection,即不转型的话,只能使用那些基本的操作了。
队列扩展
- 循环队列
即队列满了时候再添加元素,会自动弹出先进来的元素,再在后面添加。
使用CircularFifoQueue类
public static void circularFifoQueue(){
//创建两个元素的循环队列
CircularFifoQueue<String> cirque=new CircularFifoQueue<>(2);
cirque.add("a");
cirque.add("b");
cirque.add("c");
for(String temp:cirque)
System.out.println(temp);
}
输出结果:
b
c
- 只读队列
与javaAPI里头一个样,对容器进行包装。只是产生了一个容器的快照,不能对该快照进行操作。但对原容器进行操作还是可以的,并且快照也会随之变化。
用UnmodifiableQueue.unmodifiableQueue(队列);来包装
public static void readOnlyQueue(){
Queue<String> que=new LinkedList<>();
que.add("a");
que.add("b");
que.add("c");
que.add("d");
Queue<String> readonlyqueue=UnmodifiableQueue.unmodifiableQueue(que);
//readonlyqueue.add("f");//java.lang.UnsupportedOperationException
for(String temp:readonlyqueue){
System.out.print(temp+"\t");
}
System.out.println();
//改变原容器
que.add("f");
//再遍历输出
for(String temp:readonlyqueue){
System.out.print(temp+"\t");
}
}
输出结果:
a b c d
a b c d f
- 断言队列
即利用断言来限制加入队列的元素种类
使用PredicatedQueue.predicatedQueue(队列,断言);来包装
public static void predicatedqueue(){
Queue<String> que=new LinkedList<>();
//设置断言,不能添加带有a的字符串
Predicate<String> predicate=new Predicate<String>() {
public boolean evaluate(String str) {
char c;
for(int i=0;i<str.length();i++)
{
c=str.charAt(i);
if(c=='a')
return false;//带a返回false
}
return true;
}
};
Queue<String> predicatedqueue=PredicatedQueue.predicatedQueue(que, predicate);
predicatedqueue.add("sex");
predicatedqueue.add("along");//java.lang.IllegalArgumentException
}