package com.bjsxt.others.commons;

import java.util.ArrayList;
import java.util.List; import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.PredicateUtils;
import org.apache.commons.collections4.functors.EqualPredicate;
import org.apache.commons.collections4.functors.NotNullPredicate;
import org.apache.commons.collections4.functors.UniquePredicate;
import org.apache.commons.collections4.list.PredicatedList;
import org.junit.Test; /**
函数式编程 之 Predicate 断言
封装条件或判别式 if..else替代
1、 new EqualPredicate<类型>(值)
EqualPredicate.equalPredicate(值);
2、NotNullPredicate.INSTANCE
3、UniquePredicate.uniquePredicate()
4、自定义
new Predicate() +evaluate
PredicateUtils.allPredicate andPredicate anyPredicate
PredicatedXxx.predicatedXxx(容器,判断)
* @author Administrator
*
*/
public class Demo01 { /**
* @param args
*/
public static void main(String[] args) {
System.out.println("======自定义判断======");
//自定义的判别式
Predicate<String> selfPre =new Predicate<String>(){
@Override
public boolean evaluate(String object) {
return object.length()>=5 && object.length()<=20; }};
Predicate notNull=NotNullPredicate.notNullPredicate(); Predicate all =PredicateUtils.allPredicate(notNull,selfPre); List<String> list =PredicatedList.predicatedList(new ArrayList<String>(),all);
list.add("bjsxt");
list.add(null);
list.add("bj"); }
/**
* 判断唯一
*/
public static void unique(){
System.out.println("====唯一性判断====");
Predicate<Long> uniquePre =UniquePredicate.uniquePredicate();
List<Long> list =PredicatedList.predicatedList(new ArrayList<Long>(), uniquePre);
list.add(100L);
list.add(200L);
list.add(100L); //出现重复值,抛出异常
} /**
* 判断非空
*/
public static void notNull(){
System.out.println("====非空判断====");
//Predicate notNull=NotNullPredicate.INSTANCE;
Predicate notNull=NotNullPredicate.notNullPredicate();
//String str ="bjs";
String str =null;
System.out.println(notNull.evaluate(str)); //如果非空为true ,否则为false //添加容器值的判断
List<Long> list =PredicatedList.predicatedList(new ArrayList<Long>(), notNull);
list.add(1000L);
list.add(null); //验证失败,出现异常
} /**
* 比较相等判断
*/
@Test
public static void equal(){
System.out.println("======相等判断======");
//Predicate<String> pre =new EqualPredicate<String>("bjsxt");
Predicate<String> pre =EqualPredicate.equalPredicate("bjsxt");
boolean flag =pre.evaluate("bj");
System.out.println(flag);
} }
package com.bjsxt.others.commons;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.functors.SwitchTransformer;
import org.junit.Test; /**
解耦,业务处理与判断进行分类
函数式编程 Transformer 类型转化
1、new Transformer() +transform
2、SwitchTransformer
CollectionUtils.collect(容器,转换器)
* @author Administrator
*
*/
public class Demo02 { /**
* @param args
*/
public static void main(String[] args) {
System.out.println("===自定义类型转换==");
//判别式
Predicate<Employee> isLow=new Predicate<Employee>(){ @Override
public boolean evaluate(Employee emp) {
return emp.getSalary()<10000;
} };
Predicate<Employee> isHigh=new Predicate<Employee>(){ @Override
public boolean evaluate(Employee emp) {
return emp.getSalary()>=10000;
} };
Predicate[] pres ={isLow,isHigh}; //转换
Transformer<Employee,Level> lowTrans =new Transformer<Employee,Level>(){ @Override
public Level transform(Employee input) {
return new Level(input.getName(),"卖身中");
}}; Transformer<Employee,Level> highTrans =new Transformer<Employee,Level>(){ @Override
public Level transform(Employee input) {
return new Level(input.getName(),"养身中");
}};
Transformer[] trans ={lowTrans,highTrans}; //二者进行了关联
Transformer switchTrans =new SwitchTransformer(pres, trans, null); //容器
List<Employee> list =new ArrayList<Employee>();
list.add(new Employee("老马",1000000));
list.add(new Employee("老裴",999)); Collection<Level> levelList = CollectionUtils.collect(list,switchTrans); //遍历容器
Iterator<Level> levelIt =levelList.iterator();
while(levelIt.hasNext()){
System.out.println(levelIt.next());
} }
/**
* 内置类型的转换
*/
@Test
public static void inner(){
System.out.println("===内置类型转换 长整形时间日期,转成指定格式的字符串==");
//类型转换器
Transformer<Long,String> trans =new Transformer<Long,String>(){ @Override
public String transform(Long input) {
return new SimpleDateFormat("yyyy年MM月dd日").format(input);
}};
//容器
List<Long> list =new ArrayList<Long>();
list.add(999999999999L);
list.add(300000000L); //工具类 程序猿出钱---开发商---农民工出力
Collection<String> result=CollectionUtils.collect(list, trans);
//遍历查看结果
for(String time:result){
System.out.println(time);
}
} }
package com.bjsxt.others.commons;
/**
* 员工类
* @author Administrator
*
*/
public class Employee {
private String name;
private double salary;
//alt +/
public Employee() {
}
//alt+shift+s o
public Employee(String name, double salary) {
super();
this.name = name;
this.salary = salary;
}
//alt+shift+s +r tab 回车 shift+tab 回车
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "(码农:"+this.name+",敲砖钱:"+this.salary+")";
} }
package com.bjsxt.others.commons;
/**
* 等级类
* @author Administrator
*
*/
public class Level {
private String name;
private String level;
public Level() {
// TODO Auto-generated constructor stub
}
public Level(String name, String level) {
super();
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public String toString() {
return "(码农:"+this.name+",水平:"+this.level+")";
}
}
package com.bjsxt.others.commons;

public class Goods {
private String name;
private double price;
//折扣
private boolean discount;
public Goods() {
// TODO Auto-generated constructor stub
}
public Goods(String name, double price, boolean discount) {
super();
this.name = name;
this.price = price;
this.discount = discount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public boolean isDiscount() {
return discount;
}
public void setDiscount(boolean discount) {
this.discount = discount;
} @Override
public String toString() {
return "(商品:"+this.name+",价格:"+this.price+",是否打折:"+(discount?"是":"否")+")";
} }
package com.bjsxt.others.commons;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.apache.commons.collections4.Closure;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.functors.ChainedClosure;
import org.apache.commons.collections4.functors.IfClosure;
import org.apache.commons.collections4.functors.WhileClosure; /**
函数式编程 Closure 闭包 封装特定的业务功能
1、Closure
2、IfClosure IfClosure.ifClosure(断言,功能1,功能2)
3、WhileClosure WhileClosure.whileClosure(断言,功能,标识)
4、ChainedClosure.chainedClosure(功能列表);
CollectionUtils.forAllDo(容器,功能类对象);
* @author Administrator
*
*/
public class Demo03 { /**
* @param args
*/
public static void main(String[] args) {
//basic();
ifClosure();
//whileClosure();
chainClosure();
}
/**
* 折上减 先打折商品,进行9折,满百再减20
*/
public static void chainClosure(){
List<Goods> goodsList =new ArrayList<Goods>();
goodsList.add(new Goods("javase视频",120,true));
goodsList.add(new Goods("javaee视频",100,false));
goodsList.add(new Goods("高新技术视频",80,false)); //满百减20
Closure<Goods> subtract=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.getPrice()>=100){
goods.setPrice(goods.getPrice()-20);
}
}};
//打折
Closure<Goods> discount=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.isDiscount()){
goods.setPrice(goods.getPrice()*0.9);
}
}}; //链式操作
Closure<Goods> chainClo=ChainedClosure.chainedClosure(discount,subtract); //关联
CollectionUtils.forAllDo(goodsList,chainClo); //查看操作后的数据
for(Goods temp:goodsList){
System.out.println(temp);
} } /**
* 确保所有的员工工资都大于10000,如果已经超过的不再上涨
*/
public static void whileClosure(){
//数据
List<Employee> empList =new ArrayList<Employee>();
empList.add(new Employee("bjsxt",20000));
empList.add(new Employee("is",10000));
empList.add(new Employee("good",5000)); //业务功能 每次上涨0.2
Closure<Employee> cols=new Closure<Employee>(){
public void execute(Employee emp) {
emp.setSalary(emp.getSalary()*1.2);
}}; //判断
Predicate<Employee> empPre=new Predicate<Employee>(){
@Override
public boolean evaluate(Employee emp) {
return emp.getSalary()<10000;
}
};
//false 表示 while结构 先判断后执行 true do..while 先执行后判断
Closure<Employee> whileCols =WhileClosure.whileClosure(empPre, cols, false); //工具类
CollectionUtils.forAllDo(empList, whileCols) ; //操作后的数据
Iterator<Employee> empIt=empList.iterator();
while(empIt.hasNext()){
System.out.println(empIt.next());
}
}
/**
* 二选一 如果是打折商品,进行9折,否则满百减20
*/
public static void ifClosure(){
List<Goods> goodsList =new ArrayList<Goods>();
goodsList.add(new Goods("javase视频",120,true));
goodsList.add(new Goods("javaee视频",100,false));
goodsList.add(new Goods("高新技术视频",80,false)); //满百减20
Closure<Goods> subtract=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.getPrice()>=100){
goods.setPrice(goods.getPrice()-20);
}
}};
//打折
Closure<Goods> discount=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.isDiscount()){
goods.setPrice(goods.getPrice()*0.9);
}
}}; //判断
Predicate<Goods> pre=new Predicate<Goods>(){
public boolean evaluate(Goods goods) {
return goods.isDiscount();
}}; //二选一
Closure<Goods> ifClo=IfClosure.ifClosure(pre, discount,subtract); //关联
CollectionUtils.forAllDo(goodsList,ifClo); //查看操作后的数据
for(Goods temp:goodsList){
System.out.println(temp);
} }
/**
* 基本操作
*/
public static void basic(){
//数据
List<Employee> empList =new ArrayList<Employee>();
empList.add(new Employee("bjsxt",20000));
empList.add(new Employee("is",10000));
empList.add(new Employee("good",5000)); //业务功能
Closure<Employee> cols=new Closure<Employee>(){
public void execute(Employee emp) {
emp.setSalary(emp.getSalary()*1.2);
}}; //工具类
CollectionUtils.forAllDo(empList, cols) ; //操作后的数据
Iterator<Employee> empIt=empList.iterator();
while(empIt.hasNext()){
System.out.println(empIt.next());
}
} }
package com.bjsxt.others.commons;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set; import org.apache.commons.collections4.CollectionUtils; /**
* 集合操作
* 1、并集
* CollectionUtils.union();
* 2、交集
* CollectionUtils.intersection();
* CollectionUtils.retainAll();
* 3、差集
* CollectionUtils.subtract();
* @author Administrator
*
*/
public class Demo04 { /**
* @param args
*/
public static void main(String[] args) {
Set<Integer> set1 =new HashSet<Integer>();
set1.add(1);
set1.add(2);
set1.add(3); Set<Integer> set2 =new HashSet<Integer>();
set2.add(2);
set2.add(3);
set2.add(4); //并集
System.out.println("=========并集============");
Collection<Integer> col =CollectionUtils.union(set1,set2);
for(Integer temp:col){
System.out.println(temp);
}
//交集
System.out.println("=========交集============");
//col =CollectionUtils.intersection(set1, set2);
col =CollectionUtils.retainAll(set1, set2);
for(Integer temp:col){
System.out.println(temp);
}
//差集
System.out.println("=========差集============");
col =CollectionUtils.subtract(set1, set2);
for(Integer temp:col){
System.out.println(temp);
}
} }
package com.bjsxt.others.commons;

