【问题标题】:How to set o real copy of a hashtable inside a array in java?java - 如何在java中的数组内设置哈希表的真实副本?
【发布时间】:2011-08-29 06:08:41
【问题描述】:

我正在尝试为此做一个哈希表的数组列表:

ArrayList<java.util.Hashtable<String, String>> info = new ArrayList<java.util.Hashtable<String, String>>();

这完成了这项工作,但后来我需要使用 for 循环在 info 中添加一些哈希表:

java.util.Hashtable<String, String> e = new java.util.Hashtable<String, String>();
while(rs.next()){
    e.clear();
    for(String a:dados){
        e.put(a,rs.getString(a));                       
    }
    info.add(e);    
}

问题在于方法 add 不会将 e 复制到 info,它只定义一个指向 e 的指针,因此当我更新 e 时,所有插入的元素都会获得新的 e 值。

任何人都可以提供一些帮助吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: java arraylist hashtable


    【解决方案1】:

    这应该可行:

    import java.util.ArrayList;
    import java.util.Hashtable;
    import java.util.Map;
    import java.util.List;
    
    List<Map<String, String>> info = new ArrayList<Map<String, String>>();
    
    while (rs.next()) {
        Map<String, String> e = new Hashtable<String, String>();
        e.clear();
        for (String a : dados) {
            e.put(a, rs.getString(a));
        }
        info.add(e);
    }
    

    您应该尽量避免通过它们的实现类来声明集合(将它们声明为List 而不是ArrayList,或Map 而不是Hashtable)。

    【讨论】:

    • 感谢解决方案 :) 这个新闻元素会造成内存泄漏吗?
    • 您需要非常努力地在 java 中创建内存泄漏 :)。这不是这样的情况:)。
    【解决方案2】:

    如果您在循环中每次都使用 new,则不需要 clear()。

    java.util.Hashtable e = new java.util.Hashtable();

    而(rs.next()){ e = new java.util.Hashtable(); for(String a:dados){ e.put(a,rs.getString(a));
    } info.add(e);
    }

    【讨论】:

    • 感谢解决方案 :) 这个新闻元素会造成内存泄漏吗?
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2013-05-31
    • 2011-01-19
    相关资源
    最近更新 更多