目錄
- 前言
- 一、創建陣列
- 創建陣列的三種方式
- 二、 陣列的使用
- 1.獲取長度 & 訪問元素
- 2.遍歷陣列
- 2.1使用for回圈
- 2.2使用for each回圈
- 2.3Arrays類的toString 方法
- 三、陣列作為方法的引數
- 3.1列印陣列的內容
- 3.2理解參考型別
- 3.3認識null
- 3.4 初識 JVM 記憶體區域劃分
- 四、陣列作為方法的回傳值
- 五、陣列練習
- 5.1 陣列轉字串
- 5.2 找陣列中的最大元素
- 5.3 求陣列中元素的平均值
- 5.4 查找陣列中指定元素(順序查找)
- 5.5 查找陣列中指定元素(二分查找)
- 5.6檢查陣列的有序性
- 5.7陣列排序(冒泡排序)
- 5.8陣列逆序
- 5.9陣列數字排列
- 5.10陣列的拷貝
- 5.10.1 用克隆的方法直接拷貝一個新的陣列
- 5.10.2用 System.arraycopy()方法進行拷貝
- 5.10.3用Arrays.copyOf()的方法進行拷貝
- 5.10.4 Arrays.copyOfRange()拷貝陣列中得指定長度
- 5.10.5 Arrays.fill()陣列的填充
- 六、二維陣列
- 6.1二維陣列定義的三種方式
- 6.2二維陣列的遍歷
- 6.3不規則的二維陣列
前言
陣列是一種資料結構,用來存盤同一型別值的集合,通過一個整型下標可以訪問陣列中的每一個值,例如:如果a是一個整型陣列,a[i]就是陣列中下標為i的整數,在宣告陣列變數時,需要指出陣列型別(資料元素型別緊跟[]和陣列變數的名字,下面宣告了整型陣列a:int[]a;這條陳述句只宣告了變數a,并沒有將a初始化為一個真正的陣列,應該使用new運算子創建陣列,int[] a = new int[100];
這條陳述句創建了一個可以存盤100個整數的陣列,陣列長度不要求是常量: new int[n]會創建一個長度為n的陣列,
一、創建陣列
陣列本質上就是讓我們能 “批量” 創建相同型別的變數,在 Java 中, 陣列中包含的變數必須是相同型別,
創建陣列的三種方式
方式一:
int[] arr = {1,2,3,4,5};
方式二:
int[] arr2 = new int[3];//定義陣列長度為3,未初始化
方式三:
int[] arr3 = new int[]{1,2,3,4,5};//定義陣列長度為5,初始化
二、 陣列的使用
1.獲取長度 & 訪問元素
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
System.out.println(arr.length);//求陣列的長度
System.out.println(arr[3]);//訪問陣列中的元素
arr[3] = 19;
System.out.println(arr[3]);//改變陣列里面的內容
}
注意:
- 使用
arr.length能夠獲取到陣列的長度,.這個操作為成員訪問運算子,后面在面向物件中會經常用到. - 使用
[ ]按下標取陣列元素. 需要注意, 下標從0開始計數. - 使用
[ ]操作既能讀取資料, 也能修改資料. - 下標訪問操作不能超出有效范圍
[0, length - 1], 如果超出有效范圍, 會出現下標越界例外.
2.遍歷陣列
“遍歷” 是指將陣列中的所有元素都訪問一遍, 不重不漏. 通常需要搭配回圈陳述句.
2.1使用for回圈
for回圈可以拿到下標,
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for (int i = 0; i < arr.length; i++) { //for回圈可以拿到下標
System.out.print(arr[i] + " "); //列印陣列中的每個元素
}
2.2使用for each回圈
語法格式:
for (int element : a)
System.out.println(element);
列印陣列a的每一個元素,一個元素占一行,這個回圈應該讀作“回圈a中的每一個元素”( for each element in a),Java語言的設計者認為應該使用諸如foreach、in這樣的關鍵字,但這種回圈陳述句并不是最初就包含在Java語言中的,而是后來添加進去的,并且沒有人打算廢除已經包含同名(例如System.in)方法或變數的舊代碼,
for each回圈又稱增強for回圈,可以列印陣列中的每個元素 但是拿不到陣列下標,
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for (int x:arr) { //
System.out.print(x + " ");
}
2.3Arrays類的toString 方法
呼叫Arrays.toString(a),回傳一個包含陣列元素的字串,這些元素被放置在括號內,并用逗號分隔,例如:“[2,3,5,7,11,13]”,要想列印陣列,可以呼叫:System.out.println(Arrays.toString(a));
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
//借助java的操作陣列的工具類 Arrays.toString:將引數的陣列以字串的形式進行輸出
String ret = Arrays.toString(arr);
System.out.println(ret);
}
三、陣列作為方法的引數
3.1列印陣列的內容
public static void printf(int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
printf(arr);//按參考傳遞(按值傳遞)
}
在這個代碼中int[] a 是函式的形參, int[] arr 是函式實參.
3.2理解參考型別
public static void func1(int[] arr){
arr = new int[]{10,12,24,52,61};
}
public static void func2(int[] arr){
arr[0] = 521;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
System.out.print(Arrays.toString(arr));// 1,2,3,4,5
System.out.println();
// func1(arr);//1,2,3,4,5 雖然傳的是地址,但是傳過去之后,形參只是改變了自己的指向而已,
func2(arr); //521,2,3,4,5
//在函式內部修改陣列內容, 函式外部也發生改變.此時陣列名 arr 是一個"參考".當傳參的時候, 是按照參考傳參.
System.out.print(Arrays.toString(arr));
}
所謂的 “參考” 本質上只是存了一個地址. Java 將陣列設定成參考型別, 這樣的話后續進行陣列引數傳參, 其實只是將陣列的地址傳入到函式形參中. 這樣可以避免對整個陣列的拷貝(陣列可能比較長, 那么拷貝開銷就會很大).
3.3認識null
public static void main4(String[] args) {
int[] arr = {1,2,3,4,5};
int[] arr2 = null;//代表這個參考不指向任何物件
System.out.println(arr2);//空指標例外
}
null 的作用類似于 C 語言中的 NULL (空指標), 都是表示一個無效的記憶體位置,因此不能對這個記憶體進行任何讀寫操作, 一旦嘗試讀寫, 就會拋出:NullPointerException.
注意: Java 中并沒有約定 null 和 0 號地址的記憶體有任何關聯,
3.4 初識 JVM 記憶體區域劃分
JVM 的記憶體被劃分成了幾個區域:
程式計數器 (PC Register): 只是一個很小的空間, 保存下一條執行的指令的地址.虛擬機堆疊(JVM Stack): 重點是存盤區域變數表(當然也有其他資訊). 我們剛才創建的int[] arr這樣的存盤地址的參考就是在這里保存.本地方法堆疊(Native Method Stack): 本地方法堆疊與虛擬機堆疊的作用類似. 只不過保存的內容是Native方法的區域變數. 在有些版本的JVM實作中(例如HotSpot), 本地方法堆疊和虛擬機堆疊是一起的.堆(Heap):JVM所管理的最大記憶體區域. 使用new創建的物件都是在堆上保存 (例如前面的new int[]{1, 2,3}).方法區(Method Area): 用于存盤已被虛擬機加載的類資訊、常量、靜態變數、即時編譯器編譯后的代碼等資料. 方法編譯出的的位元組碼就是保存在這個區域.運行時常量池(Runtime Constant Pool): 是方法區的一部分, 存放字面量(字串常量)與符號參考. (注意 從JDK1.7開始, 運行時常量池在堆上).
Native 方法:
JVM 是一個基于 C++ 實作的程式. 在 Java 程式執行程序中, 本質上也需要呼叫 C++ 提供的一些函式進行和作業系統底層進行一些互動. 因此在 Java 開發中也會呼叫到一些 C++ 實作的函式.這里的 Native 方法就是指這些 C++ 實作的, 再由 Java 來呼叫的函式.
四、陣列作為方法的回傳值
寫一個方法, 將陣列中的每個元素都 * 2
/**
* 在原來的陣列上擴大2倍
* @param arr
*/
public static void func(int[] arr){
for (int i = 0; i < arr.length; i++) {
arr[i] = 2 * arr[i];
System.out.print(arr + " ");
}
}
/**
* 不改變原陣列,將陣列擴大2倍,創建一個新的陣列用來接收擴大2倍之后的值
* @param arr
* @return
*/
public static int[] func3(int[] arr){
int[] ret = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
ret[i] = 2 * arr[i];
}
return ret;
}
public static void main9(String[] args) {
int[] arr = {1,2,3,4,5};
func(arr);
int[] ret2 = func3(arr);
System.out.print(Arrays.toString(ret2));
}
五、陣列練習
5.1 陣列轉字串
/**
* 寫一個方法將陣列轉字串
* @param arr
* @return
*/
public static String myToString(int[] arr){
if(arr == null){
return null;
}
String ret = "[";
for (int i = 0; i < arr.length; i++) {
ret += arr[i];
if(i != arr.length - 1){
ret += ",";
}
}
ret += "]";
return ret;
}
public static void main10(String[] args) {
int[] arr = {1,2,3,4,5};
System.out.println(myToString(arr));
}
利用java所提供的Arrays包,也可以實作陣列轉字串操作:
import java.util.Arrays
int[] arr = {1,2,3,4,5,6};
String newArr = Arrays.toString(arr);
System.out.println(newArr);//[1, 2, 3, 4, 5, 6]
5.2 找陣列中的最大元素
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
System.out.println(maxNum(arr));
}
public static int maxNum(int[] arr){
if(arr == null){
return -1;
}
if(arr.length == 0){
return -1;
}
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if(max < arr[i]){
max = arr[i];
}
}
return max;
}
5.3 求陣列中元素的平均值
public static double avg(int[] arr){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return (double) sum/(double) arr.length;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
System.out.println(avg(arr));
}
5.4 查找陣列中指定元素(順序查找)
給定一個陣列, 再給定一個元素, 找出該元素在陣列中的位置,回傳陣列的下標,
public static int findNum(int[] arr,int key){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == key){
return i;
}
}
return -1;
}
public static void main11(String[] args) {
int[] arr = {4,5,2,8,44,2,0};
System.out.println(findNum(arr,8));
}
5.5 查找陣列中指定元素(二分查找)
以升序陣列為例, 二分查找的思路是先取中間位置的元素, 看要找的值比中間元素大還是小. 如果小, 就去左邊找; 否則就去右邊找,
public static int binarySearch(int[] arr,int k){
int l = 0;
int r = arr.length - 1;
while (l < r){
int mid = (l + r)/2;
if(arr[mid] > k){
r = mid - 1;
}
else if(arr[mid] < k){
l = mid + 1;
}
else
return mid;
}
return -1;
}
public static void main11(String[] args) {
int[] arr = {1,2,3,4,5,78,99};
System.out.println(binarySearch(arr,78));
System.out.println(Arrays.binarySearch(arr, 78)); //自帶的二分查找
}
5.6檢查陣列的有序性
public static void main(String[] args) {
int[] arr = {1,2,3,10,5,6};
System.out.println(isSorted(arr));
}
public static boolean isSorted(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
return false;
}
}
return true;
}
5.7陣列排序(冒泡排序)
public static void main(String[] args) {
int[] arr = {3,5,6,1,2,9,0,8,4,7};
boolean flg = false;
for (int i = 0; i < arr.length; i++) {
for (int j = arr.length - 1; j > i; j--) {
if(arr[j] < arr[j - 1]){
int temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
flg = true;
}
}
if(flg == false){
return;//break;
}
}
System.out.println(Arrays.toString(arr));
}
加上flg之后,如果陣列在排序途中已經有序,可提前結束回圈,
冒泡排序性能較低. Java 中內置了更高效的排序演算法:
public static void main(String[] args) {
int[] arr = {9, 5, 2, 7};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
5.8陣列逆序
給定一個陣列, 將里面的元素逆序排列.
思路:設定兩個下標, 分別指向第一個元素和最后一個元素. 交換兩個位置的元素.
然后讓前一個下標自增, 后一個下標自減, 回圈繼續即可.
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4};
reverse(arr);
System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] arr) {
int left = 0;
int right = arr.length - 1;
while (left < right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
5.9陣列數字排列
給定一個整型陣列, 將所有的偶數放在前半部分, 將所有的奇數放在陣列后半部分.
思路:設定兩個下標分別指向第一個元素和最后一個元素.用前一個下標從左往右找到第一個奇數, 用后一個下標從右往左找到第一個偶數, 然后交換兩個位置的元素.依次回圈即可.
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
transform(arr);
System.out.println(Arrays.toString(arr));
}
public static void transform(int[] arr) {
int left = 0;
int right = arr.length - 1;
while (left < right) {
// 該回圈結束, left 就指向了一個奇數
while (left < right && arr[left] % 2 == 0) {
left++;
}
// 該回圈結束, right 就指向了一個偶數
while (left < right && arr[right] % 2 != 0) {
right--;
}
// 交換兩個位置的元素
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
5.10陣列的拷貝
5.10.1 用克隆的方法直接拷貝一個新的陣列
public static void main(String[] args) {
int[] arr = {11,12,13,45,56};
int[] copy = arr.clone();
System.out.println(Arrays.toString(copy));
}
5.10.2用 System.arraycopy()方法進行拷貝
public static void main(String[] args) {
int[] arr = {11,12,13,45,56};
int[] copy = new int[arr.length];
System.arraycopy(arr,0,copy,0,arr.length);
//arr表示原陣列,0表示原陣列拷貝的起始地址,copy表示目的陣列,0表示目的陣列的
//起始位置,arr.length表示要拷貝的陣列的長度
System.out.println(Arrays.toString(copy));
}
System.arraycopy(arr,0,copy,0,arr.length);
//arr表示原陣列,0表示原陣列拷貝的起始地址,copy表示目的陣列,0表示目的陣列的
//起始位置,arr.length表示要拷貝的陣列的長度
5.10.3用Arrays.copyOf()的方法進行拷貝
5.10.4 Arrays.copyOfRange()拷貝陣列中得指定長度
public static void main(String[] args) {
int[] arr = {11,12,13,45,56};
//可以拷貝陣列的長度,也可以拷貝陣列長度的整數倍,
//拷貝其整數倍之后,后面的值如果不賦初值,其默認都為0.
int[] ret = Arrays.copyOf(arr,arr.length * 2);
//也可以用Arrays.copyOfRange()拷貝陣列中得指定長度
int[] ret1 = Arrays.copyOfRange(arr,1,3);
System.out.println(Arrays.toString(ret));
System.out.println(Arrays.toString(ret1));
5.10.5 Arrays.fill()陣列的填充
public static void main(String[] args) {
//定義一個陣列長度為10的一維陣列
int[] arr = new int[10];
//長度為10的一維陣列中的所有元素都填充為99
Arrays.fill(arr,99); //填充
//一維陣列中的指定下標元素填充為99
Arrays.fill(arr,2,6,99);
//System.out.println(Arrays.toString(arr));
}
六、二維陣列
二維陣列本質上也就是一維陣列, 只不過每個元素又是一個一維陣列.
語法格式:
資料型別[][] 陣列名稱 = new 資料型別 [行數][列數] { 初始化資料 };
6.1二維陣列定義的三種方式
int[][] arr1 = {{1,2,3},{4,5,6}};
int[][] arr2 = new int[][]{{1,2,3},{4,5,6}};
int[][] arr3 = new int[2][3];
6.2二維陣列的遍歷
public static void main(String[] args) {
int[][] arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
}
//二維陣列的列印,方法1:
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();//換行
System.out.println("******************");
//二維陣列的列印,方法2:
for (int[] ret:arr) {
for (int x:ret) {
System.out.print(x+" ");
}
System.out.println();
}
System.out.println("******************");
//二維陣列的列印,方法3:Arrays里面自帶的包列印陣列
System.out.println(Arrays.deepToString(arr));
}
6.3不規則的二維陣列
如果二維陣列里面的數字沒有全部寫完,則列印出來的二維陣列相應位置是個空格,而不是0,
如果二維陣列的列沒有寫,可以對它的列重新賦值,
public static void main5(String[] args) {
int[][] arr1 = {{1,2},{4,5,6}};
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + " ");
}
System.out.println();
}
System.out.println("*****************");
//不規則的二維陣列
int[][] arr3 = new int[2][];
arr3[0] = new int[3];
arr3[1] = new int[2];
for (int i = 0; i < arr3.length; i++) {
for (int j = 0; j < arr3[i].length; j++) {
System.out.print(arr3[i][j] + " ");
}
System.out.println();
}
}
以上,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/339202.html
標籤:其他
上一篇:初識C語言——階段性小結(一)
