溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

發(fā)布時間:2020-10-23 04:30:15 來源:腳本之家 閱讀:129 作者:愛吾所愛(超超) 欄目:編程語言

本文實例講述了Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組。分享給大家供大家參考,具體如下:

數(shù)組的定義于使用

1:數(shù)組的基本概念

一組相關(guān)變量的集合;在Java里面將數(shù)組定義為引用數(shù)據(jù)類型,所以數(shù)組的使用一定要牽扯到內(nèi)存分配;想到了用new 關(guān)鍵字來處理。

2:數(shù)組的定義格式

區(qū)別:

動態(tài)初始化后數(shù)組中的每一個元素的內(nèi)容都是其對應(yīng)數(shù)據(jù)類型的默認(rèn)值,隨后可以通過下標(biāo)進行數(shù)組內(nèi)容的修改;

如果希望數(shù)組定義的時候就可以提供內(nèi)容,則采用靜態(tài)初始化的方式;

a:數(shù)組的動態(tài)初始化(聲明并初始化數(shù)組):

數(shù)據(jù)類型 數(shù)組名稱 【】 = new 數(shù)據(jù)類型 【長度】;
數(shù)據(jù)類型 【】 數(shù)組名稱 = new 數(shù)據(jù)類型 【長度】

b:數(shù)組的靜態(tài)初始化(在數(shù)組定義的時候就為其設(shè)置好了里面的內(nèi)容)

簡化格式:數(shù)據(jù)類型 數(shù)組 數(shù)組名稱 【】 = {數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,。。。};

完整格式:數(shù)據(jù)類型 數(shù)組名稱【】 = new 數(shù)據(jù)類型【】{ 數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,。。。};

3:數(shù)組的特點

通過腳標(biāo)訪問:0~n-1;

進行數(shù)組操作的時候往往會利用for循環(huán)來完成;

數(shù)組的長度:“數(shù)組名稱.length”;

4:數(shù)組的引用傳遞

數(shù)組定義時用到了new,所以這里存在有內(nèi)存關(guān)系匹配。

public class ArrayDemo {
	public static void main(String args[]) {
		// 使用數(shù)組的靜態(tài)初始化
		int data [] = new int [3] ;
		data [0] = 10 ;	// 為數(shù)組設(shè)置內(nèi)容
		data [1] = 20 ;	// 為數(shù)組設(shè)置內(nèi)容
		data [2] = 30 ;	// 為數(shù)組設(shè)置內(nèi)容
		for (int x = 0 ; x < data.length ; x ++) {
			System.out.println(data[x]) ;
		}
	}
}

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

一個堆內(nèi)存可以被多個棧內(nèi)存所指向

public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {10,20,30} ;	// 靜態(tài)初始化
		int temp [] = data ;	// 引用傳遞
		temp [0] = 99 ;
		for (int x = 0 ; x < data.length ; x ++) {
			System.out.println(data[x]) ;
		}
	}
}

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

由于數(shù)組是引用數(shù)據(jù)類型,所以一定要為其開辟堆內(nèi)存空間(也就是實例化對象)才可以使用,如果使用了未開辟堆內(nèi)存空間的數(shù)組則一定會出現(xiàn)“NullPointerException”異常

5foreach迭代輸出

JDK1.5之后為了減輕下標(biāo)對程序的影響(以為下標(biāo)處理不當(dāng)則會出現(xiàn)數(shù)組越界異常),參考了.NET的設(shè)計,引入了增強型for循環(huán):foreach

for(數(shù)據(jù)類型 變量 :數(shù)組名) { }

特點:可以自動將數(shù)組中的每一個元素的內(nèi)容取出保存到變量里,這樣就可以直接通過變量獲取數(shù)組的內(nèi)容,避免了數(shù)組越界。

public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5} ;
		for (int temp : data) {	// 自動循環(huán),將data數(shù)組每一個內(nèi)容交給temp
			System.out.println(temp) ;
		}
	}
}

6:二維數(shù)組

定義格式:

a:動態(tài)初始化:數(shù)據(jù)類型 數(shù)組名稱【】【】 = new 數(shù)據(jù)類型【行個數(shù)】【列個數(shù)】;

b:靜態(tài)初始化:數(shù)據(jù)類型 【】【】 new 數(shù)據(jù)類型 【】【】 { { 數(shù)據(jù),數(shù)據(jù) …},{ 數(shù)據(jù),數(shù)據(jù)…},… }

