1. 程式人生 > >JAVA——自定義類物件的一維陣列二維陣列的定義以及賦值的注意事項

JAVA——自定義類物件的一維陣列二維陣列的定義以及賦值的注意事項

今天用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容器內所有的元素全都改變,所以每次都要申請新的記憶體空間。