[英]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.