簡體   English   中英

我不了解ArrayList還是缺少什​​么?

[英]Am I not understanding ArrayList or am I missing something?

我正在嘗試創建一個非常非常簡單的程序。 我希望我的名為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();
    }

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

}

最初,arraylist為空,所以string.size()== 0將不執行公式,更改為

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

甚至更好

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

這樣,您可以添加使用不同構造函數創建的Text對象

如果將迭代修改為:

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內部對象的數量,而不是容量

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

    }
}

for循環的表達式的計算結果為true,因此您永遠不會向循環添加單個對象,這就是為什么如果在其中添加print語句,則迭代將打印-1的原因

問題這個方法。

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(不是大小)的空列表。 在這里看到

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”)。 來自docu“將元素添加到ArrayList后,其容量會自動增長。”

對於stater來說,Text中的方法需要參數,因此它知道要接受“ a”,並且如果您的參數中的變量也將為“ a”,則也需要使用“ this”。 這樣編譯器就知道兩者是不同的。

公共課文字{

private String a;

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

}

您做錯的是您正在創建容量為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的效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM