Java learning -hashcode Exercises

1. hashcode custom strings

2. Custom MyHashMap

 

 

 3. Find content performance compare

 

 

 

Wherein: IHashMap interfaces, Entry following classes

 

1 package Collection;
2 
3 public interface IHashMap {
4     public void put(String key,Object value);
5     public Object get(String key);
6         
7 }

 

 1 package Collection;
 2 
 3 public class Entry {
 4     public Object key;
 5     public Object value;
 6     public Entry(Object key,Object value){    //构造方法
 7         this.key=key;
 8         this.value=value;
 9     }
10     public String toString(){
11         return "[key=" + key + ", value=" + value + "]";
12     }
13     
14 }

 

给出代码:

  1 package Collection;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashSet;
  5 import java.util.Iterator;
  6 import java.util.LinkedList;
  7 import java.util.List;
  8 
  9 import charactor.Hero;
 10 
 11 public class myHashMap implements IHashMap {
 12     public static int hashcode(String str) {
 13         if (str.length() == 0)
 14             return 0;
 15         char tmpCharArr[] = str.toCharArray();
 16         int cnt = 0;
 17         for (int i = 0; i < tmpCharArr.length; i++)
 18             cnt += (int) tmpCharArr[i];
 19         cnt = cnt * 23;
 20         if (cnt < 0)
 21             cnt = cnt * (-1);
 22         if (cnt > 1999)
 23             cnt = cnt % 2000;
 24         return cnt;
 25 
 26         // //测试hashcode,大小为5
 27         // if(str.length()==0)
 28         // return 0;
 29         // int cnt=Integer.parseInt(str);
 30         // if(cnt>=5)
 31         // return cnt%5;
 32         // return cnt;
 33         //
 34     }
 35 
 36     public static char ranChar() {
 37         while (true) {
 38             int n = (int) Math.round(Math.random() * 128);
 39             char c = (char) n;
 40             if (Character.isDigit(c) || Character.isLetter(c))
 41                 return c;
 42         }
 43     }
 44 
 45     public static List<String> ranArr(int num) { // 随机生成长度是2-10的不等的num个字符串
 46         List<String> arr = new ArrayList(); // 最后返回arr
 47         HashSet<String> hs = new HashSet(); // 保证随机生成的字符串互不相等
 48         int i = 0;
 49         while (i < num) {
 50             int randLength = (int) (Math.round(Math.random() * 8) + 2);// 随机生成长度是2-10
 51             String tmpStr = "";
 52             for (int j = 0; j < randLength; j++) {
 53                 tmpStr += ranChar();
 54             }
 55             if (hs.add(tmpStr) == true) // 保证随机生成的字符串互不相等
 56                 i++;
 57         }
 58         for (String s : hs) { // HashSet转成List便于以后的操作
 59             arr.add(s);
 60         }
 61         return arr;
 62     }
 63 
 64     Object[] hashArr = new Object[2000]; // 自己定义的Hash表,由2000个对象组成
 65 
 66     @Override
 67     public void put(String key, Object value) {
 68         // TODO Auto-generated method stub
 69         int index = hashcode(key);
 70         // 下面两行用于应对hashArr[index]为空时,填入LinkedList<Entry>类型
 71         LinkedList<Entry> tmpLinkedList = new LinkedList();
 72         Entry E = new Entry(key, value);
 73         tmpLinkedList.add(E);
 74 
 75         if (hashArr[index] == null) {
 76             hashArr[index] = tmpLinkedList;
 77         } else {// hashArr[index]非空,说明它本身是LinkedList<Entry>类型,直接add即可
 78             LinkedList<Entry> ll = (LinkedList<Entry>) hashArr[index];
 79             ll.add(E);
 80         }
 81     }
 82 
 83     @Override
 84     public Object get(String key) {
 85         // TODO Auto-generated method stub
 86         int index = hashcode(key);
 87         if (hashArr[index] == null)
 88             return null;
 89         else {
 90             LinkedList<Entry> tmpList = (LinkedList<Entry>) hashArr[index];
 91             for (int i = 0; i < tmpList.size(); i++) {
 92                 if (tmpList.get(i).key.equals(key)) { // 找到了对应的key--value
 93                     return tmpList.get(i).value; // 返回key对应的value
 94                 } else {
 95                     return null;
 96                 }
 97             }
 98         }
 99         return null;
100     }
101 
102     public Object get2(String key) { // 用于测试myHashMap性能
103         // TODO Auto-generated method stub
104         int index = hashcode(key);
105         if (hashArr[index] == null)
106             return null;
107         else {
108             LinkedList<Entry> tmpList = (LinkedList<Entry>) hashArr[index];
109             int cnt = 0;//"hero-5555"的数量
110             //"hero-5555"以外的hero也可能hash到和"hero-5555"相同的地方,只好for循环找出来
111             for (int i = 0; i < tmpList.size(); i++) {
112                 if (tmpList.get(i).key.equals(key)) { // 找到了对应的key-value
113                     cnt++;
114                 }
115             }
116             return cnt;
117         }
118     }
119     public static void testHashCode(){
120         List<String> rndArr=ranArr(100);
121         List <Integer>rndArrHashCode=new ArrayList();
122         for(int i=0;i<100;i++){
123             rndArrHashCode.add(hashcode(rndArr.get(i)));
124         }
125         System.out.println("HashCode后的值为:");
126         System.out.println(rndArrHashCode);
127     }
128 
129     public static void testEfficiency(int n) {        //n是测试规模
130         ArrayList<Hero> heros = new ArrayList<>();
131         myHashMap mp = new myHashMap();
132         for (int i = 0; i < n; i++) {
133             int rnd = (int) Math.round(Math.random() * 9000 + 1000);
134             heros.add(new Hero("hero-" + rnd)); // 办法一
135             mp.put("hero-" + rnd, rnd); // 办法二
136         }
137 
138         // 办法一:for循环查找
139         long st1 = System.currentTimeMillis();
140         int cnt1 = 0; // 统计"hero-5555"个数
141         for (int i = 0; i < n; i++) {
142             if (heros.get(i).name.equals("hero-5555"))
143                 cnt1++;
144         }
145         long et1 = System.currentTimeMillis();
146         System.out.printf("for循环耗时:%d ms\n共找到%d个\n", (et1 - st1), cnt1);
147 
148         // 办法二:myHashMap查找
149 
150         long st2 = System.currentTimeMillis();
151         int cnt2 = 0; // 统计"hero-5555"个数
152         cnt2 = (int) mp.get2("hero-5555");
153         long et2 = System.currentTimeMillis();
154         System.out.printf("myHashMap耗时:%d ms\n共找到%d个", (et2 - st2), cnt2);
155     }
156     
157     public static void main(String[] args) {
158         testHashCode();
159         testEfficiency(300000);
160     }
161 }

效果图:

Guess you like

Origin www.cnblogs.com/gilgamesh-hjb/p/12229186.html
Recommended