Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用哈希表的更好方法?JAVA_Java_Hash - Fatal编程技术网

使用哈希表的更好方法?JAVA

使用哈希表的更好方法?JAVA,java,hash,Java,Hash,我有一个名为Stored的类,它将保存我的哈希表,它将保存类“Item”中的对象。我以前从未使用过哈希表,或者对哈希表非常了解,但从我的观察来看,似乎有很多不同的方法可以使用它们。所以我的问题是,哪一个是最好的?为什么 代码已更新 我的程序中有这个 public class Store implements Serializable{ Hashtable<String, Item> store = new Hashtable<String, Item>(); } 我

我有一个名为Stored的类,它将保存我的哈希表,它将保存类“Item”中的对象。我以前从未使用过哈希表,或者对哈希表非常了解,但从我的观察来看,似乎有很多不同的方法可以使用它们。所以我的问题是,哪一个是最好的?为什么

代码已更新

我的程序中有这个

public class Store implements Serializable{

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

}

我的put()调用不起作用。为什么我不能访问我的哈希表?

您想使用泛型:

public class Store implements Serializable{
  Hashtable<Key, Item> store = new Hashtable<Key,Item>();
}
这迫使插入哈希表的人思考他们在做什么:

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
Hashtable store=newhashtable();
项目=新项目();
item.blah=“你好,世界!”;
存储。放置(“MyKey”,项目);
储存。放(“第二把钥匙”,“为所有灵魂三滴眼泪!”)//无法编译,因为字符串不是项
...
store.get(“MyKey”).printThisString()//因此,我们可以确定返回的是一个项目
代码更新

要解决代码更新问题,请执行以下操作:

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
Store Store=new Store();
Item item1=新项();
项目1.setProductName(“纸巾卷”);
项目1.立根代码(“11122233444”);
项目1.设置数量(1);
储存。投入(“11122233444”,第1项)//请注意,由于该键被引用,因此它是一个字符串

您看到的内容与哈希表无关。它是名为泛型的语言的一个特性。它允许您限制要与定义的对象一起使用的类型,而无需创建新类

一个典型的用法是

 Hashtable<Integer, Item> store = new Hashtable<Integer, Item>();
会有用的,但是

 store.put(2, new String("Hello world"));
将失败,因为
字符串
不是
的子类

如果不使用泛型,请使用v.g.旧式Java

 Hashtable store = new Hashtable();
它可以工作,但编译器不会检测到任何故障

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

因此,您会丢失(通常)有用的控件。

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

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

如果您在
哈希表
周围使用包装类而不使用泛型,那么您必须自己从
对象
转换到
。我看你没有理由那样做

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

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

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

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

第二个是泛型,是的,它更好。虽然Hashtable上的通用定义需要键类型和值类型:
Hashtable
“Best”是一个高度上下文敏感的术语。相关:。当然,这里的很多人会告诉你永远不要使用Hashtable,始终使用HashMap或其他一些Map类。但其原因有些深奥。请注意,如果您的哈希表(或HashMap)完全包含在一个包装类中,并且只有通过该包装类的方法才能访问,那么“泛型”内容基本上对您没有任何帮助,而您还没有这样做。它将在编译时失败,因此,您可以在运行代码之前捕获错误……是的,正如Lucas所说,所有这些都是在编译时完成的。在运行时,它不会检查泛型,因为如果不破坏向后兼容性,就无法引入它。@SJuan76-实际上,它可能在不破坏兼容性的情况下完成(我不希望看到这一点),但内部Java政治阻碍了它。大量容易向上兼容的更改被忽略,而一些不兼容的更改被实现。(我有时觉得那是佩顿的地方。)我无法访问main的哈希表,我试图调用put(),但它说我需要创建方法。你是说如果使用泛型?它说您需要创建哪种方法?查看我的更新,看看它是否有效。是的,看看你有什么,这是有效的,但是如果哈希表在我的主目录中,Store类的意义是什么?为Store类提供的描述中说明了它“。使用哈希表将有关存储中项的名称信息存储在哈希表中,以便于查找。”它还将具有,add,remove,所以,泛型使这些东西普遍过时:这就是泛型的意义所在。它减少了您需要编写的代码量。
 Hashtable store = new Hashtable();
 store.put(2, new String("Hello world"));
Hashtable<Key,Item> store = new Hashtable<Key, Item>();
Hashtable<Object> store = new Hashtable<Object>();