JAVA——自定義類物件的一維陣列二維陣列的定義以及賦值的注意事項
阿新 • • 發佈:2018-11-21
今天用JAVA模擬了一次保皇問題,真的是被噁心到了,但同時發現了自己對於自定義類物件的陣列,又忘了,在這裡進行總結複習一下。再次膜拜CSDN大佬寫的部落格,幫助大的一批。ORZ;
一、自定義類物件一維陣列
在整理之前,先貼出一段程式碼:
package ceshi; import java.util.*; import java.math.*; class node { public int num; public int kids; public node() { num=kids=0; } public node(int num, int kids) { this.num = num; this.kids = kids; } } public class Main { public static void main(String[] args) { node[] t=new node[100]; for(int i=0;i<10;i++) { t[i]=new node(i,i); } } }
看到這段程式碼,很多人可能都會注意到一個問題,每次對t【i】進行賦值時,都需要申請新的動態記憶體。這確實是我們需要注意的一點,
但是還有一個小問題,這時候如果我們輸出t.length時會輸出什麼呢? 要不是10,要不是100.在程式碼中直接輸出之後發現輸出的值為100,
這說明,在預設的陣列長度裡,真正起作用的是我們究竟給陣列申請了多少記憶體空間,而非我們實際上給元素申請的空間。
這就會造成很多的錯誤,比如說用ARRAYS.SORT進行排序時,如果不限制排序範圍,就會發生空指標呼叫的錯誤。
二、自定義類物件的二維陣列
還是先給出一段程式碼
package ceshi; import java.util.*; import java.math.*; class node { public int num; public int kids; public node() { num=kids=0; } public node(int num, int kids) { this.num = num; this.kids = kids; } } public class Main { public static void main(String[] args) { node[][] t=new node[100][]; for(int i=0;i<10;i++) { t[i]=new node[100]; for(int j=0;j<10;j++) { t[i][j]=new node(i*j,i*j); } } System.out.println(t.length); } }
其實二維陣列一維陣列的差別並不大,就是一維陣列的元素仍然是一維陣列,所有就多了一個t[i]=new node[100],其餘的對比著兩個程式碼看看即可。
三、關於容器的一丟丟的注意事項
當我們向容器類中加入元素使嚴禁這種寫法(PS:當時自己都不知道自己是怎麼死的)
package ceshi; import java.util.*; import java.math.*; class node { public int num; public int kids; public node() { num=kids=0; } public node(int num, int kids) { this.num = num; this.kids = kids; } } public class Main { public static void main(String[] args) { List<node> list=new ArrayList<node>(); node t=new node(); for(int i=0;i<10;i++) { t.kids=i; list.add(t); } } }
大家可能都發現了這個問題,就是我容器內所有的元素用的都是一塊記憶體空間,每當我的t改變的時候,list容器內所有的元素全都改變,所以每次都要申請新的記憶體空間。