【问题标题】:Java Mappings and PrimitivesJava 映射和原语
【发布时间】:2011-05-22 22:16:37
【问题描述】:

我想创建一个以 String 作为键和 primitive 作为值的映射。我正在查看 Java 文档,并没有看到 Primitive 是一种类类型,或者它们共享某种包装类。

如何将值限制为原始值?

Map<String, Primitive> map = new HashMap<String, Primitive>();

【问题讨论】:

  • 不清楚是我的错。我所说的我想将值限制为原始类型我的意思是我希望允许将任何原始类型用作该特定映射中的值。

标签: java dictionary primitive word-wrap


【解决方案1】:

Java Autoboxing 允许在Long, Integer, Double 上创建映射,然后使用原始值对其进行操作。例如:

java.util.HashMap<String, Integer> map = new java.util.HashMap<String, Integer>();
map.put("one", 1); // 1 is an integer, not an instance of Integer

如果您想在一个映射中存储不同的原始类型,您可以通过创建Map&lt;String, Number&gt; 来实现。允许存储BigDecimalBigIntegerByteDoubleFloatIntegerLongShort(和AtomicLongAtomicInteger)的值。

这是一个例子:

Map<String, Number> map = new HashMap<String, Number>();

map.put("one", 1);
map.put("two", 2.0);
map.put("three", 1L);

for(String k:map.keySet()) {
  Number v = map.get(k);
  System.err.println(v + " is instance of " + v.getClass().getName() + ": " + v);
}

【讨论】:

  • 泛型有没有办法指定 or 子句?比如说
  • @Doodle 你应该创建一个基类Vehicle 并在Boat, Car 中扩展它,然后创建&lt;String, Vehicle&gt;
  • 是的,提取超类型 Vehicle 并将其设为 Map 或 Map(泛型语法总是让我感到困惑)
  • 我正在考虑将字符串作为一个可以用于传递的值
  • 有一个数字和字符串的超类型。它叫做对象!
【解决方案2】:

Google 搜索“Java Primitive Maps”,您会发现一些不需要自动装箱的特殊类型。一个例子是:https://labs.carrotsearch.com/hppc.html

但是,一般来说,您应该按照其他答案中提到的那样使用自动装箱。

【讨论】:

  • 向我展示了 Fast util 这对我可能有用的东西,谢谢。
  • 链接已失效。
  • 我已经用最新的链接替换了死链接
【解决方案3】:

您可以执行以下操作:

Map<String, Integer> map = new HashMap<String, Integer>()

然后进行如下操作:

map.put("One", 1);

会起作用。原语1 将自动装箱成Integer。同样:

int i = map.get("One");

也可以,因为Integer 会自动拆箱成int

查看autoboxing and autounboxing 上的一些文档。

【讨论】:

    【解决方案4】:

    每个原语都有一个包装类,例如 java.lang.Long 对应于 long

    因此,您可以将包装类映射到 String,如果您使用 Java 1.5+,只需将原语放到映射中:

     Map<String, Integer> map = new HashMap<String, Integer>();
     map.put("key", 10);
     int value = map.get("key");  // value is 10.
    

    【讨论】:

      【解决方案5】:

      你会使用他们的盒装对应物。

      Map<String,Integer> map = new HashMap<String,Integer>();
      

      Integer 是原始 int 的不可变盒装类型。有类似的 Short、Long、Double、Float 和 Byte 盒装类型。

      【讨论】:

        【解决方案6】:

        如果出于性能原因需要将值作为原始值,可以使用TObjectIntHashMap 或类似名称。

        例如

        TObjectIntHashMap<String> map = new TObjectIntHashMap();
        
        map.put("key", 10);
        int value = map.get("key");
        

        与 Map 的一个区别是值是 int 原始类型而不是 Integer 对象。

        【讨论】:

          【解决方案7】:

          您不能在Map 接口中将原语作为键或值。相反,您可以使用 Wrapper 类,例如 IntegerCharacterBoolean 等。

          阅读更多关于wiki

          【讨论】:

          • 如果使用 java 1.5 及更高版本,自动装箱应该注意这一点,因此您不需要手动包装原语
          猜你喜欢
          • 1970-01-01
          • 2013-03-19
          • 1970-01-01
          • 2019-03-28
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          • 2018-06-18
          • 1970-01-01
          相关资源
          最近更新 更多