??前面的話??
本篇文章帶大家認識Java陣列使用以及參考,我們都知道陣列中的元素型別都是相同的,這使它具有強大的相同資料型別處理能力,由此可知它有多么的重要,Java使用陣列與C語言還是存在差別的,從陣列定義方式就能看出來,讓我們來一探究竟吧,
📒博客主頁:未見花聞的博客主頁
🎉歡迎關注🔎點贊👍收藏??留言📝
📌本文由未見花聞原創,CSDN首發!
📆首發時間:🌴2021年10月30日🌴
??堅持和努力一定能換來詩與遠方!
💭參考書籍:📚《Java核心技術卷1》,📚《Java核心技術卷2》,📚《Java編程思想》
💬參考在線編程網站:🌐牛客網🌐力扣
🙏作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,
📌導航小助手📌
- 🎨1.Java陣列的基本用法
- 🎳1.1陣列的定義方式
- 🎳1.2陣列的創建與使用
- 🎨2.Java型別之參考
- 🎳2.1參考型別
- 🎳2.2陣列傳參
- 🎳2.3認識JVM區域劃分
- 🎨3.Java陣列應用
- 🎳3.1利用陣列求平均值與交換兩個數
- 🎳3.2拷貝陣列
- 🎳3.3陣列轉換字串
- 🎳3.4陣列查找
- ??3.4.1順序查找
- ??3.4.2二分查找
- 🎳3.5陣列的排列
- ??3.5.1判斷陣列是否有序
- ??3.5.2陣列逆序
- ??3.5.3冒泡排序(升序)
- 🎨4.二維陣列

🎨1.Java陣列的基本用法
🎳1.1陣列的定義方式
🍁方式1:
數
據
類
型
[
]
變
量
名
=
{
元
素
1
,
元
素
2
,
元
素
3
,
.
.
.
,
元
素
n
}
;
資料型別[]\ 變數名\ =\ \{元素1,元素2,元素3,...,元素n\};
數據類型[] 變量名 = {元素1,元素2,元素3,...,元素n};
i
n
t
[
]
a
r
r
=
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
}
;
int[]\ arr\ =\ \{1,2,3,4,5,6,7,8,9,0\};
int[] arr = {1,2,3,4,5,6,7,8,9,0};
🍁方式2:
數
據
類
型
[
]
變
量
名
=
n
e
w
i
n
t
[
]
{
元
素
1
,
元
素
2
,
元
素
3
,
.
.
.
,
元
素
n
}
;
資料型別[]\ 變數名\ =\ new\ int[]\{元素1,元素2,元素3,...,元素n\};
數據類型[] 變量名 = new int[]{元素1,元素2,元素3,...,元素n};
i
n
t
[
]
a
r
r
=
n
e
w
i
n
t
[
]
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
}
;
int[]\ arr\ =\ new\ int[]\{1,2,3,4,5,6,7,8,9,0\};
int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0};
??new后面那個中括號里面不能指定元素個數,必須是空的!
🍁方式3:
數
據
類
型
[
]
變
量
名
=
n
e
w
i
n
t
[
元
素
個
數
]
;
(
數
組
全
部
元
素
會
初
始
化
為
0
)
資料型別[]\ 變數名\ =\ new\ int[元素個數];\ (陣列全部元素會初始化為0)
數據類型[] 變量名 = new int[元素個數]; (數組全部元素會初始化為0)
🎳1.2陣列的創建與使用
🍁陣列的創建:
int[] data1 = {1,2,3,4,5,6,7,8,9,0};
int[] data2 = new int[]{1,2,3,4,5,6,7,8,9,0};
int[] data3 = new int[10];
🍁陣列的使用:
import java.util.Arrays;
public class TestBlog {
public static void main(String[] args) {
//創建陣列
int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0};
//訪問陣列長度
System.out.println(arr.length);
//訪問陣列元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//遍歷陣列 1.for回圈 2.foreach回圈 3.toString函式
//方式1:for回圈
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
//方式2:foreach回圈
for (int a: arr) {
System.out.print(a + " ");
}
System.out.println();
//方式3:toString函式
System.out.println(Arrays.toString(arr));
}
}
對于陣列遍歷方式2:
for (接受變數: 陣列) {
//陳述句塊;
//此方法不能獲取下標
}
對于遍歷方式3:
toString是JavaArrays類中的一個方法,能夠將陣列轉換成字串,有,隔開元素,中括號[]包裹陣列所有元素!

