(编程解决)List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个有什么区别?
这是一个面试经常问到的问题,我就被问到过,原来还真的没有考虑过这样的问题,只是去比较该用Vector还是ArrayList,该用 Hashtable还是该用HashMap了,我喜欢用示例测试,并在其中加上附注,这样更好理解,如需要看更详细的集合之间的关系,请参看:
集合詳細學習(包括Vector、ArrayList、List等等的比較與實例)。
import
java.util.*;
/**
*
List
和
Hashtable
都是可以存储数据的,可为什么有时选择
List
,有时需要
Hashtable
,这两个有什么区别?
*
下面的例子可以回答这个问题
*
@author
http://blog.csdn.net/fenglibing
*
*/
publicclass
ListAndHashtable {
//
将构造器私有化,就不能对别的对象创建新对象了。
private
ListAndHashtable()
{
testList();
testHashtable();
}
/**
*
@param
args
*/
publicstaticvoid
main(String[] args) {
//
TODO
Auto-generated method stub
new
ListAndHashtable();
//
但是这里可以正常使用
.
}
void
testList()
{
List list=
new
ArrayList();
list.add(
"OK1"
);
list.add(
"OK1"
);
//
测试是否允许重复值
list.add(0,
"OK2"
);
list.add(0,
"OK2"
);
//
测试是否在指定插入位置的时候,把前面的值替换掉
list.add(
"OK3"
);
for
(
int
i=0;i<list.size();i++)
{
//List
的取值方式,是以下标而取,不能够按值取对象
System.
out
.print(
" "
+list.get(i));
}
//
上面输出结果为:
OK2 OK2 OK1 OK1 OK3
,说明允许重复值,
//
就算指定下标也不会把原来的值取代,会自动后移。
System.
out
.println();
Iterator it=list.iterator();
while
(it.hasNext())
{
System.
out
.print(
" "
+it.next());
}
//
上面输出结果为:
OK2 OK2 OK1 OK1 OK3
System.
out
.println();
Iterator it1=list.listIterator();
while
(it1.hasNext())
{
System.
out
.print(
" "
+it1.next());
}
//
上面输出结果为:
OK2 OK2 OK1 OK1 OK3
}
void
testHashtable()
{
Hashtable table=
new
Hashtable();
table.put(
"a"
,
"You are very good!"
);
table.put(
"b"
,
"You not are very good!"
);
table.put(
"c"
,
"You are very bad!"
);
table.put(
"a"
,
"You are very good! Last"
);
System.
out
.print(
" "
+table.get(
"a"
));
//
下面输出结果是:
You are very good! Last
,说明一个键只能够有一值,后面的值会取代原来的值
//
取值方式,只能够通过按键取值,不能够通过下标取值。
System.
out
.println();
System.
out
.println(table.toString());
//
输出结果为:
{b=You not are very good!, a=You are very good! Last, c=You are very bad!}
//
说明将
table
的键值可以转换成为字符串输出
Enumeration e=table.elements();
//
枚举,可以依次将值列出来
while
(e.hasMoreElements())
{
System.
out
.print(e.nextElement());
}
//
输出结果为:
You not are very good!You are very good! LastYou are very bad!
}
}
class
test
{
private
test()
{
//
因为
ListAndHashtable
的构造器为
private
,所以这里不能够创建对象,会报错
ListAndHashtable l=
new
ListAndHashtable();
}
}
注:
Hashtable与HashMap:
Hashtable是同步的,即线程安全的,就是多个线程也可以时对其进行访问,不会出现数据不一致的情况,且不允许空值;HashMap是非线程安全的,并且允许空值,在线程环境中就需要人为的对其进行同步处理,否则就会出现数据不一致的情况,因而期在单线程的情况下,因为其不同步性,所以就效率上来说HashMap肯定是优于Hashtable了;二者的共同点都是键值对关,且都是一一对应,不可能出现两个键,因为其键为唯一关键字,但值肯定可以相同了。