我不理解ArrayList或者我错过了什么?

时间:2013-07-23 19:51:03

标签: java list arraylist

我正在尝试创建一个非常非常简单的程序。 我希望我的班级Text能够简单地打印出一个字符串,特别是一个字母。 然后在我的第二个名为Window的类中,我想创建该类的ArrayList,遍历列表并调用我的Text类的方法来打印出该字符串。但它没有打印任何东西。

我做错了什么?

public class Text {

    private String a;

    public void printA() {
        a = "a";
        System.out.print(a);
    }

}

和另一个班..

import java.util.ArrayList;

public class Window {

    private ArrayList<Text> string = new ArrayList<Text>(5);

    public Window() {
        addText();
    }

    public void iterate() {
        for (int i = 0; i < string.size() - 1; i++) {
            string.get(i).printA();
        }
    }

    public void addText() {
        for (int i = 0; i <string.size() - 1; i++) {
            string.add(new Text());
        }
    }

    public static void main(String[] args) {
        Window wind = new Window();
        wind.iterate();
    }

}

6 个答案:

答案 0 :(得分:2)

for(int i = 0; i <string.size()-1;i++){
    string.add(new Text());

}

最初arraylist是空的,所以string.size()== 0 forlus将不被执行,改为

public void addText(){
     string.add(new Text())
}

甚至更好

public void addText(Text t){
     string.add(t)
}

通过这种方式,您可以添加使用不同构造函数创建的Text对象

答案 1 :(得分:0)

如果将iterate修改为:

public void iterate(){
    System.out.println(string.size()-1);
    for(int i = 0; i < string.size()-1;i++){
        string.get(i).printA();

    }
}

你会得到-1

让我解释原因:

每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。 private ArrayList<Text>string = new ArrayList<Text>(5);仅设置底层数组的容量,该数组是实现ArrayList对象的数据结构。 size()返回ArrayList内的对象数而不是capcity

public void addText(){
    for(int i = 0; i <string.size()-1;i++){
        string.add(new Text());

    }
}

for循环的表达式不计算为true,因此你永远不会在循环中添加单个对象,这就是为什么如果在那里添加print语句,iterate将打印-1

答案 2 :(得分:0)

问题这个方法。

public void addText(){
        for(int i = 0; i <string.size()-1;i++){
            string.add(new Text());

        }
    }

这根本不会添加任何东西。因为string.size()是0。

可能应该将其更改为

public void addText(int size){
    for(int i = 0; i <size-1;i++){
        string.add(new Text());

    }
}

Ps: new Arraylist<Text>(5)实际上会创建一个空列表,其初始容量 = 5(不是大小)。见here

答案 3 :(得分:0)

new ArrayList<Text>(5); 

并不意味着您有5个元素数组。这意味着这只是用于存储元素的内部数组的初始容量。由于这个你的初始代码:

public void addText(){
    for(int i = 0; i <string.size()-1;i++){
        string.add(new Text());

    }
}

string.size() = 0。

的列表中不会出现任何元素

改为使用它(如果你想添加5个元素):

public void addText(){
    for(int i = 0; i < 5;i++){
        string.add(new Text());

    }
}

添加更多元素没有问题(即使初始容量仅为'5')。从文档“随着元素被添加到ArrayList,它的容量会自动增长。”

答案 4 :(得分:0)

好吧,你需要在Text需要参数中使用你的方法,所以它知道接受'a',如果你的参数中的变量是'a',你需要使用“this”。这样编译器就知道两者是不同的。

公共类文本{

private String a;

public void printA(String a) {
    this.a = "a";
    System.out.print(a);
}

}

答案 5 :(得分:-2)

你做错了是你正在创建容量为5的ArrayList,但它还没有5个对象。因此,addText方法什么都不做。这是一个有效的版本:

public void addText(){
    for(int i = 0; i < 4; i++){
        string.add(new Text()); 
    }
}

请注意,string.size() - 1已更改为4,因为string.size()为0,并且您希望向列表中添加4个元素。此外,您的iterate方法可能会使用一些重构:

public void iterate(){
    for(Text text : string){
        string.get(i).printA();
    }
}

而不是简单的循环,而是使用增强的for。这只不过是一个打字快捷方式,但它提高了LinkedList的效率。