🎨2.Java型別之參考
🎳2.1參考型別
在Java當中陣列其實是一個物件,我們知道在陣列定義時有兩種方式都用到了關鍵字new,這個關鍵字就是實作類的實體化,實體出一個物件,使用一個能接收“實體化物件的值”的型別就是參考型別,這個“實體化物件的值”其實是一個地址,該地址指向該陣列(物件),比如下面定義的x變數定義一個陣列,這個x就是參考變數,這個與C語言中的指標有一點相似,但是它并不是指標,參考變數是一個值,在這里,該值是這個陣列的地址,我們知道我們所定義的x變數是區域變數所以它在堆疊上生成,而這個陣列(物件)是在堆上開辟記憶體的,
null表示空參考,與C語言中的NULL很相似,表示一個無效的記憶體位置,既然這個記憶體是無效的,那肯定就不能對這個記憶體指向的空間進行讀寫,注意: Java 中并沒有約定 null和 0 號地址的記憶體有任何關聯.
資料型別[] 變數名 = new int[元素個數]; (陣列全部元素會初始化為0)
int[] x = new int[3];
x[0] = 10;
x[1] = 20;
x[2] = 30;

所謂的 “參考” 本質上只是存了一個地址. Java 將陣列設定成參考型別, 這樣的話后續進行陣列引數傳參, 其實只是將陣列的地址傳入到函式形參中. 這樣可以避免對整個陣列的拷貝(陣列可能比較長, 那么拷貝開銷就會很大)
下面用一個陣列傳參的例子來進一步理解參考,
🎳2.2陣列傳參
public class TestBolg {
public static void arrFunc(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
arr[i] = 10 * (i+1);
}
}
public static void main(String[] args) {
int[] x = new int[3];
arrFunc(x);
System.out.println(Arrays.toString(x));
}
}



對于陣列的傳參就是將一參考變數的值傳遞給方法的形參,由于參考變數存的是物件的地址,所以方法會根據傳入的引數對陣列(實體化的物件)進行修改或讀寫操作,從而使陣列內元素的值發生改變,這就是參考傳遞,
🎳2.3認識JVM區域劃分


🎨3.Java陣列應用
🎳3.1利用陣列求平均值與交換兩個數
public class AvgSwap {
public static void swap(int[] data) {
int tmp = data[0];
data[0] = data[1];
data[1] = tmp;
}
public static double avg(int[] data) {
int sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return 1.0 * sum / data.length;
}
public static void main(String[] args) {
int[] swap = {22, 33};
int[] avg = {1,2,3,4,5,6,7,8,9,0};
System.out.println("資料交換前:a = " + swap[0] + ", b = " + swap[1]);
swap(swap);
System.out.println("資料交換后:a = " + swap[0] + ", b = " + swap[1]);
System.out.println("陣列平均值為:" + avg(avg));
}
}

🎳3.2拷貝陣列
import java.util.Arrays;
public class Copy {
public static int[] copy(int[] arr) {
if (arr == null) {
return null;
}
int[] copy = new int[arr.length];//新建一個陣列
for (int i = 0; i < arr.length; i++) {
copy[i] = arr[i];//遍歷拷貝
}
return copy;
}
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
System.out.println("陣列1:");
System.out.println(Arrays.toString(arr1));
int[] arr2 = copy(arr1);
System.out.println("陣列2:");
System.out.println(Arrays.toString(arr2));
}
}