public class ArrayDemo {
	public static void main(String args[]) {
		int data [][] = new int [][] {
			{1,2,3,4,5} , {1,2,3} , {5,6,7,8}} ;
		for (int x = 0 ; x < data.length ; x ++) {
			for (int y = 0 ; y < data[x].length ; y ++) {
				System.out.println("data["+x+"]["+y+"] = " + data[x][y]) ;
			}
			System.out.println() ;	// 換行
		}
	}
}
//輸出結(jié)果:
data[0][0] = 1
data[0][1] = 2
data[0][2] = 3
data[0][3] = 4
data[0][4] = 5

data[1][0] = 1
data[1][1] = 2
data[1][2] = 3

data[2][0] = 5
data[2][1] = 6
data[2][2] = 7
data[2][3] = 8


同一個二維數(shù)組通過foreach輸出

public class ArrayDemo {
	public static void main(String args[]) {
		int data [][] = new int [][] {
			{1,2,3,4,5} , {1,2,3} , {5,6,7,8}} ;
		for (int temp [] : data) {
			for (int num : temp) {
				System.out.print(num + "、") ;
			}
			System.out.println() ;
		}
	}
}
//輸出結(jié)果
1、2、3、4、5、
1、2、3、
5、6、7、8

7數(shù)組與方法

對于引用數(shù)據(jù)類型,主要的特點是可以于方法進行引用傳遞,數(shù)組本身也是引用數(shù)據(jù)類型,所以自然也可以通過方法實現(xiàn)引用傳遞的操作。

public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5} ;
		printArray(data) ;	// 傳遞數(shù)組
	}
	// 要求接收一個int型的數(shù)組
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.println(temp[x]) ;
		}
	}
}
//通過方法來接收一個數(shù)組

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = initArray() ;	// 通過方法可以獲得數(shù)組內(nèi)容
		printArray(data) ;	// 傳遞數(shù)組
	}
	public static int [] initArray() {
		int arr [] = new int [] {1,2,3,4,5} ;
		return arr ;	// 返回一個數(shù)組
	}
	// 要求接收一個int型的數(shù)組
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.println(temp[x]) ;
		}
	}
}
//通過方法返回一個數(shù)組對象

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5} ;
		changeArray(data) ;	// 修改數(shù)組內(nèi)容
		printArray(data) ;	// 傳遞數(shù)組
	}
	public static void changeArray(int arr[]) {
		for (int x = 0 ; x < arr.length ; x ++) {
			arr[x] *= 2 ;	// 每個元素的內(nèi)容乘2保存
		}
	}
	// 要求接收一個int型的數(shù)組
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.println(temp[x]) ;
		}
	}
}
//通過方法修改數(shù)組內(nèi)容。

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

下面寫一個案例,總結(jié)上面內(nèi)容

案例;定義一個int數(shù)組,要求計算出這個數(shù)組元素的總和,最大值,最小值,平均值。

//此程序的基本實現(xiàn)
public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5} ;
		int sum = 0 ; ;
		double avg = 0.0 ;
		int max = data[0] ; // 假設(shè)第一個是最大值
		int min = data[0] ;	// 假設(shè)第一個是最小值
		for (int x = 0 ; x < data.length ; x ++) {
			if (data[x] > max) {	// max地位改變了
				max = data[x] ;
			}
			if (data[x] < min) {
				min = data[x] ;
			}
			sum += data[x] ;
		}
		avg = sum / data.length ;
		System.out.println("數(shù)組內(nèi)容總和:" + sum) ;
		System.out.println("數(shù)組內(nèi)容平均值:" + avg) ;
		System.out.println("數(shù)組內(nèi)容最大值:" + max) ;
		System.out.println("數(shù)組內(nèi)容最小值:" + min) ;
	}
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.println(temp[x]) ;
		}
	}
}

問題:主函數(shù)所在的類往往被稱為主類,那么既然是主類中不希望涉及過多復(fù)雜的功能;在開發(fā)的過程中,主方法本身就相當(dāng)于是一個客戶端,而對于客戶端的代碼盡量簡單一些,所以這個時候是將一系列的計算過程交給單獨的程序類去完成。

