Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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中将参数化ArrayList传递给函数_Java_Arraylist - Fatal编程技术网

在java中将参数化ArrayList传递给函数

在java中将参数化ArrayList传递给函数,java,arraylist,Java,Arraylist,我有以下功能 func(ArrayList `<String>`[] name) { ........ } 我在第3行获得NullPointerException。这是因为第1行,即我没有参数化吗?如果是,是否有其他方法可以做到这一点?因为java不允许创建参数化的ArrayList的通用数组,这显然不是您真正的代码,但您正在创建ArrayList数组,这可能不是您想要的。你可以这样做: ArrayList<String> name = new ArrayList(

我有以下功能

func(ArrayList `<String>`[] name) { ........ }  

我在
第3行获得
NullPointerException
。这是因为
第1行
,即我没有参数化吗?如果是,是否有其他方法可以做到这一点?因为java不允许创建参数化的
ArrayList的通用数组,这显然不是您真正的代码,但您正在创建ArrayList数组,这可能不是您想要的。你可以这样做:

ArrayList<String> name = new ArrayList(num);
func(name);
System.out.println(name.get(0));
ArrayList name=新的ArrayList(num);
func(姓名);
System.out.println(name.get(0));
请注意,创建ArrayList时,只指定初始容量,而不指定大小(初始项的数量)。它的初始大小为0。您的func只需调用add即可添加项目。

更好(无键入错误):

ArrayList name=new ArrayList();
我建议不要为初始容量参数(num)而烦恼——只需将其留空,它就会完美地工作。但是请务必处理构造函数中字符串的泛型类型,否则编译器会抱怨


如果您想知道如何使用ArrayList(例如,为什么要使用get()函数),您应该查看。

对于Java中的数组,创建它时所有元素都是0、false或null,具体取决于它们的类型

因此:

final List[]foo;
foo=newarraylist[10];
foo[0]。添加(“你好”);//崩溃
它崩溃是因为
foo=newarraylist[10]
分配足够的空间容纳10
ArrayList
,但它将所有值设置为null。因此,您需要另外一个步骤:

for(int i = 0; i < foo.length; i++)
{
    foo[i] = new ArrayList<String>();
}
for(int i=0;i
我还没有编译代码,但非常确定它是正确的。您可以在程序的第1步和第2步之间执行此操作

我猜是因为你的代码不太准确(它不会像我所说的那样生成空指针)

编辑:


您可以在方法中执行新操作,而带有赋值的for循环可以在方法中执行。我更喜欢在同一个位置分配和初始化(不那么混乱),但如果需要,可以将其拆分。

您遇到的问题是因为在Java中,方法的参数是按值传递的。这意味着,每个参数都被有效地“复制”到方法中,这意味着对参数所做的任何赋值都只在方法中可见,调用方看不到

根据您的示例,您正在传递一个对
列表
数组的空引用。然后将此引用“复制”到
func()
方法中,然后当func为该变量赋值时,更新的只是局部变量,而不是调用代码持有的引用

下面是一些可编译代码(基于您的示例),演示了该问题:

public class Main {

    public static void main(String[] args) {
        List<String>[] array = null;
        fill(array);
        System.out.println("In main(): " + array[0].get(0));
    }

    public static void fill(List<String>[] array) {
        array = (List<String>[])new List[10];
        array[0] = new ArrayList<String>();
        array[0].add("test");
        System.out.println("In fill(): " + array[0].get(0));
    }

}
您可能想知道为什么会这样,因为您仍然在为数组的元素分配
ArrayList
,但是这些对象在调用方法之外是可见的。原因是,尽管fill方法正在获取对数组的引用的“副本”,但引用本身仍在引用同一个数组对象。这意味着您可以修改数组对象的内部状态,调用者将看到您所做的任何更改,因为它引用了相同的对象

以下是第二种方法:

public class Main {

    public static void main(String[] args) {
        List<String>[] array = (List<String>[])new List[10];
        fill(array);
        System.out.println("In main(): " + array[0].get(0));
    }

    public static void fill(List<String>[] array) {
        array[0] = new ArrayList<String>();
        array[0].add("test");
        System.out.println("In fill(): " + array[0].get(0));
    }

}
public class Main {

    public static void main(String[] args) {
        List<String>[] array = fill();
        System.out.println("In main(): " + array[0].get(0));
    }

    public static List<String>[] fill() {
        List<String>[] array = (List<String>[])new List[10];
        array[0] = new ArrayList<String>();
        array[0].add("test");
        System.out.println("In fill(): " + array[0].get(0));
        return array;
    }

}
公共类主{
公共静态void main(字符串[]args){
List[]数组=fill();
System.out.println(“In main():”+array[0].get(0));
}
公共静态列表[]填充(){
列表[]数组=(列表[])新列表[10];
数组[0]=新的ArrayList();
数组[0]。添加(“测试”);
System.out.println(“In fill():”+数组[0].get(0));
返回数组;
}
}
(顺便说一句,您通常应该避免创建泛型集合的数组,更好的方法是使用列表来存储列表本身。例如:

List<List<String>> list = new ArrayList<List<String>>();
list.add(new ArrayList<String>());
list.get(0).add("test");
List List=new ArrayList();
添加(新的ArrayList());
list.get(0).添加(“测试”);

新建ArrayList[10]
给我不兼容的类型。但是,
新建ArrayList[10]
对我很有用。

他为什么不提供初始容量?这将提高性能,特别是在大型列表上。我同意它可以提高性能。但我从初始问题评估,简单性和正确性对提出原始问题的人来说可能比性能更重要。我与更正了我的问题。我实际上想创建一个ArrayList数组。foo[I]=new ArrayList[…]正在函数func内完成。我不明白的是,在函数func返回之前,我可以访问元素。例如,name[0]不是null。但当我访问name[0]时在调用者函数中,它是空的。还需要尝试的一件事是将方法的参数标记为final(如void foo(final List[]bar),以确保您没有意外地重新分配它,而只是修改内容。不,该代码不正确。您不能创建泛型类型的数组,即
new ArrayList[10]
将不起作用。
新建ArrayList[10]
新建ArrayList[10]
会起作用。如果大多数情况都不完美,我会将其标记为-1,表示“方法的参数是按值传递的。”.Java不按值传递,这与您所说的不完全一样,但很容易用这种方式解释。Java按值传递引用。如果按值传递,则代码示例将无法工作。只有原语是按值传递的。
public class Main {

    public static void main(String[] args) {
        List<String>[] array = (List<String>[])new List[10];
        fill(array);
        System.out.println("In main(): " + array[0].get(0));
    }

    public static void fill(List<String>[] array) {
        array[0] = new ArrayList<String>();
        array[0].add("test");
        System.out.println("In fill(): " + array[0].get(0));
    }

}
public class Main {

    public static void main(String[] args) {
        List<String>[] array = fill();
        System.out.println("In main(): " + array[0].get(0));
    }

    public static List<String>[] fill() {
        List<String>[] array = (List<String>[])new List[10];
        array[0] = new ArrayList<String>();
        array[0].add("test");
        System.out.println("In fill(): " + array[0].get(0));
        return array;
    }

}
List<List<String>> list = new ArrayList<List<String>>();
list.add(new ArrayList<String>());
list.get(0).add("test");