import java.util.Queue;

import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.functors.NotNullPredicate;
import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.apache.commons.collections4.queue.PredicatedQueue;
import org.apache.commons.collections4.queue.UnmodifiableQueue; /**
Queue队列
1、循环队列:CircularFifoQueue
2、只读队列:不可改变队列 UnmodifiableQueue
3、断言队列:PredicatedQueue.predicatedQueue()
* @author Administrator
*
*/
public class Demo05 { /**
* @param args
*/
public static void main(String[] args) {
//circular();
//readOnly();
predicate();
}
/**
* 断言队列
*/
public static void predicate(){
//循环队列
CircularFifoQueue<String> que =new CircularFifoQueue<String>(2);
que.add("a");
que.add("b");
que.add("c");
Predicate notNull=NotNullPredicate.INSTANCE;
//包装成对应的队列
Queue<String> que2=PredicatedQueue.predicatedQueue(que, notNull);
que2.add(null);
}
/**
* 只读队列
*/
public static void readOnly(){
//循环队列
CircularFifoQueue<String> que =new CircularFifoQueue<String>(2);
que.add("a");
que.add("b");
que.add("c");
Queue<String> readOnlyQue =UnmodifiableQueue.unmodifiableQueue(que);
readOnlyQue.add("d");
}
/**
* 循环队列
*/
public static void circular(){
//循环队列
CircularFifoQueue<String> que =new CircularFifoQueue<String>(2);
que.add("a");
que.add("b");
que.add("c");
//查看
for(int i=0;i<que.size();i++){
System.out.println(que.get(i));
} } }
package com.bjsxt.others.commons;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.IterableMap;
import org.apache.commons.collections4.MapIterator;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.iterators.ArrayListIterator;
import org.apache.commons.collections4.iterators.FilterIterator;
import org.apache.commons.collections4.iterators.LoopingIterator;
import org.apache.commons.collections4.iterators.UniqueFilterIterator;
import org.apache.commons.collections4.map.HashedMap; /**
迭代器的扩展
1、MapIterator 以后不再使用map.keySet.iterator访问
IterableMap HashedMap
2、UniqueFilterIterator 去重迭代器
3、FilterIterator 自定义过滤 +Predicate
4、LoopingIterator 循环迭代器
5、ArrayListIterator 数组迭代器
* @author Administrator
*
*/
public class Demo06 { /**
* @param args
*/
public static void main(String[] args) {
//mapIt();
//uniqueIt();
//filterIt();
//loopIt();
arrayIt();
}
/**
* 数组迭代器
*/
public static void arrayIt(){
System.out.println("===== 数组迭代器 ====");
int[] arr ={1,2,3,4,5};
//数组迭代器
//Iterator<Integer> it =new ArrayListIterator<Integer>(arr);
//指定起始索引和结束索引
Iterator<Integer> it =new ArrayListIterator<Integer>(arr,1,3);
while(it.hasNext()){
System.out.println(it.next());
}
}
/**
* 循环迭代器
*/
public static void loopIt(){
System.out.println("===== 循环迭代器 ====");
List<String> list =new ArrayList<String>();
list.add("refer");
list.add("dad");
list.add("bjsxt");
list.add("moom"); Iterator<String> it =new LoopingIterator(list);
for(int i=0;i<15;i++){
System.out.println(it.next());
}
}
/**
* 自定义迭代器
*/
public static void filterIt(){
System.out.println("=====自定义迭代器 ====");
List<String> list =new ArrayList<String>();
list.add("refer");
list.add("dad");
list.add("bjsxt");
list.add("moom");
//自定义条件判断
Predicate<String> pre =new Predicate<String>(){
public boolean evaluate(String value) {
//回文判断
return new StringBuilder(value).reverse().toString().equals(value);
}}; //去除重复的过滤器
Iterator<String> it =new FilterIterator(list.iterator(),pre);
while(it.hasNext()){
System.out.println(it.next());
}
}
/**
* 去重迭代器
*/
public static void uniqueIt(){
System.out.println("=====去重迭代器 ====");
List<String> list =new ArrayList<String>();
list.add("a");
list.add("b");
list.add("a");
//去除重复的过滤器
Iterator<String> it =new UniqueFilterIterator(list.iterator());
while(it.hasNext()){
System.out.println(it.next());
}
}
/**
* map迭代器
*/
public static void mapIt(){
System.out.println("=====map迭代器====");
IterableMap<String,String> map =new HashedMap<String,String>();
map.put("a","bjsxt");
map.put("b", "sxt");
map.put("c", "good");
//使用 MapIterator
MapIterator<String,String> it =map.mapIterator();
while(it.hasNext()){
//一定要it.next()
/*
it.next();
String key =it.getKey();
*/
String key =it.next();
String value =it.getValue();
System.out.println(key+"-->"+value);
} } }
package com.bjsxt.others.commons;

