2014-01-21 447 views
0

這是一個相當簡單的問題,但我是一個初學者,現在我已經停留了幾個小時。我不是在尋找一個簡單的方法,而是我只想了解我的代碼發生了什麼,以及它爲什麼不起作用。我的問題是:自定義對象的Arraylist

用隨機數和當前時間創建一個節點類。 創建一個存儲類並將這些節點存儲在一個列表/數組中。 使用主類創建50個節點並顯示。

當我運行它50次並獲取我的列表時,我將列表打印出來,以便檢查我的代碼是否正在運行,並且它們都有相同的時間。這意味着不同的節點不會被存儲到我的列表中,而是每次循環運行時被清除。這是爲什麼?

我的代碼附:

主營:

public class NodeSort { 

public static void main(String[] args) 
{ 
    int c = 0; 
    while (c < 50) 
    { 
     Storage.add(); 
     c++; 
    } 


} 

} 

節點:

public class Node 
{ 
public static int num; 
public static long time; 

public Node() 
{ 
    num = Random.getNum(); 
    time = System.nanoTime(); 
} 

public static long getTime() 
{ 
    return time; 
} 

public static int getNum() 
{ 
    return num; 
} 
} 

存儲:

public class Storage 
{ 
public static ArrayList<Node> list = new ArrayList<>(); 

public static void add() 
{ 

    list.add(new Node()); 

} 

當我得到的時間X = 1 50,它同時打印出來50次而不是50次。

+0

顯示打印代碼。 –

+0

由於運行速度非常快,您可能會生成相同的隨機數。 –

+0

您能否詳細說明您的輸出?我不確定我是否清楚。你到底在哪裏打印輸出到列表?另外,你爲什麼使用'nanoTime()'? –

回答

4

它們都具有相同的time值,因爲它們幾乎都是在同一時間創建的。 System.nanoTime()並不能保證你實際上可以達到納秒級的精確度,這取決於操作系統辨別時間的能力。大多數操作系統只能提供毫秒級的分辨率。所以如果所有的調用都在同一毫秒內發生,你會得到相同的值。

就隨機數而言,我不知道 - 什麼是Random類?這不是java.util.Random

編輯:哦,等等,我明白了。您在Node課程中將numtime標爲static。這意味着只有一個存在的副本。從這些聲明中刪除static,並從返回值的方法中刪除。

+0

我知道第一點是不正確的,因爲如果我在循環仍在運行時將它們打印出來,我得到50個不同的數字。只有當我從列表中訪問他們時,他們都是一樣的。第二點可能是原因。至於隨機,這是我做的一個類,但我沒有包含代碼。我會試着看看靜態是否是探測器。謝謝! – MehtabC

+0

嘿,你的第二個提示修正了它。非常感謝答案!我仍然對靜態是什麼以及它如何不同/爲什麼不能從非靜態類中調用感到困惑。任何閱讀你可以指出我的進一步信息? – MehtabC

+0

@MehtabC - 「static」將字段或方法標記爲屬於該類的整體,而不是每個單獨的實例。想象一個類似餅乾的類聲明,並且每次調用'new MyClass()'時,都會使用cookie切割器來標記新的cookie。「靜態」意味着該字段/方法屬於Cookie工具,而不是每個單獨的Cookie。它們通常用於常量,以及不依賴於任何特定實例的實用程序/輔助函數。 – MattPutnam

相關問題