如何将原始类型存储在Hashmap中或列为值而不是包装类对象

Mal*_*tty 3 java core

我在接受采访时问了这个问题.

我知道原始类型将被转换为包装类对象以存储在任何数据结构中.

但是面试官问我,我不希望它成为一个包装类对象,它应该存储为原始类型.

我们怎么做?

Flo*_*Flo 6

使用Java的Collection API,您无法以合理的方式执行此操作.当然你可以自己实现ListMap接口并决定存储基元而不是对象,但这会让你头疼.Java的集合接口都是基于对象(泛型甚至不发挥一个角色),所以你不能有一个addremove接受一个int作为参数的方法.

假设您有自己的List<Integer>存储实现int而不是Integer接口定义,您可以编写如下内容:

List<Integer> intList = new MyPrimitiveImplementation<>();
intList.add(42);
Run Code Online (Sandbox Code Playgroud)

现在发生的是原始int 42被自动装箱到一个Integer对象,因为Collection接口将add方法定义为add(Integer e).然后,您的实现可能会Integer再次取消装箱对象,以便恢复原语.

所以,真的没有意义.您要么遇到严重的性能问题(想象上面的自动装箱发生了几百万次),或者您失去了与Collections API的兼容性.两者都不可取.

  • 有一点是这样的.您可以编写其他方法,例如`addInt(int a)`和`int getInt(int index)`方法,它们在存储时直接处理`int`s,并且根本不涉及任何装箱或拆箱.这样你就可以以非常有效的方式使用`List`,并且在你真正需要时也可以获得`List <Integer>`接口的好处.我的观点是他们应该用android的'SparseArray`做类似的事情,但似乎很少有人同意我的看法. (2认同)