當然Java中的Arrays類有內置的拷貝方法:
s
t
a
t
i
c
數
據
類
型
[
]
c
o
p
y
O
f
(
數
據
類
型
[
]
o
r
i
g
i
n
a
l
,
i
n
t
n
e
w
L
e
n
g
t
h
)
static\ 資料型別[]\ copyOf(資料型別[]\ original,\ int\ newLength)
static 數據類型[] copyOf(數據類型[] original, int newLength)
復制指定的陣列,用零截取或填充(如有必要),以便復制具有指定的長度,
s
t
a
t
i
c
數
據
類
型
[
]
c
o
p
y
O
f
R
a
n
g
e
(
數
據
類
型
[
]
o
r
i
g
i
n
a
l
,
i
n
t
f
r
o
m
,
i
n
t
t
o
)
static\ 資料型別[]\ copyOfRange(資料型別[]\ original,\ int\ from,\ int\ to)
static 數據類型[] copyOfRange(數據類型[] original, int from, int to)
將指定陣列的指定范圍[from, to)復制到新陣列中,
s
t
a
t
i
c
v
o
i
d
a
r
r
a
y
c
o
p
y
(
O
b
j
e
c
t
s
r
c
,
i
n
t
s
r
c
P
o
s
,
O
b
j
e
c
t
d
e
s
t
,
i
n
t
d
e
s
t
P
o
s
,
i
n
t
l
e
n
g
t
h
)
static\ void\ arraycopy(Object\ src,\ int\ srcPos,\ Object\ dest,\ int\ destPos,\ int\ length)
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Object src表示源陣列,srcPos表示從源陣列開始拷貝的下標位置,Object dest表示目標陣列,destPos表示表示從目標陣列開始拷貝的下標位置,length表示拷貝陣列元素個數,
如果細心去查看該方法源代碼,會發現該方法被native修飾,這個表示這個方法是使用C/C++實作的,
將指定源陣列中的陣列從指定位置復制到目標陣列的指定位置,
數
組
名
.
c
l
o
n
e
(
)
陣列名.clone()
數組名.clone()
最后一種就是利用陣列名.clone創建并回傳此物件的副本, “復制”的精確含義可能取決于物件的類,因為陣列實體化后就是一個物件,該方法會回傳值為對應型別的陣列,所以使用該方法進行拷貝,
import java.util.Arrays;
public class Copy {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
System.out.println("arr1:" + Arrays.toString(arr1));
int[] arr2 = Arrays.copyOf(arr1, arr1.length);
System.out.println("arr2:" + Arrays.toString(arr2));
int[] arr3 = Arrays.copyOf(arr1, arr1.length * 2);
System.out.println("arr3:" + Arrays.toString(arr3));
int[] arr4 = Arrays.copyOfRange(arr1, 1, 5);
System.out.println("arr4:" + Arrays.toString(arr4));
int[] arr5 = new int[arr1.length];
System.arraycopy(arr1, 0, arr5, 0, arr1.length);
System.out.println("arr5:" + Arrays.toString(arr5));
int[] arr6 = arr1.clone();
System.out.println("arr6:" + Arrays.toString(arr6));
}
}

另外,一般來說陣列的拷貝是淺拷貝,因為Java中萬物皆物件,對物件的拷貝就是淺拷貝,而陣列也是一種物件,除非人為因素使實作深拷貝,如果陣列中的為簡單的資料型別一般都是深拷貝,如果陣列中為參考型別一般都是淺拷貝,
🎳3.3陣列轉換字串
再上述代碼展示中我相信大家已經看到了Arrays.toString方法的使用,它能將一個陣列轉換成帶中括號字串!現在我們來模擬一下這個方法:
public class StringArray {
public static String myToString(int[] arr) {
if (arr == null) {
return "[]";//空參考回傳[]
}
String str = "[";//初始化字串為[
for (int i = 0; i < arr.length - 1; i++) {
str += arr[i] + ",";//注意最后一個陣列元素后無逗號
}
str += arr[arr.length - 1] + "]";//查漏補缺,補上最后一個元素和]
return str;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
System.out.println(myToString(arr));
}
}

🎳3.4陣列查找
??3.4.1順序查找
順序查找是最簡單的查找方法,直接遍歷一遍陣列就可以了,
public class Search {
public static void main(String[] args) {
//順序查找元素,找到其下標,未找到則輸出未找到
int[] arr = {1,2,3,4,5,6,7,8,9};
int k = 7;
int flag = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == k) {
System.out.println("找到了!下標為:" + i);
flag = 1;
break;
}
}
if (flag == 0) {
System.out.println("未找到!");
}
}
}

