解析java中的数组
文章目錄
- 一 數組的定義
- 二 數組的基本語法
- 三 數組的使用
- 1 數組獲取長度與訪問元素
- 注意事項:
- 2 數組的遍歷
- (1)for循環遍歷
- (2)for-each遍歷數組
- 四 數組作為方法的參數
- (1)基本用法
- (2)理解引用類型
- 總結:
- 五 認識null
- 例題
- 注意:
- 六. 數組作為方法的返回值
- 七 數組的拷貝
- 1 copyof
- 2 copyRange
- 3 clone()
- 4 System.arraycopy
- 八. 二維數組
- 1 基本語法
- 2 二維數組的遍歷
- (1)for循環進行遍歷
- (2)for-each循環遍歷
- (3)調用Arrays
- 3 不規則的二維數組
一 數組的定義
數組:本質上就是一組相同類型的變量。
二 數組的基本語法
1) 數據類型[] 數組名稱 = new 數據類型 [] { 初始化數據 }; 例:int[] arr = new int[]{1, 2, 3}; 2) 數據類型[] 數組名稱 = { 初始化數據 }; 例: int[] arr = {1, 2, 3}; 3) 數據類型[] 數組名稱 = new int[定義數組長度];//這種定義數組里面全部初始化為零 例:int[] arr = new int[10];三 數組的使用
1 數組獲取長度與訪問元素
int[] arr = {1, 2, 3}; // 獲取數組長度 System.out.println("length: " + arr.length); // 執行結果: 3 // 訪問數組中的元素 System.out.println(arr[1]); // 執行結果: 2注意事項:
(1): 訪問數組元素的下標是從0開始的
(2):下表訪問的數不能超過【0,length-1】,否則會出現數組越界,這樣程序會報錯。
(3):利用[]可以對數組的內容進行更改與讀取操作
2 數組的遍歷
(1)for循環遍歷
int[] arr = {1, 2, 3}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }(2)for-each遍歷數組
int[] arr = {1, 2, 3}; for (int x : arr) { System.out.println(x); }四 數組作為方法的參數
(1)基本用法
public static void main(String[] args) {int[] arr = {1, 2, 3};printArray(arr); } public static void printArray(int[] a) {for (int x : a) {System.out.println(x);} } // 執行結果 1 2 3在以上的這個數組中,int[] a 是函數的形參, int[] arr 是函數實參.
(2)理解引用類型
參數傳數組類型就是屬于引用類型
public static void main(String[] args) {int[] arr = {1, 2, 3};func(arr);System.out.println("arr[0] = " + arr[0]); } public static void func(int[] a) {a[0] = 10;System.out.println("a[0] = " + a[0]); } // 執行結果 a[0] = 10 arr[0] = 10我們發現, 在方法內部修改數組內容, 主函數數組內容也發生改變.
此時數組名 arr 是一個 “引用” . 當傳參的時候, 是按照引用傳參.
這個就需要我們從內存這個知識去解釋了,在內存中,局部變量創建是放在JVM的棧上
,對象是在堆上。在上面這個代碼中,首先進入main函數,為arr開辟一個內存空間,放到棧上,里面存放的是對象的地址(0x789),而這里的對象就是對數組的內容(1,2,3)會被放到堆上地址為(0x789),通過地址,arr就能夠訪問到對象,而之后用到方法,arr會把它的地址傳給a,此時JVM的棧上有開辟了一個空間(0x789),通過a,也可以訪問到arr的對象,可以進行改寫與讀操作。
圖例:
總結:
所謂的 “引用” 本質上只是存了一個地址. Java 將數組設定成引用類型
五 認識null
null 在 Java 中表示 “空引用” , 也就是一個無效的引用
例題
int[] arr = null; System.out.println(arr[0]); // 執行結果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)null 的作用類似于 C 語言中的 NULL (空指針), 都是表示一個無效的內存位置. 因此不能對這個內存進行任何讀寫操作. 一旦嘗試讀寫, 就會拋出 NullPointerException.
注意:
Java 中并沒有約定 null 和 0 號地址的內存有任何關聯
六. 數組作為方法的返回值
// 返回一個新的數組 class Test { public static void main(String[] args) {int[] arr = {1, 2, 3};int[] output = transform(arr);printArray(output); } public static void printArray(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);} } public static int[] transform(int[] arr) {int[] ret = new int[arr.length];for (int i = 0; i < arr.length; i++) {ret[i] = arr[i] * 2;}return ret;} }從以上代碼分析可以得出,數組可以作為返回值類型,從而返回一個數組,特別注意一下這個ret數組,這個ret數組里面存放的地址不在是arr內存中的地址,此時的ret數組里面的內容會與arr的內容一致。
七 數組的拷貝
1 copyof
import java.util.Arrays;//這個是導入的包,在下面使用Arrays后自動導入public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = Arrays.copyOf(arr,arr.length);//arr表示要進行拷貝的數組,arr.length表示拷貝的長度}注意這里拷貝的長度可以是乘以一個實數,比如乘以2,那么拷貝后ret數組就變成{1,2,3,4,5,0,0,0,0,0}這個就是擴容處理
2 copyRange
import java.util.Arrays;public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = Arrays.copyOfRange(arr,2,4);//arr表示原數組,2表示的是拷貝的起始位置,4表示拷貝結束的位置}3 clone()
public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = arr.clone();}4 System.arraycopy
import java.util.Arrays;public class java1027 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};int[] ret = new int[arr.length];System.arraycopy(arr,0,ret,0,arr.length);System.out.println(Arrays.toString(ret));//數組以字符串的形式輸出}//arr表示的是原數組,0表示從原數組0下標開始拷貝,ret表示目的數組,0表示從下標0開始,arr.length表示結束下標以上四種拷貝方式都是屬于淺拷貝,至于深拷貝,后續的內容我們會詳解
八. 二維數組
1 基本語法
1)數據類型[][] 數組名稱 = new 數據類型 [行數][列數] { 初始化數據 };
2)數據類型[][] 數組名稱 ={ 初始化數據 };
運行結果
2
3
二維數組arr從這張圖就可以看出二維數組是一個特殊的一維數組,結合上訴代碼就可以看出arr.length代表的是整個行的長度,arr[0].length(或者arr[1].length)代表的是列的長度。知道這個之后就可以遍歷二維數組的內容了,
2 二維數組的遍歷
(1)for循環進行遍歷
public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};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();}}運行結果
1 2 4
1 2 3
(2)for-each循環遍歷
public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};for (int[] ret:arr) {for (int x:ret) {System.out.print(x+" ");}System.out.println();}}(3)調用Arrays
import java.util.Arrays;public class java1027 {public static void main(String[] args) {int[][] arr = {{1,2,4},{1,2,3}};System.out.println(Arrays.deepToString(arr));}運行結果
[[1, 2, 4], [1, 2, 3]]
3 不規則的二維數組
public class java1027 {public static void main(String[] args) {int[][] arr = new int[2][];arr[0]=new int[3];arr[1]=new int[2];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();}}運行結果
0 0 0
0 0
總結
以上是生活随笔為你收集整理的解析java中的数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解java方法与递归
- 下一篇: java中类与对象回顾总结