遍历hashtable并截取遍历的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遍历hashtable并截取遍历的问题相关的知识,希望对你有一定的参考价值。

遍历hashtable,得到它的最后一个key,在遍历hashtable时,就从这个key之后继续遍历,这要怎么实现哈,思路是什么?

HashMap遍历的两种方式:
第一种:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext())
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();

效率高,推荐使用此种方式!
第二种:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext())
Object key = iter.next();
Object val = map.get(key);

效率低比第一种要低,不推荐使用!

下面是一个实例,通过运行的毫秒数可以看出两种方法遍历速度的快慢
public class HashMapTest
public static void main(String[] args)
HashMap hashmap = new HashMap();
for (int i = 0; i < 1000; i++ )
hashmap.put(i, "thanks");


long bs = Calendar.getInstance().getTimeInMillis();
Iterator iterator = hashmap.keySet().iterator();
while (iterator.hasNext())
System.out.print(hashmap.get(iterator.next()));

System.out.println();
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
listHashMap();


public static void listHashMap()
java.util.HashMap hashmap = new java.util.HashMap();
for (int i = 0; i < 1000; i++ )
hashmap.put(i, "thanks");

long bs = Calendar.getInstance().getTimeInMillis();
java.util.Iterator it = hashmap.entrySet().iterator();
while (it.hasNext())
java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
// entry.getKey() 返回与此项对应的键
// entry.getValue() 返回与此项对应的值
System.out.print(entry.getValue());

System.out.println();
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);



对于keySet其实是遍历了2次,一次是转为iterator,一次就是从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以快了。

我验证了一下,两种遍历的遍历时间相差还是很明显的,有兴趣的同学可以直接把代码粘过去试下,另外运用时间来比较程序运行效率的方法也很值得学习,也很简单
参考技术A 你说的是什么啊 参考技术B 哈希表 是键值存储模式,最后一个key后面还有东西吗

如何遍历 Map 并克隆每个值? [复制]

【中文标题】如何遍历 Map 并克隆每个值? [复制]【英文标题】:How to loop through a Map and clone each value? [duplicate] 【发布时间】:2013-11-14 17:58:23 【问题描述】:

我需要知道如何循环遍历一个哈希表,检查每个值的可克隆性,并在可能的情况下进行克隆。此 Hashtable 具有所有 String 键,但值可以是任何类。我在另一个 Stack Overflow 页面上遇到了以下 Hashmap 示例,但我需要使用 Hashtable 来执行此操作。更具体地说,一个不带括号的。 (哈希表而不是 Hashtable&lt;Type, Type&gt;。)我还看到了循环遍历 ArrayList 并克隆每个元素的示例,但我需要使用哈希表来执行此操作。我在下面发布了两段代码:第一段是我找到的 HashMap 示例,第二段是我目前的提案和我遇到的问题。

哈希映射

public Map<String,C> deepCopy(Map<String, C> original) 
    Map<String, C> copy = new HashMap<String, C>(original.size());
    for(Map.Entry<String, C> entry : original.entries()) 
        copy.put(entry.getKey(), entry.getValue().clone());
    

我的建议

public class _HashtableCloningTest 
    public Hashtable deepClone(Hashtable original) 
        Hashtable newH = new Hashtable(original.size())
        Set<String> keys = original.keySet();
            for (String key : keys)
                if (original.get(key) instanceof Cloneable)
                    newH.put(key, original.get(key).clone());
        return newH;
    

此代码无法编译。该错误表示克隆方法在对象类上,并且该类上的方法受到保护。我需要它来克隆当前值的类,但由于我作为程序员不知道该类,所以我不知道如何将它转换为正确的类。

非常感谢您提供有关此障碍的任何见解和帮助。

【问题讨论】:

为什么要克隆任意对象?这通常是一种代码异味,IME。 这是我的客户想要的方式。我意识到可能有更好的方法,但我需要知道如何做到这一点。我被告知这是可能的,即使不是最好的解决方案。 您的代码的问题是,Cloneable 很难正确实现,因此对于很多人来说,克隆您的对象并不是可靠的方法。阅读***.com/questions/4081858/about-java-cloneable要解决您的问题,您需要知道此地图中放置了哪些类型的实例并正确转换。 Cloneable 在 Java 中基本上是一场灾难。为什么您的客户对 Java 了解得足够多,以至于关心Cloneable,却不足以知道Cloneable 有多糟糕? 【参考方案1】:

clone() 方法受到保护,以防止您克隆任意对象,这通常表明您正在尝试做一些奇怪的事情。

Cloneable 不包含clone() 有点不方便。有关此事的讨论,请参阅Why is the clone() method protected in java.lang.Object? 的答案。

另请参阅https://***.com/a/10083129/616460 的答案,了解有关clone() 的一般问题的一些好的建议。

无论如何,如果你不得不这样做......

一种选择可能是定义一个接口,将对象标记为可以为您的哈希表复制,并提供clone(),例如:

public interface Copiable extends Cloneable 
    public Object clone ();

第二种选择是创建一些接口,提供一种方法来制作对象的深层副本,并让你的类实现它,例如:

public interface Copiable 
    public Copiable createDeepCopy ();

如果您不顾一切,还有一个选择是使用反射在 Cloneable 对象上调用 clone()。不过,您不妨三思而后行。

【讨论】:

以上是关于遍历hashtable并截取遍历的问题的主要内容,如果未能解决你的问题,请参考以下文章

Hashtable一个键多个值 在遍历怎么做啊

Hashtable元素的遍历

java 多线程操作hashtable(添加,删除,遍历)

HashTable中的元素可以用for循环去遍历吗?

HashTable的遍历

HashTable集合遍历的三种方法