我想创建一个byte[]
的数组。
当我尝试:
byte[] data = new byte[10];
这是byte
的数组,而不是byte[]
的数组。
感谢
答案 0 :(得分:4)
在Java中,每个元素本身就是一个数组的数组实际上只是一个2D数组,尽管Java并不要求每一行都有相同数量的元素。
在这种特殊情况下,你有一个List<byte[]>
并希望将其变成一个数组,其中数组的每个元素本身都是byte
数组,你可以使用:
int rows = myList.size();
byte[][] myArray = new byte[rows][];
int i = 0;
for (byte[] col : myList) {
myArray[i++] = col;
}
或者,更简洁,但不太明显:
byte[][] myArray = myList.toArray(new byte[0][]);
在使用中看起来像:
List<byte[]> myList = new ArrayList<>();
myList.add(new byte[]{1,2,3,4});
myList.add(new byte[]{5,6,7});
myList.add(new byte[]{8,9});
byte[][] myArray = myList.toArray(new byte[0][]);
for (byte[] b : myArray) {
for (byte c : b) {
System.out.println(c);
}
System.out.println();
}
请注意,在上述两种情况下,数组的元素与完全与列表中存储的数组完全相同,而不是副本。因此,如果您修改列表中的一个原始byte[]
元素,它也会更改通过该阵列可访问的版本。
答案 1 :(得分:4)
解决一些关于“数组数组”和2D数组的混淆:
Java实际上没有2D数组。至少,不像许多人想到的那样,它们看起来像一个矩阵,并且每行中都有行和列以及相同数量的元素。
你可以使用“数组数组”作为2D数组。如果你想要一个5 x 8整数的数组,你可以说
int[][] arr = new int[5][8];
但Java并没有强制执行数组的“矩阵”或“2D-ness”。它给你的是一个包含5个引用的数组,每个引用引用另一个整数数组。每个引用都从引用8个整数的数组开始,但这不是强制执行的;你可以稍后说
arr[2] = new int[113];
或
arr[2] = null;
现在你的数组不再是一个2D数组(正如我们通常所想的那样),但Java不会阻止你这样做。
所以,虽然你经常会看到像
这样的东西byte[][]
在教科书中用于创建2D数组,它与数组数组的语法相同,而Java实际上将其视为数组数组,并非所有数组都必须具有相同的大小。
如果你想创建一个数组,其元素最终将是数组,但现在是null
,你可以这样做:
byte[][] bytesArray = new byte[10][];
将bytesArray
设置为10个null
引用的数组,其中任何一个都可以在以后设置:
bytesArray[4] = new byte[17];
如果你想要一个长度不一样的“不规则阵列”数组,这将是开始的方式。
答案 2 :(得分:2)
试试这个:
byte [] [] arrays = new byte [5] [10];
答案 3 :(得分:1)
你的意思是这样吗?
byte[][] data = new byte[][]{byteArray1, byteArray2, byteArray3};
答案 4 :(得分:1)
在您的示例中,您正在创建一个字节数组,如果您想创建一个字节数组数组,则必须创建一个二维字节数组:
byte[][] bytesArray = new byte[10][10];
然后您可以按如下方式访问您的字节数组:
bytesArray[0]; // returns a byte[]