正确的方法来初始化HashMap并且HashMap可以保存不同的值类型吗?

Ton*_*ark 63 java standards hashmap

所以我HashMap在Java中有两个关于s的问题:

  1. 初始化一个正确的方法是HashMap什么?我认为在我的情况下使用可能是最好的:

    HashMap x = new HashMap();
    
    Run Code Online (Sandbox Code Playgroud)

    但Eclipse一直建议我使用:

    HashMap<something, something> map = new HashMap();
    
    Run Code Online (Sandbox Code Playgroud)

    哪个更好?

  2. 可以HashMap将不同类型的对象/数据类型保存为值吗?例如,这会工作并且没问题:

    map.put("one", 1);
    map.put("two", {1, 2});
    map.put("three", "hello");
    
    Run Code Online (Sandbox Code Playgroud)

    在第一个中put(),我想要int一个值作为值,在第二个中int[],第三个是字符串.用HashMaps 做Java可以吗?另外,可以将a HashMap作为值存储在一个HashMap

Yis*_*hai 102

这取决于您需要何种类型的安全性.这种非通用的方式最好如下:

 Map x = new HashMap();
Run Code Online (Sandbox Code Playgroud)

请注意,x键入为Map.这使得将来更改实现(更改为a TreeMap或a LinkedHashMap)变得更加容易.

您可以使用泛型来确保某种级别的类型安全:

Map<String, Object> x = new HashMap<String, Object>();
Run Code Online (Sandbox Code Playgroud)

在Java 7及更高版本中,您可以这样做

Map<String, Object> x = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

以上虽然更详细,但避免了编译器警告.在这种情况下的内容HashMap可以是任意Object,这样可以Integer,int[]等这是你在做什么.

如果您仍在使用Java 6,Guava Libraries(虽然它很容易自己完成)有一个方法newHashMap(),可以避免在执行时复制通用类型信息new.它从变量声明中推断出类型(这是Java 7之前的构造函数上不可用的Java特性).

顺便说一下,当你添加一个int或其他原语时,Java就会自动添加它.这意味着代码相当于:

 x.put("one", Integer.valueOf(1));
Run Code Online (Sandbox Code Playgroud)

你当然可以将一个HashMap值作为一个值放在另一个值中HashMap,但我认为如果你以递归方式执行它会有问题(这就是把它HashMap作为一个值本身).

  • 它们做同样的事情,只是你的引用被输入为Map(接口)而不是HashMap(实现),这样可以很容易地改变实现,而不会影响多行代码. (5认同)

MBC*_*ook 14

这是使用Java 1.5进行的更改.你首先列出的是旧的方式,第二种是新的方式.

通过使用HashMap,您可以执行以下操作:

HashMap<String, Doohickey> ourMap = new HashMap<String, Doohickey>();

....

Doohickey result = ourMap.get("bob");
Run Code Online (Sandbox Code Playgroud)

如果您在地图上没有类型,则必须执行以下操作:

Doohickey result = (Doohickey) ourMap.get("bob");
Run Code Online (Sandbox Code Playgroud)

这真的非常有用.它可以帮助您捕获错误并避免编写各种额外的演员表.这是我最喜欢的1.5(和更新)功能之一.

您仍然可以在地图中放置多个内容,只需将其指定为Map,然后您可以将任何对象放入(String,另一个Map和Integer,以及三个MyObjects,如果您愿意的话).

  • 直到最后一段,你还有我."带有'l'的列表"被称为数组; 它们绝对是Java中的对象. (2认同)