import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.MapIterator;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.bidimap.DualTreeBidiMap; /**
双向Map 要求键与值都不能重复
BidiMap inverseBidiMap()
1、DualTreeBidiMap :有序
2、DualHashBidiMap :无序
* @author Administrator
*
*/
public class Demo07 { /**
* @param args
*/
public static void main(String[] args) {
//hashMap();
treeMap();
}
/**
* 有序的双向Map
*/
public static void treeMap(){
System.out.println("=====有序的双向Map====");
BidiMap<String,String> map =new DualTreeBidiMap<String,String>();
map.put("bj", "bj@test.com");
map.put("sxt", "sxt@qq.com");
//遍历查看
MapIterator<String,String> it =map.inverseBidiMap().mapIterator();
while(it.hasNext()){
String key =it.next();
String value =it.getValue();
System.out.println(key+"-->"+value);
}
} /**
* 无序的双向Map
*/
public static void hashMap(){
System.out.println("=====无序的双向Map====");
BidiMap<String,String> map =new DualHashBidiMap<String,String>();
map.put("bj", "bj@test.com");
map.put("sxt", "sxt@qq.com");
//反转
System.out.println(map.inverseBidiMap().get("sxt@qq.com"));
//遍历查看
MapIterator<String,String> it =map.inverseBidiMap().mapIterator();
while(it.hasNext()){
String key =it.next();
String value =it.getValue();
System.out.println(key+"-->"+value);
}
} }
package com.bjsxt.others.commons;

