powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable vs HashMap
9 сообщений из 9, страница 1 из 1
Hashtable vs HashMap
    #33693554
trans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа знатоки, возник у меня следующий вопрос. Что выгоднее использовать для более быстрого процесса Hashtable или HashMap. Я так понял, что HashMap не подвержен синхронизации и вследствии этого вроде должен быть побыстрее в общем случае. Я набросал тестик и не смог получить для HashMap большей скорости. Загрузка идет в 2 раза дольше. Поиск или примерно равен, или идет дольше.
Собственно говоря вопрос, я что-то не так делаю, или быстрота HashMap проявляется как-то по другому?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
 package  com;

 import  java.sql.*;
 import  java.util.*;

 public   class  RunTest { 

	 public   static   void  main(String[] args)  throws  Exception {

		System.out.println("#1: Fill HashMap");
		System.out.println("#2: get from HashMap");
		System.out.println("#3: Fill Hashtable");
		System.out.println("#4: get from Hashtable");

		 int  loopCount =  500000 ;
		 long  d1, d2;
		Object o;

		HashMap<String, Object> hm =  new  HashMap<String, Object>();

		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
			Integer value =  new  Integer(i);
			hm.put(value.toString(), value);
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #1: " + (d2-d1));

		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
//			o = hm.get(Integer.toString(i));
			o = hm.get("777");
			o = hm.get("888");
			o = hm.get("999");
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #2: " + (d2-d1));

		hm.clear();

		Hashtable<String, Object> ht =  new  Hashtable<String, Object>();
		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
			Integer value =  new  Integer(i);
			ht.put(value.toString(), value);
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #3: " + (d2-d1));

		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
//			o = ht.get(Integer.toString(i));
			o = hm.get("777");
			o = hm.get("888");
			o = hm.get("999");
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #4: " + (d2-d1));

		ht.clear();
		
	}
}

На выходе имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
# 1 : Fill HashMap
# 2 : get from HashMap
# 3 : Fill Hashtable
# 4 : get from Hashtable
step # 1 :  2625 
step # 2 :  641 
step # 3 :  843 
step # 4 :  250 
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33693608
wnoise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очепатка в тесте: в четвертом шаге берутся данные из Hashmap'а опять, а не из HashTable
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694097
OU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OU
Гость
Здесь можно общую инфо глянут:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/HashMap.html

В вашем примере HashMap вы хотя и используэте generics, но вы используете Object для хранения Integer. Это будет занимть допольнительного времени на boxing и unboxing.
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694159
Hashtable бог?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очеловечим слегка тест:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
 
 import  java.util.HashMap;
 import  java.util.Hashtable;
 import  java.util.IdentityHashMap;
 import  java.util.LinkedHashMap;
 import  java.util.Map;
 import  java.util.TreeMap;
 import  java.util.Collections;

 public   class  RunTest {
     public   static   final   int  LOOP_COUNT =  500000 ;

     public   static   void  main(String[] args)  throws  Exception {
         for  ( int  i =  0 ; i <  3 ; i++) {
            System.out.println("---------------------");
            testMap( new  Hashtable<String, Object>());
            testMap( new  HashMap<String, Object>());
            testMap(Collections.synchronizedMap( new  HashMap<String, Object>()));
            testMap( new  LinkedHashMap<String, Object>());
            testMap( new  TreeMap<String, Object>());
            testMap( new  IdentityHashMap<String, Object>());
        }
    }

     private   static   void  testMap(Map<String, Object> map) {
         new  FillTest().test(map);
         new  ReadTest().test(map);
        System.out.println();
    }

     abstract   static   class  Test {
         public   void  test(Map<String, Object> map) {
            String message = getTestName() + " " + map.getClass().getName() + ": ";
             long  time = System.currentTimeMillis();
            excute(map);
            System.out.println(message + (System.currentTimeMillis() - time));
        }

         protected   abstract  String getTestName();

         protected   abstract   void  excute(Map<String, Object> map);
    }

     static   class  FillTest  extends  Test {
         protected  String getTestName() {
             return  "Fill ";
        }

         protected   void  excute(Map<String, Object> map) {
             for  ( int  i =  0 ; i < LOOP_COUNT; i++) {
                 int  j = i;// % 1000;
                map.put(Integer.toString(j), j);
            }
        }
    }

     static   class  ReadTest  extends  Test {

         protected  String getTestName() {
             return  "Read ";
        }

         protected   void  excute(Map<String, Object> map) {
             for  ( int  i =  0 ; i < LOOP_COUNT; i++) {
                map.get("1");
                map.get("500");
                map.get("999");
            }
        }
    }
}

