public class SeparateChainingHashTable<T> { public SeparateChainingHashTable(){ this(DEFAULT_TABLE_SIZE); } public SeparateChainingHashTable(int size){ theLists=new LinkedList[nextPrime(size)]; for(int i=0;i<theLists.length;i++){ theLists[i]=new LinkedList<T>(); } } public void insert(T val){ List<T> whichList=theLists[myhash(val)]; if(!whichList.contains(val)){ whichList.add(val); if(++currentSize>theLists.length){ rehash(); } } } public void makeEmpty(){ for(int i=0;i<theLists.length;i++){ theLists[i].clear(); } currentSize=0; } public void remove(T val){ List<T> whichList=theLists[myhash(val)]; if(whichList.contains(val)){ whichList.remove(val); currentSize--; } } public boolean contains(T val){ List<T> whichList=theLists[myhash(val)]; return whichList.contains(val); } private static final int DEFAULT_TABLE_SIZE=101; private List<T>[] theLists; private int currentSize; private void rehash(){ } private int myhash(T val){ int hashVal=val.hashCode(); hashVal%=theLists.length; if(hashVal<0){ hashVal+=theLists.length; } return hashVal; } private static int nextPrime(int n){ boolean state=isPrime(n); while(!state) { state=isPrime(++n); } return n; } private static boolean isPrime(int n){ if ( n==1 || n ==4 ) return false; if ( n ==2 || n== 3 ) return true; //num从5开始进入循环,以保证√n>=2,循环不会被跳过 for ( int i = 2; i<= Math.sqrt( n ); i++ ) { if ( n% i==0 ) return false; } return true; } }