import java.util.Iterator;
import java.util.Set; import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
import org.apache.commons.collections4.bag.TreeBag; /**
Bag 包 允许重复
1、HashBag 无序
2、TreeBag 有序
统计单词的出现次数
* @author Administrator
*
*/
public class Demo08 { /**
* @param args
*/
public static void main(String[] args) {
//hashBag();
//treeBag();
String str ="this is a cat and that is a mice where is the food";
//分割字符串
String[] strArray =str.split(" ");
Bag<String> bag =new TreeBag<String>();
for(String temp:strArray){
bag.add(temp);
} System.out.println("====统计次数===");
Set<String> keys =bag.uniqueSet();
for(String letter:keys){
System.out.println(letter+"-->"+bag.getCount(letter));
} }
/**
* 有序
*/
public static void treeBag(){
System.out.println("=====有序的包====");
Bag<String> bag =new TreeBag<String>();
bag.add("a");
bag.add("a",5);
bag.remove("a", 2);
bag.add("b");
bag.add("c");
Iterator<String> it =bag.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
} /**
* 无序
*/
public static void hashBag(){
System.out.println("=====无序的包====");
Bag<String> bag =new HashBag<String>();
bag.add("a");
bag.add("a",5);
bag.remove("a", 2);
bag.add("b");
bag.add("c");
Iterator<String> it =bag.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
} }

