Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的动态数组声明_Java_Arrays - Fatal编程技术网

java中的动态数组声明

java中的动态数组声明,java,arrays,Java,Arrays,有人能告诉我这个java声明中的错误吗String[]t=newstring[15][15]这很好用,如果我使用String[]t=newstring[]因为我需要将变量t声明为动态变量,因为我不确定要在t中存储多少值。使用ArrayList(或其他可以处理任意数量对象的数组对象)。java数组总是有固定的长度,因为会为数组保留一些内存 ArrayList也创建这样的数组来存储对象。当然,添加更多的Abject作为数组的当前保留大小,而ArrayList将创建一个新的更大的数组(如果我正确的话,

有人能告诉我这个java声明中的错误吗
String[]t=newstring[15][15]这很好用,如果我使用
String[]t=newstring[]因为我需要将变量t声明为动态变量,因为我不确定要在t中存储多少值。

使用ArrayList(或其他可以处理任意数量对象的数组对象)。java数组总是有固定的长度,因为会为数组保留一些内存

ArrayList也创建这样的数组来存储对象。当然,添加更多的Abject作为数组的当前保留大小,而ArrayList将创建一个新的更大的数组(如果我正确的话,增加50%)。还有一些其他实现的行为稍有不同(例如,当阵列已满时,它们会创建一个与原始阵列100%相同的新阵列。如果性能对您来说真的很重要,您可以对此进行研究

ArrayList<ArrayList<String> t = new ArrayList<ArrayList<String>();

void fill() {
    ArrayList<String> t2 = new ArrayList<String>();
    t2.add("somestring");
    String s = "someotherstring";
    t2.add(s);
    t.add(t2);
}

ArrayList如果您不知道它需要多大,只需将其声明为

String[][] t;
一旦你知道它需要有多大,你就可以做(在尝试使用阵列之前)

如果您不确定数组需要有多大,则需要使用类似列表列表的内容

List<List<String>> t = new ArrayList<List<String>>;

public void add(String str, int row, int col) {
    while (row >= t.size())
        t.add(new ArrayList<String>());

    List<String> row_list = t.get(row);
    while (col >= row_list.size())
        row_list.add("");

    row_list.set(col, str);
}
List t=newarraylist;
公共void add(字符串str、int行、int列){
而(行>=t.size())
t、 添加(新的ArrayList());
List row\u List=t.get(row);
while(col>=row_list.size())
行列表。添加(“”);
行列表集合(列、列);
}

在Java中,数组对象的长度总是固定的。一旦分配了它们,就不能更改它们的大小。数组变量可以指向不同大小的不同数组对象。因此,您可以分配:

String[][] t;
它不会指向一个对象,并在您知道其大小后分配一个对象:

int n1,n2;
// calculate n1,n2
t = new String[n1][n2];

如果您需要一个可以更改大小的结构,最好使用ArrayList,它可以动态调整大小。

正如bemace所说,仅仅因为您要声明变量并不意味着您必须立即初始化它

正如Mark所说,数组有一个固定的大小。一旦数组被初始化(未声明,初始化),它就有一个固定的大小

因此,有两种可能性:

或者,在开始使用之前,您将知道阵列需要有多大,在这种情况下,您可以按照bemace的建议简单地延迟初始化

或者,在开始使用它之前,您不知道它需要有多大,在这种情况下,您需要使用动态大小的数据结构。请查看Java Collections API:


将其声明为
字符串[][]t=null;

一旦你得到它,实际长度重新初始化它

t=new String[x][y];

已经有好几个很好的答案,但现在在一篇评论中透露,这个问题的目的是raju需要一把多值映射的钥匙

Mark在评论之后建议raju使用一个
HashMap HashMap=new HashMap();
——但是这只适用于单个键值对

raju需要的是一个

Map<String, Collection<String>> t
    = new HashMap<String, List<String>>();
Map t
=新HashMap();
为键添加第一个值需要初始化该bucket的列表,而添加其他值需要获取现有列表并添加新值

注意:我在声明中使用了
Collection
,因此如果值的顺序很重要,它可以是一个列表,也可以是一个集合,以防止在同一个键下重复值

这可能最好作为类本身来实现

public class MultiValueMap<K, V> extends Map<K, V>
{
    ...
}
公共类多值映射扩展了映射
{
...
}

因此,在第一次
put(key,value)
和随后的
.add(value)
列表中的列表初始化可以隐藏在实现中。

Java数组总是有固定长度,而不是最大长度。一些条目可能为null。虽然这是可能的,但您需要创建一个ArrayList of(ArrayList of String),并且
s=t[3][12];
变成
s=t.get(3).get(12);
我可以在数组列表中添加多维吗???我有一个键和一个值,我将键和值存储在数组[0][0]中,[0][1]中的值,就像一个键有很多值一样…如果你有一个键和一个值,你可以使用HashMap,
HashMap HashMap=newhashmap();
如果你打算使用数组作为键/值对,那么拜仁上面的答案在我看来效果最好。如果我使用
String[]]t=null;
我在线程“main”java.lang.NullPointerException中遇到一个错误,在使用它时出现异常
t[0][0]=“ana code>@raju:你仍然需要做
t=newstring[sizeX][sizeY]
在您发现维度需要是什么之后,但在您的
t[0][0]=
赋值之前。实现实际用例的最佳方法。
public class MultiValueMap<K, V> extends Map<K, V>
{
    ...
}