将数组中的所有元素添加到列表中最简单的方法是什么?
e.g。
List<Byte> l = new ArrayList<Byte>();
//Want to add each element in below array to l
byte[] b = "something".getBytes("UTF-8");
是否有一些实用方法或其他方法可以做到这一点。我尝试使用addAll,但是想要将实际数组添加到集合中。
谢谢。
编辑:
为了澄清,我确实想用byte []来做这件事,因为我最终会将列表转换回byte []并将其提供给MessageDigest.update()。这有助于澄清吗?
编辑2:
所以看起来List<Byte>
很糟糕;很坏。如果我基本上添加字节数组(我正在制作一些SALTS和用户信息的哈希值)以提供给MessageDigest,那么建议采用什么数据结构?
答案 0 :(得分:6)
对于byte[]
,你遇到了麻烦。 Arrays.asList
无效,因为您有byte[]
而不是Byte[]
。
这是“原始与阶级”问题之一。你可以找到支持它的第三方集合库(例如Apache Commons Lang project),但我不相信有任何开箱即用的东西。或者,你总是可以自己编写代码:
List<Byte> l = new ArrayList<Byte>();
for (byte b : "something".getBytes("UTF-8"))
{
l.add(b);
}
请注意,对于字节序列,这是一种非常低效的存储格式。即使自动装箱将确保您不创建任何额外的Byte
对象,但每个元素仍然会有4或8个字节,因为它们将是引用。 List<Byte>
合适的情况非常罕见 - 你确定你需要吗?
如果你实际处理类,例如你有一个String[]
并且想要一个List<String>
,那么你可以使用Arrays.asList()
:
String[] array = ...;
List<String> list = Arrays.asList(array);
这将返回一个包含数组的只读列表 - 如果你想要一个 mutable 列表,你可以将该包装器传递给ArrayList
构造函数:
String[] array = ...;
List<String> list = new ArrayList<String>(Arrays.asList(array));
答案 1 :(得分:3)
除非你想在循环中一次添加一个元素,否则可以使用Apache commons'ArrayUtils将原始数组转换为Object数组,然后使用addAll()
:
byte[] b = "something".getBytes("UTF-8");
Byte[] bArray = ArrayUtils.toObject(b);
List<Byte> l = new ArrayList<Byte>();
l.addAll(bArray);