补充一下JDK相关的(自己实现集合的相关代码)

package collection;

import java.util.NoSuchElementException;

/**
* @author SUNHAN
* @Date: 2014年9月29日
*/
public class SLinkedList {
private transient int size=0;
private transient Node head=new Node(null,null,null);//用头结点来表示整个链表 public SLinkedList(){//默认构造方法
head.next=head;
head.previous=head;
} public void add(Object element){//在末尾插入元素
Node Nnode=new Node(element,head,head.previous);
Nnode.previous.next=Nnode;
Nnode.next.previous=Nnode;
size++;
} public void addBefore(Object o,Node e){
Node newNode=new Node(o,e,e.previous);
newNode.previous.next=newNode;
newNode.next.previous=newNode;
size++; } public void add(int index,Object o){//俩参数的add()方法
addBefore(o,(index==size?head:node(index)));
} private Node node(int index){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
Node e=head;//从header开始循环
if(index<size/2){
for(int i=0;i<=index;i++){//对用户而言,头结点是不可见的
e=e.next;
}
}
else{
for(int i=size;i>index;i--){
e=e.previous;
}
}
return e;
} public Object remove(int index){
Node e=node(index);
remove(e);
return e.element;
} private void remove(Node e){
if(e==head){
throw new NoSuchElementException();
}
e.previous.next=e.next;
e.next.previous=e.previous;
size--;
}
}
class Node {
Object element;
Node next;
Node previous; public Node(Object element,Node next,Node previous){//带仨参的构造函数
this.element=element;
this.next=next;
this.previous=previous;
}
}
package collection;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set; /**
* @author SUNHAN
* @Date: 2014年9月29日
*
*/
public class SIterator {
public static void main(String[] args) {
Set set=new HashSet(); set.add("aa");
set.add("bb");
set.add("cc");
Iterator iter=set.iterator();
while(iter.hasNext()){
String str=(String) iter.next();
System.err.println(str);
} for(Iterator iter1=set.iterator();iter.hasNext();){
String str=(String) iter1.next();
System.err.println(str);
} List list=new ArrayList();
list.add("xxx");
list.add("yyy");
list.add("zzz");
for(Object o:list){
System.err.println(o.toString());
}
}
}
package collection;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Set;
/**
* @author SUNHAN
* @Date: 2014年9月29日
* @param <K>
* @param <V>
*/
@SuppressWarnings("unchecked")
public class SimpleHashMap<K, V> { private static final int ARRAY_SiZE = 997;
private LinkedList<MapEntry<K, V>>[] buckets = new LinkedList[ARRAY_SiZE];
public V put(K key, V value) { //添加一个键值对
V oldValue = null;
int index = Math.abs(key.hashCode()) % ARRAY_SiZE; //通过哈希码取绝对值再取模操作得到key的索引值
if(buckets[index] == null) {
buckets[index] = new LinkedList<MapEntry<K, V>>();
}
LinkedList bucket = buckets[index];
MapEntry newEntry = new MapEntry<K, V>(key, value);
ListIterator<MapEntry<K, V>> itr = bucket.listIterator();
while(itr.hasNext()) { //遍历,是否key已存在
MapEntry<K, V> entry = itr.next();
if(entry.getKey().equals(key)) { //存在
oldValue = entry.getValue();
itr.set(newEntry); //将新值覆盖旧值
return oldValue;
}
}
bucket.add(newEntry);//添加新键值对
return oldValue;
} public V get(Object key) { //通过key得到value
int index = Math.abs(key.hashCode()) % ARRAY_SiZE; //通过哈希码取绝对值再取模操作得到key的索引值
if(buckets[index] == null) {
return null;
}
for(MapEntry<K ,V> entry : buckets[index]) {
if(entry.getKey().equals(key)) {
return entry.getValue();
}
}
return null;
} public Set<MapEntry<K, V>> entrySet() { //返回一个set
Set<MapEntry<K, V>> set = new HashSet<MapEntry<K, V>>();
for(LinkedList<MapEntry<K, V>> bucket : buckets) { //遍历数组以及LinkedList,将所有存在的键值对放进set中返回
if(bucket == null) continue;
for(MapEntry<K, V> entry : bucket) {
set.add(entry);
}
}
return set;
} public V remove(Object key) { //移除指定的键值对,并返回value
V oldValue = null;
int index = Math.abs(key.hashCode()) % ARRAY_SiZE;
if(buckets[index] == null) {
return null;
}
for(MapEntry<K, V> entry : buckets[index]) {
if(entry.getKey().equals(key)) {
oldValue = entry.getValue();
buckets[index].remove(entry);
return oldValue;
}
}
return oldValue;
} public void clear() { //清除整个map
for(int i = 0; i < buckets.length; i++) {
if(buckets[i] != null) {
buckets[i] = null;
}
}
} static class MapEntry<K, V>{
K key;
V value;
public MapEntry(K key, V value) {
this.key = key;
this.value = value;
} public K getKey() {
return key;
} public V getValue() {
return value;
} public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
} @Override
public int hashCode() {
return key == null ? 0 : key.hashCode()
^ (value == null ? 0 : value.hashCode());
} @Override
public boolean equals(Object o) {
if (!(o instanceof MapEntry)) {
return false;
}
MapEntry<K, V> me = (MapEntry<K, V>) o;
return (key == null ? me.getKey() == null : key.equals(me.getKey()))
&& (value == null ? me.getValue() == null : value.equals(me
.getValue()));
} @Override
public String toString() {
return key + "=" + value;
}
}
}
package collection;

