我只是有一个想法来测试一些东西并且它有效:
String[][] arr = new String[4][4];
arr[2] = new String[5];
for(int i = 0; i < arr.length; i++)
{
System.out.println(arr[i].length);
}
输出显然是:
4
4
5
4
所以我的问题是:
答案 0 :(得分:20)
- 编码风格是好还是坏?
与任何事情一样,这取决于具体情况。在某些情况下,锯齿状数组(因为它们被称为)实际上是合适的。
- 这有什么用呢?
好吧,用于在一个数组中存储不同长度的数据集。例如,如果我们有字符串"hello"
和"goodbye"
,我们可能希望将它们的字符数组存储在一个结构中。这些char数组具有不同的长度,因此我们将使用锯齿状数组。
- 最重要的是,有没有办法在声明本身中创建这样的构造?
是:
char[][] x = {{'h','e','l','l','o'},
{'g','o','o','d','b','y','e'}};
- 另外......为什么甚至可以这样做?
因为Java语言规范允许§10.6。
答案 1 :(得分:11)
这是一种很好的编码风格,它没有任何问题。我过去曾为自己的不同问题创建了锯齿状阵列。
这很好,因为您可能需要以这种方式存储数据。以这种方式存储的数据将允许您节省内存。在某些情况下,这是一种更有效地映射项目的自然方式。
在单行中,没有显式填充数组?不,这是我能想到的最接近的事情。
int[][] test = new int[10][];
test[0] = new int[100];
test[1] = new int[500];
这将允许您使用不同长度的数组填充行。我更喜欢这种方法来填充像这样的值:
int[][] test = new int[][]{{1,2,3},{4},{5,6,7}};
因为在处理大型不规则数组时输入更具可读性和实用性。
答案 2 :(得分:1)
(1)虽然在技术上/功能上/语法上没有任何错误,但我会说这是错误的编码风格,因为它打破了对象初始化提供的假设(String [4] [4])。这最终取决于用户的偏好;如果你是唯一阅读它的人,而且你确切知道你在做什么,那就没关系。如果其他人共享/使用您的代码,则会增加混淆。
(2)我能想到的唯一概念是你有多个数组要读入,但事先并不知道它们的大小。但是,在这种情况下使用ArrayList<String>
会更有意义,除非增加的开销是一个严重的问题。
(3)我不确定你在这里问的是什么。你的意思是,你能以某种方式在初始声明中指定单个数组长度吗?答案是否定的。
(4)可以扩展和缩小原始数组长度,因为在幕后,你只需要分配和释放内存块。