3

I have a class named Stored that will hold my Hashtable, which will hold Objects from the Class "Item". I have never used Hashtables before or really know all that much about them, but from my snooping around it seems as if there is a lot of different ways to use them. So my question is, which is the best? And why?

CODE UPDATED

I have in my program this...

public class Store implements Serializable{

Hashtable<String, Item> store = new Hashtable<String, Item>();

}

I have also seen this...

Hashtable<Object> store = new Hashtable<Object>();

Is one better than the other?

Also for reference my Item Class Objects will have 2 strings and an int as variables if that matters at all.

I'm also wondering if these Hashtables should need any constructor or maybe a size initialization? I have seen that in some examples and not in others. As far as I know they increase in size automatically so...whats the point?

EDIT:

I have this in my main...

Store store = new Store();

    Item item1 = new Item();
    item1.setProductName("Paper Towel Roll");
    item1.setBarCode("111222333444");
    item1.setQuantity(1);

    store.put("111222333444", item1);

    Item item2 = new Item();
    item2.setProductName("Paper Towel Roll");
    item2.setBarCode("111222333444");
    item2.setQuantity(1);

    store.put("111222333444", item2);

    Item item3 = new Item();
    item3.setProductName("Paper Towel Roll");
    item3.setBarCode("111222333444");
    item3.setQuantity(1);

    store.put("111222333444", item3);

    Item item4 = new Item();
    item4.setProductName("Paper Towel Roll");
    item4.setBarCode("111222333444");
    item4.setQuantity(1);

    store.put("111222333444", item4);

My put() calls don't work. Why can't I access my HashTable?

4

5 回答 5

2

您看到的与 Hashtable 无关。它是一种称为泛型的语言的特性。它允许您限制与您定义的对象一起使用的类型,而无需创建新的类。

一个典型的用法是

 Hashtable<Integer, Item> store = new Hashtable<Integer, Item>();

这确保了在使用您定义的类型的操作中,只有在类型匹配时才接受它。

所以,

 store.put(1, new Ítem());

会工作,但是

 store.put(2, new String("Hello world"));

会失败,因为String它不是Item.

如果你不使用泛型,vg old style Java

 Hashtable store = new Hashtable();

它会工作,但编译器不会检测到任何失败

 store.put(2, new String("Hello world"));

所以你失去(通常)有用的控制。

于 2013-04-16T21:17:22.370 回答
0

如果你想使用泛型,你可以这样做:

Hashtable<Key,Item> store = new Hashtable<Key, Item>();

如果您在不使用泛型的情况下围绕 a 进行包装类Hashtable,您将不得不自己进行Object转换Item。我看不出你为什么要这样做。

于 2013-04-16T21:19:32.123 回答
0

关于初始化中的大小:
确实,当您向其中添加项目时,集合(以及哈希表)会动态增加。
初始容量是将在内存中分配的项目数。如果你不给出这个数字,初始容量会得到一些默认值(我认为是 11)。随着 Hashtable 的增加,将需要分配更大的存储空间。重新分配需要一些 CPU 工作,并且会减慢程序的执行速度。因此,通过正确使用初始容量数,您可以节省一些不必要的 CPU 周期,但在今天的计算机上,除非您进行一些非常大的插入,否则我认为这并不重要。

于 2013-04-16T21:25:14.047 回答
0

第二个示例使用泛型,它允许您在编译时检查类型安全并减少强制转换的需要,通常被认为是更好的选择。至于 Hashtable 构造函数,在大多数情况下,您可以使用 no arg 构造函数来创建默认加载因子 0.75 和初始容量 11 的 Hashmap。加载因子指定何时将哈希表的所有元素复制到更大的数组。当元素数量超过负载因子 * 容量(内部数组大小)时会发生这种情况。其他构造函数允许您指定负载因子和初始容量。还有一个构造函数可以从现有 Map 构建哈希表。您应该考虑在非线程应用程序中使用 HashMap 而不是 Hashtable 以获得更好的性能。另外,从这行代码:

Hashtable<Object> store = new Hashtable<Object>();

我认为您打算使用 HashSet,因为您只存储值,而不是键值对。

于 2013-04-16T21:54:13.407 回答
-1

你想使用泛型:

public class Store implements Serializable{
  Hashtable<Key, Item> store = new Hashtable<Key,Item>();
}

这确保只有Item对象(以及正确的子类对象)可以放置在您的Hashtable.

Key可以是您用来引用您的项目的任何东西;它可能是Integer相反的,或者是一个String或其他一些对象。

这可以防止以下情况发生:

public class Item {
  public String blah;
  ...
  public void printThisString() {
    System.out.println(blah);
  }
  ...
}

...

Hashtable store = new Hashtable();
Item item = new Item();
item.blah = "Hello world!";
store.put("FirstKey",item);
store.put("SecondKey","Hello world!");
...
store.get("FirstKey").printThisString();//Works fine!
store.get("SecondKey").printThisString();//Fails because String does not have a printThisString method.

这迫使插入哈希表的人思考他们在做什么:

Hashtable<String, Item> store = new Hashtable<String,Item>();
Item item = new Item();
item.blah = "Hello world!";
store.put("MyKey",item);
store.put("SecondKey","Three tears for all the souls!");//Will not compile because a String isn't an Item
...
store.get("MyKey").printThisString();//We can therefore be sure what is returned is an Item

代码更新

要解决您的代码更新:

Store<String, Item> store = new Store<String, Item>();

Item item1 = new Item();
item1.setProductName("Paper Towel Roll");
item1.setBarCode("111222333444");
item1.setQuantity(1);

store.put("111222333444", item1);//note that since it's quoted the key is a String
于 2013-04-16T21:15:27.137 回答