import java.util.HashMap;

public class SHashSet {

    HashMap map;
private static final Object PRERSENT=new Object(); int size; public int size(){
return map.size();
}
public SHashSet(){
map=new HashMap();
} public void add(Object o){
map.put(0, PRERSENT);
} public static void main(String[] args) { }
}

Commons-Collections的更多相关文章

  1. 关于java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap的错误解决办法

    在JavaEE开发中,在把配置文件中的数据或用户表单提交上来的数据,封装在相应JavaBean的对象的对应属性中时:在实际开发中,使用第三方法工具包BeanUtils(commons-beanutil ...

  2. Apache Commons Collections 反序列化详细分析学习总结

    0x01.环境准备: Apache Commons Collections 3.1版本,下载链接参考: https://www.secfree.com/a/231.html jd jui地址(将jar ...

  3. java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap报错解决

    在使用 commons-beanutils-1.9.2.jarcommons-logging-1.1.1.jar 的时候报错 java.lang.NoClassDefFoundError: org/a ...

  4. java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap

    七月 26, 2017 1:52:15 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for ...

  5. 出现java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap错误问题解决

    首先出现这个问题,你应该是用了 BeanUtils.populate(meter,map); import org.apache.commons.beanutils.BeanUtils;并且导入了co ...

  6. ysoserial分析【一】 之 Apache Commons Collections

    目录 前言 基础知识 Transformer 利用InvokerTransformer造成命令执行 Map TransformedMap LazyMap AnnotationInvocationHan ...

  7. Apache Commons Collections

    http://commons.apache.org/proper/commons-collections/userguide.html 1. Utilities SetUtils Collection ...

  8. 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer

    原因: 这里添加的jar包和android自带的jar产生了冲突

  9. 关于使用工具类org.apache.commons.collections.ListUtils合并List的问题

    今天在做项目时,需要将几个List进行合并,于是就用到了apache提供关于List操作的工具类ListUtils,但是在使用的过程中发现一些问题. public static void main(S ...

  10. java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap-----commons-ctions版本问题

    今天用到了一系列的第三方jar包,一环扣一环, 记住一个: 倘若你所导入的第三方jar包中的类一直显示未找到,那就是你的路径出问题了, /WEB-INF/lib目录下才是放第三方jar包位置, 但是今 ...

随机推荐

  1. [解决方案] 当 IDENTITY_INSERT 设置为 OFF 时

    当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'tbUser' 中的标识列插入显式值. 解决:这个情况是你的表里面,有一列数据类型是IDENTITY的,也就是数据库自动递增列对于自 ...

  2. phyreengine 3.12.0 安装遇到的问题

    发现他们文档都是旧的....略渣阿 需要安装vs2012 update4 vs2013update4 nvdia cg toolkits 3.1 以及 windows SDK 8.1 编译运行第一个s ...

  3. Curse of Dimensionality

    Curse of Dimensionality Curse of Dimensionality refers to non-intuitive properties of data observed ...

  4. [百度空间] [转]程序员趣味读物:谈谈Unicode编码

    出处:CSDN [ 2005-05-13 10:05:53 ] 作者:fmddlmyy 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG ...

  5. 录制iphone手机视频

    1: 升级自己的手机到ios8, 同时mac os也要升级到10.10 2: 用usb数据线将手机连上电脑. 3: 打开quicktime player创建新movie 4: 选择手机作为音频.视频源 ...

  6. MySQL数据库优化总结

    对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要.一般来说,要保证数据库的效率,要做好以下四个方面的工作:数 据库设计.sql语句优化.数据库参数配置.恰当的硬件资 ...

  7. 【转】dip,px,pt,sp 的区别

    dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. ...

  8. 20款最受欢迎的HTML5游戏引擎收集

    在“最火HTML5 JavaScript游戏引擎”系列文章国外篇(一)中,我们盘点了当下备受开发者推崇的非国产HTML5和JavaScript游戏引擎.在各种2D小游戏逆袭的今天,用HTML5和Jav ...

  9. 传说中的WCF(12):服务器回调有啥用

    你说,服务器端回调有啥用呢?这样问,估计不好回答,是吧.不急,先讨论一个情景. 假设现有服务器端S,客户端A开始连接S并调用相关操作,其中有一个操作,在功能上有些特殊,调用后无法即时回复,因为在服务器 ...

  10. dom对象详解--document对象(二)

       dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...