//改善操作設(shè)計
class ArrayUtil {	// 是一個操作工具的類
	private int sum ; // 保存總和
	private double avg ; // 保存平均值
	private int max ; // 保存最大值
	private int min ; // 保存最小值
	public ArrayUtil(int data[]) {	// 進行數(shù)組計算
		this.max = data[0] ; // 假設(shè)第一個是最大值
		this.min = data[0] ;	// 假設(shè)第一個是最小值
		for (int x = 0 ; x < data.length ; x ++) {
			if (data[x] > max) {	// max地位改變了
				this.max = data[x] ;
			}
			if (data[x] < min) {
				this.min = data[x] ;
			}
			this.sum += data[x] ;
		}
		this.avg = this.sum / data.length ;
	}
	public int getSum() {
		return this.sum ;
	}
	public double getAvg() {
		return this.avg ;
	}
	public int getMax() {
		return this.max ;
	}
	public int getMin() {
		return this.min ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5} ;
		ArrayUtil util = new ArrayUtil(data) ;	// 數(shù)據(jù)計算
		System.out.println("數(shù)組內(nèi)容總和:" + util.getSum()) ;
		System.out.println("數(shù)組內(nèi)容平均值:" + util.getAvg()) ;
		System.out.println("數(shù)組內(nèi)容最大值:" + util.getMax()) ;
		System.out.println("數(shù)組內(nèi)容最小值:" + util.getMin()) ;
	}
}

8:數(shù)組操作案例:數(shù)組反轉(zhuǎn)

做法一:定義一個新的數(shù)組而后按照逆序的方式保存(會產(chǎn)生無用的垃圾空間)

class ArrayUtil {
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.print(temp[x] + "、") ;
		}
		System.out.println() ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;
		int temp [] = new int [data.length] ;	// 第二個數(shù)組
		int foot = temp.length - 1; // 第二個數(shù)組的腳標(biāo)
		for (int x = 0 ; x < data.length ; x ++) {
			temp[foot --] = data[x] ;
		}
		data = temp ; 
		ArrayUtil.printArray(data) ;
	}
	
}

Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解
Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

做法二:在一個數(shù)組上進行轉(zhuǎn)置

class ArrayUtil {
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.print(temp[x] + "、") ;
		}
		System.out.println() ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;
		int center = data.length / 2 ; // 確定轉(zhuǎn)換的次數(shù)
		int head = 0 ;	// 操作腳標(biāo)
		int tail = data.length - 1 ; // 操作腳標(biāo)
		for (int x = 0 ; x < center ; x ++) {
			int temp = data [head] ;
			data [head] = data [tail] ;
			data [tail] = temp ;
			head ++ ;
			tail -- ;
		}
		ArrayUtil.printArray(data) ;
	}
	
}

比較兩種方式:第一種循環(huán)次數(shù)較多,會產(chǎn)生垃圾;第二種實現(xiàn)循環(huán)次數(shù)較低,但是存在if判斷增加了
時間復(fù)雜度,可是減少了無用對象的產(chǎn)生,提升了性能。

//將轉(zhuǎn)換功能變?yōu)轭惗x

class ArrayUtil {
	public static void reverse(int data[]) {
		int center = data.length / 2 ; // 確定轉(zhuǎn)換的次數(shù)
		int head = 0 ;	// 操作腳標(biāo)
		int tail = data.length - 1 ; // 操作腳標(biāo)
		for (int x = 0 ; x < center ; x ++) {
			int temp = data [head] ;
			data [head] = data [tail] ;
			data [tail] = temp ;
			head ++ ;
			tail -- ;
		}
	}
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.print(temp[x] + "、") ;
		}
		System.out.println() ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {1,2,3,4,5,6,7,8,9} ;
		ArrayUtil.reverse(data) ;	// 轉(zhuǎn)置處理
		ArrayUtil.printArray(data) ;
	}
}

9數(shù)組相關(guān)類操作方法

Java語言本身提供有數(shù)組的相關(guān)支持處理。

a:數(shù)組排序:Java.util.Arrays.sort(數(shù)組名稱)

class ArrayUtil {
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.print(temp[x] + "、") ;
		}
		System.out.println() ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		int data [] = new int [] {23,12,1,234,2,6,12,34,56} ;
		java.util.Arrays.sort(data) ;	// 排序
		ArrayUtil.printArray(data) ;
	}
}

b:數(shù)組拷貝:System.arraycopy(源數(shù)組,源數(shù)組開始點,目標(biāo)數(shù)組,目標(biāo)數(shù)組開始點,拷貝長度)

class ArrayUtil {
	public static void printArray(int temp []) {
		for (int x = 0 ; x < temp.length ; x ++) {
			System.out.print(temp[x] + "、") ;
		}
		System.out.println() ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		int dataA [] = new int [] {1,2,3,4,5,6,7,8,9} ;
		int dataB [] = new int [] {11,22,33,44,55,66,77,88,99} ;
		System.arraycopy(dataA,5,dataB,3,3) ;
		ArrayUtil.printArray(dataB) ;
	}
}
//結(jié)果:
11、22、33、6、7、8、77、88、99、