??3.4.2二分查找
然后就是我們已經非常熟悉的二分查找:
public class BinSearch {
public static int binSearch(int[] arr, int k) {
if (arr == null) {
return -1;
}
int left = 0;
int right = arr.length - 1;
int mid = left + (right - left) / 2;
while (left <= right) {
mid = left + (right - left) / 2;
if (k > arr[mid]) {
left = mid + 1;
}
else if (k < arr[mid]) {
right = mid - 1;
}
else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
int k = 7;
System.out.println(binSearch(arr, k));
}
}

🎳3.5陣列的排列
??3.5.1判斷陣列是否有序
使用兩個計數棋進行計數(從1開始計數),遍歷陣列分別對陣列前一項不小于后一項,陣列后一項不小于前一項獨立計數,如果計數結果有剛好等于陣列長度的結果則陣列有序,
public class ArraryOrder {
public static boolean arrOrder(int[] arr) {
if (arr == null) {
return false;
}
int cnt1 = 1;
int cnt2 = 1;
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] <= arr[i+1]) {
cnt1++;
}
if (arr[i] >= arr[i+1]) {
cnt2++;
}
}
if (cnt1 == arr.length || cnt2 == arr.length) {
return true;
}
else {
return false;
}
}
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
int[] arr2 = {9,8,7,6,5,4,3,2,1};
int[] arr3 = {2,1,4,7,5,9,8,3,6};
System.out.println(arrOrder(arr1));
System.out.println(arrOrder(arr2));
System.out.println(arrOrder(arr3));
}
}

??3.5.2陣列逆序
雙指標,依次將左邊元素與右邊元素互換,
import java.util.Arrays;
public class ReverseArr {
public static void rever(int[] arr) {
if (arr == null) {
return;
}
int l = 0;
int r = arr.length - 1;
while (l < r) {
int tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
l++;
r--;
}
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
System.out.println("逆序前:");
System.out.println(Arrays.toString(arr));
System.out.println("逆序后:");
rever(arr);
System.out.println(Arrays.toString(arr));
}
}

??3.5.3冒泡排序(升序)
從陣列首位元素開始將陣列的相鄰兩個元素進行比較,如果前面的元素比后面大,則進行交換否則不交換,每進行一趟排序就能將一個最大的數放在最后,如果需要把所有元素都排好序,需要進行陣列元素個數減一趟排序,因為每一趟排序都會排出一個最大的數放在后面,也就是說每排序一趟就有一個數排序完成,所以每完成一趟排序,排序比較次數就減一,假設陣列元素個數為size,則一共要進行size-1趟排序,第1趟排序比較次數為size-1,隨著趟數比較次數逐次遞減,如果此時為第i趟排序,則需要比較的次數為size - 1 - i,比如10個元素進行冒泡排序,一共要進行9趟排序,第一趟需排序比較9次,第二趟8次,第三趟7次,以此類推,
import java.util.Arrays;
public class BubbleSort {
public static void bubbleSort(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int flag = 0;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = 1;
}
}
if (flag == 0) {
break;
}
}
}
public static void main(String[] args) {
int[] arr = {2,1,8,5,9,4,6,7,3};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
bubbleSort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
}

🎨4.二維陣列
二維陣列本質上也就是一維陣列, 只不過每個元素又是一個一維陣列.

前面我們知道了,我們是使用參考來指向一個陣列的,那么二維陣列其實一個型別為參考的陣列,陣列中的每個元素都是一個參考變數,參考變數中指向另一個一維陣列,

二維陣列定義:
數 據 類 型 [ ] [ ] 數 組 名 稱 = n e w 數 據 類 型 [ 行 數 ] [ 列 數 ] { 初 始 化 數 據 } 資料型別[][]\ 陣列名稱\ =\ new\ 資料型別\ [行數][列數]\ \{ 初始化資料 \} 數據類型[][] 數組名稱 = new 數據類型 [行數][列數] {初始化數據}
陣列名稱.length;//表示行數
陣列名稱[行數].length;//表示某一行的列數
public class TestBolg {
public static void main(String[] args) {
int[][] arr = new int[3][3];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = 8 + i +j;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(Arrays.toString(arr[i]));
}
}
}

同理, 還存在 “三維陣列”, “四維陣列” 等更復雜的陣列,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342198.html
標籤:java
