这个问题是在一次面试中向我提出的。
我知道原语类型将被转换为包装类对象,以存储在任何数据结构中。
但是面试官问我,我不希望它是一个包装类对象,它应该以原始类型存储。
我们怎么能做到呢?
发布于 2014-12-16 10:11:55
使用Java的Collection API,您不能明智地这样做。当然,您可以自己实现List或Map接口,并决定存储原语而不是对象,但这无论如何都会让您头疼。Java的集合接口都是基于对象的(泛型甚至不起作用),所以不能有以int作为参数的add或remove方法。
假设您有自己的List<Integer>实现,它存储int而不是接口定义的Integer,您可以编写如下内容:
List<Integer> intList = new MyPrimitiveImplementation<>();
intList.add(42);现在,原语int 42被自动装箱到Integer对象,因为Collection接口将add方法定义为add(Integer e)。然后,您的实现可以做的是再次解除对Integer对象的装箱,以获得原语。
所以,这真的没有意义。您要么会遇到严重的性能问题(假设上面的自动装箱发生了几百万次),要么您就失去了与Collections的兼容性。两者都是不受欢迎的。
发布于 2014-12-16 09:50:44
您可以任意实现接口List、Set和Map。因此,编写List<Integer>的实现是完全可能的,例如,所有项都以原始int值的形式在内部存储。但是,如果您使用这些接口的最常见实现(ArrayList、HashSet和HashMap),所有的值都将在内部存储为Objects (包括Integer之类的装箱原语以及int[]之类的数组类型)。
发布于 2014-12-16 09:37:04
您可以将其放入基元类型的数组中。
对于int值,
List<int[]> list = new ArrayList<int[]>()然后把它和
list.add(new int[]{value});https://stackoverflow.com/questions/27501448
复制相似问题