10方法可變參數(shù)

需求:定義一個方法,可以實現(xiàn)任意多個整型數(shù)據(jù)的相加處理。

傳統(tǒng)實現(xiàn)。

class ArrayUtil {
	public static int sum(int [] data) {
		int sum = 0 ; 
		for (int temp : data) {
			sum += temp ;
		}
		return sum ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		System.out.println(ArrayUtil.sum(new int [] {1,2,3})) ;
	}
}

上述代碼可以實現(xiàn)任意多個數(shù)字的參數(shù)內(nèi)容傳遞,但是與實際的要求并不符合,實際要求的是可以傳遞任意多個參數(shù),而不是一個數(shù)組。

從JDK1.5開始為了方便開發(fā)組進行可變參數(shù)的定義。

class ArrayUtil {
	public static int sum(int ... data) {	// 變種數(shù)組
		int sum = 0 ; 
		for (int temp : data) {
			sum += temp ;
		}
		return sum ;
	}
}
public class ArrayDemo {
	public static void main(String args[]) {
		System.out.println(ArrayUtil.sum(1,2,3,4)) ;
		System.out.println(ArrayUtil.sum(new int [] {1,2,3})) ;
	}
}
//輸出
10
6

總結(jié):可變參數(shù)的最大作用:在以后進行一些程序類設(shè)計或者開發(fā)者調(diào)用的時候,利用次種形式可以避免數(shù)組的傳遞操作;可變參數(shù)的本質(zhì):依然屬于數(shù)組。

11對象數(shù)組(重點)

之前接觸到的都是基本數(shù)據(jù)類型定義的數(shù)組;Java程序中各種數(shù)據(jù)類型都可以成為數(shù)組類型,所以類也可以成為數(shù)組類型:對象數(shù)組。

動態(tài)初始化: 類 對象數(shù)組名稱 【】 = new 類 【長度】;

靜態(tài)初始化: 類 對象數(shù)組名稱 【】 = new 類 【】{實例化對象,實例化對象,… };

動態(tài)初始化每個元素為null;

//動態(tài)初始化
class Person {
	private String name ;
	private int age ;
	public Person(String name,int age) {
		this.name = name ;
		this.age = age ;
	}
	public String getInfo() {
		return "姓名:" + this.name + "、年齡:" + this.age ;
	}
	// setter、getter略
}
public class ArrayDemo {
	public static void main(String args[]) {
		Person per [] = new Person[3] ; // 對象數(shù)組
		per[0] = new Person("張三",20) ;
		per[1] = new Person("李四",20) ;
		per[2] = new Person("王五",20) ;
		for (int x = 0 ; x < per.length ; x ++) {
			System.out.println(per[x].getInfo()) ;
		}
	}
}
//靜態(tài)初始化

class Person {
	private String name ;
	private int age ;
	public Person(String name,int age) {
		this.name = name ;
		this.age = age ;
	}
	public String getInfo() {
		return "姓名:" + this.name + "、年齡:" + this.age ;
	}
	// setter、getter略
}
public class ArrayDemo {
	public static void main(String args[]) {
		Person per [] = new Person[] {
			new Person("張三",20) ,
			new Person("李四",20) ,
			new Person("王五",20)} ; // 對象數(shù)組
		for (int x = 0 ; x < per.length ; x ++) {
			System.out.println(per[x].getInfo()) ;
		}
	}
}

對于對象數(shù)組而言,上述代碼只是更換了一種所謂的數(shù)組定義的類型,但是內(nèi)存圖變得復(fù)雜:
Java基礎(chǔ)學(xué)習(xí)筆記之?dāng)?shù)組詳解

總結(jié)

數(shù)組最大缺陷:

長度是固定的;

優(yōu)勢:線性保存,根據(jù)索引訪問,速度較塊。(時間復(fù)雜度為“1”)。

面試題:定義類的時候什么情況下會考慮使用static方法?

在類中不提供任何成員屬性的情況下,如果定義的是普通方法,那么就必須通過實例化對象來進行調(diào)用,這樣就會產(chǎn)生許多無用的實例化對象。那么在這樣的情況下會考慮直接定義static方法,這樣可以由類名稱直接調(diào)用。

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)組操作技巧總結(jié)》、《Java字符與字符串操作技巧總結(jié)》、《Java數(shù)學(xué)運算技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》及《Java操作DOM節(jié)點技巧總結(jié)》

希望本文所述對大家java程序設(shè)計有所幫助。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI