java hashtable的用法_【深入Java基础】Hashtable的用法:基本用法,排序及同步

Hashtable的用法:基本用法,排序及同步

Hashtable是继承的Dictionary类,实现了Map

Hashtable hashtable = new Hashtable<>();

hashtable.put(1,"aa");

hashtable.put(4,"dd");

hashtable.put(2,"bb");

hashtable.put(3,"cc");

System.out.println(hashtable);

添加null位key或value

hashtable.put(null,"xx");

kye=null时抛出异常:Exception in thread "main" java.lang.NullPointerException

hashtable.put(5,null);

value=null时仍然抛出异常。

所以key和value都不能为null。

根据key获取value

System.out.println(hashtable.get(1));//aa

删除entry

remove(key):删除成功(存在key),返回被删除的key对应的value,否则返回null。

remove(key,value):删除成功(存在entry),返回true,否则返回false

System.out.println(hashtable.remove(1));//aa

System.out.println(hashtable.remove(2,"bb"));//true

遍历

遍历很简单,获取迭代器遍历即可。

Iterator iterator = hashtable.keySet().iterator();

while (iterator.hasNext()){

Integer key = iterator.next();

System.out.println(key+"="+hashtable.get(key));

}

排序

对于以下hashtable排序:

Hashtable hashtable = new Hashtable<>();

hashtable.put(1,"aa");

hashtable.put(4,"dd");

hashtable.put(2,"bb");

hashtable.put(3,"cc");

System.out.println(hashtable);

输出:{4=dd, 3=cc, 2=bb, 1=aa}

有序的?否。只是个巧合。

Hashtable hashtable = new Hashtable<>();

hashtable.put(1,"aa");

hashtable.put(4,"dd");

hashtable.put(2,"bb");

hashtable.put(3,"cc");

System.out.println(hashtable);

输出:{4=dd, 3=cc, 200=bb, 1=aa}

这样就不是有序的了,方便测试。

两种排序方法:

Collections.sort排序

List> list = new ArrayList<>(hashtable.entrySet());

Collections.sort(list, new Comparator>() {

@Override

public int compare(Map.Entry o1, Map.Entry o2) {

return o1.getKey().compareTo(o2.getKey());

}

});

for (Map.Entry entry : list){

System.out.println(entry.getKey()+"="+entry.getValue());

}

在用这种方法排序时,只将keySet放入list然后在使用Collections.sort排序无效,不知为何。只有将entrySet放入list在排序才有效,而hashmap则可以只将keySet放入list排序得到有序的key即可。

利用TreeMap

TreeMap treeMap = new TreeMap<>(new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o1.compareTo(o2);

}

});

treeMap.putAll(hashtable);

System.out.println(treeMap);

多线程中使用测试

hashtable是同步的可以直接用于多线程中。但是在迭代输出时,仍需要手动同步,否则抛出异常。

new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

hashtable.put(i, "value" + i);

try {

Thread.sleep(new Random().nextInt(1));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

synchronized (hashtable) {//迭代必须同步

if (hashtable.size() > 0) {

for (Map.Entry entry : hashtable.entrySet()) {

System.out.println(entry.getKey() + "=" + entry.getValue());

}

//System.out.println(hashtable.get(500));

}

try {

Thread.sleep(new Random().nextInt(10));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}).start();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值