Results (int j = i;):

Fill java.util.Hashtable: 651
Read java.util.Hashtable: 140

Fill java.util.HashMap: 1573
Read java.util.HashMap: 100

Fill java.util.Collections$SynchronizedMap: 1282
Read java.util.Collections$SynchronizedMap: 120

Fill java.util.LinkedHashMap: 1642
Read java.util.LinkedHashMap: 110

Fill java.util.TreeMap: 1222
Read java.util.TreeMap: 1752

Fill java.util.IdentityHashMap: 982
Read java.util.IdentityHashMap: 130

Results (int j = i % 1000;):

Fill java.util.Hashtable: 190
Read java.util.Hashtable: 130

Fill java.util.HashMap: 140
Read java.util.HashMap: 90

Fill java.util.Collections$SynchronizedMap: 151
Read java.util.Collections$SynchronizedMap: 110

Fill java.util.LinkedHashMap: 140
Read java.util.LinkedHashMap: 100

Fill java.util.TreeMap: 260
Read java.util.TreeMap: 531

Fill java.util.IdentityHashMap: 1212
Read java.util.IdentityHashMap: 140

Забавненько...
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694213
trans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wnoiseочепатка в тесте: в четвертом шаге берутся данные из Hashmap'а опять, а не из HashTable
Факт! Спасибо. Видно у меня уже глаза замылились.
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694216
Hashtable бог?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
fill:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                int j = i;
                map.put(Integer.toString(j), j);
            }
read:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                map.get("9");
                map.get("99");
                map.get("999");
                map.get("9999");
                map.get("99999");
                map.get("499999");
            }
result: 

Fill  java.util.Hashtable:  671 
Read  java.util.Hashtable:  321 

Fill  java.util.HashMap:  1332 
Read  java.util.HashMap:  240 

Fill  java.util.Collections$SynchronizedMap:  1272 
Read  java.util.Collections$SynchronizedMap:  280 

Fill  java.util.LinkedHashMap:  1633 
Read  java.util.LinkedHashMap:  280 

Fill  java.util.TreeMap:  1202 
Read  java.util.TreeMap:  4376 



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
fill:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                int j = i %  1000 ;
                map.put(Integer.toString(j), j);
            }
read:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                map.get("9");
                map.get("99");
                map.get("999");
                map.get("9999");
                map.get("99999");
                map.get("499999");
            }
result: 

Fill  java.util.Hashtable:  150 
Read  java.util.Hashtable:  241 

Fill  java.util.HashMap:  140 
Read  java.util.HashMap:  180 

Fill  java.util.Collections$SynchronizedMap:  221 
Read  java.util.Collections$SynchronizedMap:  240 

Fill  java.util.LinkedHashMap:  180 
Read  java.util.LinkedHashMap:  200 

Fill  java.util.TreeMap:  281 
Read  java.util.TreeMap:  1582 


Тенденция ясна...
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694244
trans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OUЗдесь можно общую инфо глянут:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/HashMap.html

В вашем примере HashMap вы хотя и используэте generics,

Имеете ввиду, что можно поиграться с capacity?

OU
но вы используете Object для хранения Integer. Это будет занимть допольнительного времени на boxing и unboxing.
Попробовал. Особобого выигрыша не заметил.
Но в общем случае согласен, что чем больше явной типизации в Яве, тем лучше.
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694345
OU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OU
Гость
2 trans:
Можно конечно ради интереса.
В принципе тест Hashtable бог все расставляет на места.
...
Рейтинг: 0 / 0
Hashtable vs HashMap
    #33694502
trans
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OU2 trans:
Можно конечно ради интереса.
В принципе тест Hashtable бог все расставляет на места.
Угу. Я изначально не правильно составил тест. После закачки данных, я в цикле выбирал каждое значение. В этом случае Hashtable почему-то выдает более хороший результат. Если дергать отдельные значения, HashMap явный фаворит.
Но для дерганья каждого значения есть другие классы. Так что, надо было изначально строить тест на отдельных значениях.

Спасибо всем откликнувшимся.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable vs HashMap
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]