2

我想遍历具有大量数据(大约 1 GB)的 Hashtable 的值。为此,我正在使用:

Hashtable<String,Object> myHashtable = new Hashtable<String,Object>;

// Fill the Hashtable here...

// Get the values as a Collection:
Collection<Object> myValues = myHashtable.values();

// Get the values as an array:
ArrayList<Object> myArray = myValues.toArray();

// Iterate through the values here...

所以,我的问题是:我是否将存储的数据相乘?我是否在 RAM 中存储了 3 个相同值的副本(一份在 Hashtable 中,一份在 Collection 中,一份在 ArrayList 中)?

如果答案是肯定的,我复制了数据,有没有办法在不复制数据的情况下遍历 Hashtable 的值?

如果答案是否定的,那么这是否意味着 Collection 存储指针?在这种情况下,如果我在创建集合后修改 Hashtable 中的数据,集合是否反映了该更改?(对于 ArrayList 的问题相同)。

谢谢!

4

2 回答 2

2

values()方法不会复制数据,根据文档,它返回地图中值的视图 - 意思是:如果您更改元素,myValues那么更改将反映在原始地图上。

另一方面,toArray() 确实会重复数据,(并且它返回一个数组,而不是ArrayList您的代码所暗示的),因为它创建了一个新数组,其中包含myValues. 此外,由于数组包含对原始地图中元素的引用,如果对象是可变的,则它们上的更改将反映在地图上 - 但如果您修改数组本身(例如,将其元素之一设置为 null),则更改不会反映在地图上。

在不创建额外副本的情况下迭代映射值的最简单方法是对这些值使用迭代器:

for (Object val : myHashtable.values()) {
    // do something with each value
}

请记住,因为映射中的值、内容myValues和内容myArray都是对相同对象的引用,所以您对它们所做的任何更改也会反映在其他对象上(假设它们是可变的。)

于 2012-06-05T02:39:13.830 回答
2

查看Hashtable.values() 文档

集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。

返回的Collection包含对存储在您的相同对象的引用Hashtable,因此数据不会“重复”;它只是您的一个视图Hashtable。如果您更改其中一个存储的对象,您将观察到 theHashtable和 the的变化Collection(因为它是同一个对象)。

于 2012-06-05T02:39:21.530 回答