Java數(shù)組
- 數(shù)組就是用來存儲一批同種類型數(shù)據(jù)的內(nèi)存區(qū)域(可以理解為容器)
數(shù)組的定義
靜態(tài)初始化數(shù)組
定義數(shù)組的時候直接給數(shù)組賦值
-
靜態(tài)初始化格式:
// 完整格式 數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{元素1辑鲤,元素2,元素3……}; double[] scores = new double[]{90.0, 85.5, 72.6, 66.1}; String[] items = new String[]{'臺球', '鉛球', '足球', '排球', '羽球'};
// 簡化格式 數(shù)據(jù)類型[] 數(shù)組名 = {元素1, 元素2, 元素3……}; int[] age = {12, 24, 36};
動態(tài)初始化數(shù)組
定義數(shù)組的時候只確定元素的類型和數(shù)組的長度好啰,之后再存入具體的數(shù)據(jù)
-
動態(tài)初始化格式
數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[長度]; int[] array = new int[3]; //后賦值 arr[0] = 10; System.out.println(arr[0]); // 10
數(shù)組的訪問
-
數(shù)組名稱[索引]
數(shù)組的索引從0開始
-
數(shù)組的長度屬性:length
數(shù)組名.length // 獲取數(shù)組的長度
-
數(shù)組的最大索引表示:
數(shù)組名.length - 1 // 前提:數(shù)組的元素個數(shù)大于1
元素默認規(guī)則
數(shù)據(jù)類型 | 明細 | 默認值 |
---|---|---|
基本類型 | byte爆惧,short夺脾,char,int丐重,long | 0 |
float怒见,double | 0.0 | |
boolean | false | |
引用類型 | 類,接口禽车,數(shù)組寇漫,String | null |
數(shù)組的遍歷
遍歷就是對所有數(shù)據(jù)按照一定規(guī)則一個一個的訪問
-
如何遍歷數(shù)組的元素:關(guān)鍵在于數(shù)組長度作為循環(huán)條件,初始化語句決定著從第幾個元素開始遍歷殉摔,步進語句決定著循環(huán)的元素間隔州胳,靈活使用可以實現(xiàn)從某個元素開始遍歷,每三個遍歷一次等操作
int[] ages = {20, 30, 40, 50}; for (int i = 0; i < ages.length; i++) { System.out.println(ages[i]); }
元素交換
-
創(chuàng)建中間變量進行交換
void swapr(int &a, int &b) { int temp = a; a = b; b = a; }
-
使用異或運算特性進行交換
void swapr(int &a, int &b) { a ^= b; b ^= a; a ^= b; }
數(shù)組的內(nèi)存圖
- 數(shù)組的基本原理:在堆內(nèi)存你中為數(shù)組開辟一片連續(xù)的內(nèi)存空間且分配地址逸月,并劃分成多個相等的空間用于裝載元素栓撞,數(shù)組變量名通過獲取地址實現(xiàn)對內(nèi)存塊中元素的交互
- 數(shù)組變量名中存儲的是數(shù)組在內(nèi)存中的地址,即打印數(shù)組變量名會得到該數(shù)組的地址碗硬,首字母為數(shù)組數(shù)據(jù)類型首字母瓤湘,其后的數(shù)字為十六進制數(shù)表示的地址。數(shù)組是引用類型
Java內(nèi)存分配介紹
- 棧:方法運行時所進入的內(nèi)存肛响;變量也在此
- 堆:new出的內(nèi)容(對象)會在此內(nèi)存開辟空間并產(chǎn)生地址
- 方法區(qū):字節(jié)碼文件加載時進入的內(nèi)存
- 本地方法棧
- 寄存器
例子:
兩個數(shù)組變量指向同一個數(shù)組對象岭粤,對數(shù)組對象的修改會引起兩個數(shù)組變量同時發(fā)生變化
其他注意事項
- “數(shù)據(jù)類型[] 數(shù)組名” 也可以寫成 “數(shù)據(jù)類型 數(shù)組名[]”
- Java是強類型語言,嚴格要求什么類型的數(shù)組存放什么類型的數(shù)據(jù)特笋,否則報錯
- 數(shù)組一旦被定義出來,程序的執(zhí)行過程中巾兆,長度和類型就固定了猎物,就不可以更改
-
動態(tài)靜態(tài)的含義在于數(shù)組元素是否后期動態(tài)裝載:
當前已經(jīng)知道存入的元素值,用靜態(tài)初始化
當前還不清楚要存入哪些數(shù)據(jù)角塑,用動態(tài)初始化
- 數(shù)組索引越界異常(ArrayIndexOutOfBoundsException):訪問的元素位置超過最大索引
- 空指針異常(NullPointerException):數(shù)組變量中沒有存儲數(shù)組的地址蔫磨,而是null
數(shù)組常見應(yīng)用
常見應(yīng)用:
- 元素求和
- 求最值
- 猜數(shù)字
- 隨機排名
- 冒泡排序
package com.java.test;
/**
* 數(shù)組的常見應(yīng)用:
* 1. 元素求和
* 2. 求最值
* 3. 猜數(shù)字游戲
* 4. 隨機排名
* 5. 數(shù)組排序
*/
public class ArrayCase {
public static void main(String[] args) {
//1. 元素求和
//某部門5名員工的銷售額分別是:16,26圃伶,36堤如,6,100窒朋,請計算出他們部門的總銷售額
int[] arr1 = new int[]{16, 26, 36, 6, 100};
for (int i = 0; i < arr1.length; i++) {
arr1[i] += arr1[i];
}
System.out.println("部門的總銷售額:" + arr1[arr1.length - 1]);
System.out.println("------------------------------------------");
//2. 求最值
//給定一組數(shù)據(jù)求最值
int[] arr2 = new int[]{15, 36, 72, 85, 61, -2, 99};
int max = arr2[0];
int min = arr2[0];
for (int i = 1; i < arr2.length; i++) {
if (arr2[i] > max) {
max = arr2[i];
}
if (arr2[i] < min) {
min = arr2[i];
}
}
System.out.println("最大值:" + max + '\n' + "最小值:" + min);
System.out.println("------------------------------------------");
//3. 猜數(shù)字游戲
//游戲規(guī)則:生成[1-20]之間的5個數(shù)(可重復)搀罢,未猜中提示“未命中”并繼續(xù)猜測
// 猜中提示猜中并輸出該數(shù)第一次出現(xiàn)的位置,然后輸出全部5個數(shù)據(jù)侥猩,結(jié)束游戲
Random r = new Random();
Scanner sc = new Scanner(System.in);
int[] arr3 = new int[5];
for (int i = 0; i < 5; i++) {
arr3[i] = r.nextInt(20) + 1;
}
demo:
//創(chuàng)建一個break的結(jié)束標簽demo
while (true) {
System.out.println("請合法輸入位于[1,20]的任意數(shù)進行猜測榔至!");
int num = sc.nextInt();
for (int i = 0; i < arr3.length; i++) {
if (num == arr3[i]) {
System.out.println("您猜對了!");
System.out.println("您猜對的數(shù)處于數(shù)組中的第" + (i + 1) + "個");
for (int m = 0; m < arr3.length; m++) {
System.out.print(arr3[m] + "\t");
System.out.println();
}
break demo;
}
}
System.out.println("您猜測的數(shù)據(jù)不在數(shù)組當中欺劳,請重新猜測唧取!");
System.out.println("--------------------------------------");
}
System.out.println("--------------------------------------");
//4. 隨機排名
//有五個人需要進行演講铅鲤,請打亂他們的順序,利用隨機保證公平性
int[] arr4 = new int[5];
Scanner in = new Scanner(System.in);
Random rand = new Random();
for (int i = 0; i < arr4.length; i++) {
System.out.println("請輸入第" + (i + 1) + "位演講者的編號:");
arr4[i] = in.nextInt();
}
for (int i = 0; i < arr4.length; i++) {
int index = rand.nextInt(arr4.length);
int temp = arr4[index];
arr4[index] = arr4[i];
arr4[i] = temp;
}
for (int i = 0; i < arr4.length; i++) {
System.out.print(arr4[i] + "\t");
}
System.out.println("--------------------------------------");
//5. 數(shù)組排序
//給定一組數(shù)據(jù)進行升序排序枫弟,算法指定:冒泡排序
int[] arr5 = new int[]{5, 2, 3, 1};
// 0 1 2 3
//定義一個循環(huán)控制比較的輪數(shù)
for (int i = 0; i < arr5.length - 1; i++) {
/*
i == 1 比較的次數(shù) 3 j = 0 1 2
i == 2 比較的次數(shù) 2 j = 0 1
i == 3 比較的次數(shù) 1 j = 0
*/
//定義一個循環(huán)控制每輪比較的次數(shù)邢享,占位
for (int j = 0; j < arr5.length - i; j++) {
// 判斷當前位置的元素值,是否大于后一個位置淡诗,若較大驼仪,則交換
if (arr5[j] > arr5[j + 1]) {
int temp = arr5[j + 1];
arr5[j + 1] = arr5[j];
arr5[j] = temp;
}
}
}
}
}
數(shù)組排序
- 數(shù)組排序的技術(shù)
- 冒泡排序
- 選擇排序
- 快速排序
- 插入排序
- ……
- 數(shù)組搜索相關(guān)技術(shù)
- 二分搜索
- 分塊查找
- 哈希表查找
- ……
冒泡排序(面試熱點)
-
思想:
- 從頭開始兩兩比較,把較大的元素與較小的元素進行交換
- 每輪把當前最大的一個元素存入到數(shù)組當前的末尾
-
實現(xiàn)冒泡排序的關(guān)鍵步驟分析:
- 確定排序總共需要幾輪:數(shù)組的長度 - 1
- 每輪比較幾次:數(shù)組的長度 - i(隨著輪數(shù)i增多而遞減)
-
冒泡排序的實現(xiàn)步驟
定義一個外部循環(huán)控制總共需要冒幾輪(數(shù)組的長度 - 1)
-
定義一個內(nèi)部循環(huán)袜漩,控制每輪依次往后比較幾個位置(數(shù)組的長度 - i)
注意 绪爸,如果從0開始循環(huán),此處的上界應(yīng)該是:數(shù)組的長度 - i - 1
如果當前位置的元素值大于后一個位置的元素值宙攻,兩者交換
-
例子:
package com.java.test; import java.util.Scanner; public class BubbleSort { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("請輸入?yún)⒓用芭菖判虻恼麛?shù)的個數(shù):"); int sum = in.nextInt(); System.out.println("請輸入這" + sum + "個數(shù):"); int[] arr = new int[sum]; for (int i = 0; i < arr.length; i++) { arr[i] = in.nextInt(); } for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { arr[j] ^= arr[j + 1]; arr[j + 1] ^= arr[j]; arr[j] ^= arr[j + 1]; } } } System.out.println("排序后數(shù)組遍歷結(jié)果"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } } }