(编程解决)List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个有什么区别?

 

(编程解决)List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个有什么区别?
这是一个面试经常问到的问题,我就被问到过,原来还真的没有考虑过这样的问题,只是去比较该用Vector还是ArrayList,该用 Hashtable还是该用HashMap了,我喜欢用示例测试,并在其中加上附注,这样更好理解,如需要看更详细的集合之间的关系,请参看: 集合詳細學習(包括Vector、ArrayList、List等等的比較與實例)。
import java.util.*;
/**
  * List Hashtable 都是可以存储数据的,可为什么有时选择 List ,有时需要 Hashtable ,这两个有什么区别?
  * 下面的例子可以回答这个问题
  * @author http://blog.csdn.net/fenglibing
  *
  */
public class ListAndHashtable {
 
    // 将构造器私有化,就不能对别的对象创建新对象了。
    private ListAndHashtable()
    {
       testList();
       testHashtable();
    }
    /**
      * @param args
      */
    public static void 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了;二者的共同点都是键值对关,且都是一一对应,不可能出现两个键,因为其键为唯一关键字,但值肯定可以相同了。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值