前言javascript
本文主要是從容器概念到數組概念再到數組的三種定義以及各類狀況的數組內存分析,以及一些數組經常使用的遍歷以及反轉、取最大值等操做。旨在全面性瞭解java數組。 @[toc]java
在講數組以前,頗有必要來談談容器的概念 所謂容器就是將多個數據存儲到一塊兒,每一個數據稱爲該容器的元素。數組
生活中的容器:水杯,衣櫃,教室eclipse
所謂數組就是存儲數據長度固定的容器,保證多個數據的數據類型一致。ide
下面主要講解下數組的三種定義方式。ui
數據類型[] 數組名字 = new 數據類型 [長度]
;idea
舉例: 定義能夠存儲3個整數的數組容器,代碼如: int[] arr = new int[3]
spa
數據類型[] 數組名 = new 數據類型[]{元素1,元素2,元素3...}
;指針
舉例: 定義存儲1,2,3,4,5整數的數組容器。 int[] arr = new int[]{1,2,3,4,5}
;code
數據類型[] 數組名 = {元素1,元素2,元素3...};
舉例: 定義存儲1,2,3,4,5整數的數組容器 int[] arr = {1,2,3,4,5}
;
數組存儲的數據類型: 建立的數組容器能夠存儲什麼數據類型。 []
: 表示數組。 數組名字:爲定義的數組起個變量名,知足標識符規範,可使用名字操做數組 new
:關鍵字,建立數組使用的關鍵字。 數組存儲的數據類型: 建立的數組容器能夠存儲什麼數據類型。 [長度]:數組的長度,表示數組容器中能夠存儲多少個元素。 注意:數組有定長特性,長度一旦指定,不可更改。 和水杯道理相同,買了一個2升的水杯,總容量就是2升,不能多也不能少。
索引:從0
開始,索引 (index
)能夠訪問到數組中的元素。
格式: 數組名[索引]
數組長度屬性: 數組長度是固定的,因爲索引從0開始,因此數組的最大索引值爲數組名.length-1
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印數組的屬性,輸出結果是5
System.out.println(arr.length);
}
複製代碼
在講數組的原理內存前,必須瞭解的一個叫內存的概念。
內存是計算機中的重要原件,臨時存儲區域,做用是運行程序。咱們編寫的程序是存放在硬盤中的,在硬盤中的程 序是不會運行的,必須放進內存中才能運行,運行完畢後會清空內存。 Java虛擬機要運行程序,必需要對內存進行空間的分配和管理。
爲了提升運算效率,就對空間進行了不一樣區域的劃分,由於每一片區域都有特定的處理數據方式和內存管理方式。
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//[I@5f150435
}
複製代碼
以上方法執行,輸出的結果是[I@5f150435
,這個是什麼呢?是數組在內存中的地址。new
出來的內容,都是在堆內存中存儲的,而方法中的變量arr
保存的是數組的地址。
輸出arr[0]
,就會輸出arr保存的內存地址中數組中0索引上的元素,如沒有具體肯定值,則是類型的默認值!好比:
String[] arr=new String[3];
System.out.println(arr); // [Ljava.lang.String;@1b6d3586
System.out.println(arr[0]); // null
int[] arrInt=new int[3];
System.out.println(arrInt); // [I@1b6d3586
System.out.println(arrInt[0]); // 0
複製代碼
public static void main(String[] args) {
int[] arr = new int[3];
int[] arr2 = new int[2];
System.out.println(arr);
System.out.println(arr2);
}
複製代碼
public static void main(String[] args) {
// 定義數組,存儲3個元素
int[] arr = new int[3];
//數組索引進行賦值
arr[0] = 5;
arr[1] = 6;
arr[2] = 7;
//輸出3個索引上的元素值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//定義數組變量arr2,將arr的地址賦值給arr2
int[] arr2 = arr;
arr2[1] = 9;
System.out.println(arr[1]);
}
複製代碼
數組常見的異常主要有數組越界異常
以及空指針異常
,這是很是基礎的,就很少作介紹了,這裏主要分析下空指針異常在內存的狀況
所謂數組遍歷 就是將數組中的每一個元素分別獲取出來,就是遍歷。遍歷數組很是重要!!!
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
}
複製代碼
以上代碼是能夠將數組中每一個元素所有遍歷出來,可是若是數組元素很是多,我把這種方式叫作傻瓜式遍歷,這種傻瓜式寫法確定不行,所以咱們須要改 形成循環的寫法。數組的索引是 0
到 lenght-1
,能夠做爲循環的條件出現。以下
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i])
}
}
複製代碼
實現思路: 定義變量,保存數組0索引上的元素 遍歷數組,獲取出數組中的每一個元素 將遍歷到的元素和保存數組0索引上值的變量進行比較 若是數組元素的值大於了變量的值,變量記錄住新的值 數組循環遍歷結束,變量保存的就是數組中的最大值
真香警告:你們當心點,別被第一個和第二個婆娘給迷住了
代碼以下:public static void main(String[] args) {
int[] arr = { 5, 15, 2000, 10000, 100, 4000 };
//定義變量,保存數組中0索引的元素
int max = arr[0];
//遍歷數組,取出每一個元素
for (int i = 0; i < arr.length; i++) {
//遍歷到的元素和變量max比較
//若是數組元素大於max
if (arr[i] > max) {
//max記錄住大值
max = arr[i];
}
}
System.out.println("數組最大值是: " + max);
}
複製代碼
所謂反轉就是把數組元素位置顛倒過來
實現思想:數組最遠端的元素互換位置 實現反轉,就須要將數組最遠端元素位置交換 定義兩個變量,保存數組的最小索引和最大索引 兩個索引上的元素交換位置 最小索引++,最大索引--,再次交換位置 最小索引超過了最大索引,數組反轉操做結束
具體代碼以下
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
/*循環中定義變量min=0最小索引 max=arr.length‐1最大索引 min++,max‐‐ */
for (int min = 0, max = arr.length ‐ 1; min <= max; min++, max‐‐){
//利用第三方變量完成數組中的元素交換
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反轉後,遍歷數組
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i])
}
}
複製代碼
首先明確一點:數組做爲方法的返回值,返回的是數組的內存地址
public static void main(String[] args) {
//調用方法,接收數組的返回值
//接收到的是數組的內存地址
int[] arr = getArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i])
}
}
/* 建立方法,返回值是數組類型建立方法,返回值是數組類型 return返回數組的地址 */
public static int[] getArray() {
int[] arr = { 1, 3, 5, 7, 9 };
//返回數組的地址,返回到調用者
return arr;
}
複製代碼
方法的參數爲基本類型時,傳遞的是數據值. 方法的參數爲引用類型時,傳遞的是地址值.
分析下列程序代碼,計算輸出結果。
public static void main(String[] args) {
int a = 1; int b = 2;
System.out.println(a);
System.out.println(b);
change(a, b);
System.out.println(a);
System.out.println(b);
}
public static void change(int a, int b) {
a = a + b; b = b + a;
}
複製代碼
public static void main(String[] args) {
int[] arr = {1,3,5};
System.out.println(arr[0]);
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] arr) {
arr[0] = 200;
}
複製代碼
總結: 方法的參數爲基本類型時,傳遞的是數據值. 方法的參數爲引用類型時,傳遞的是地址值.
相信各位同窗已經將上面的代碼copy到eclipse或者idea中運行了,是否是結果很意外?並且對下面的總結不是很理解?這位童靴,我估計你多是忽略了這一點:數組是引用類型,數組自己元素類型沒有影響的,就像數組元素全是int,數組依舊是引用類型,哈哈,小白同窗真可愛 ~中槍了咩,中槍的話點個讚唄支持支持下,關注樓主,樓主帶你學java,關注樓主不迷路hhhhh~
歡迎各位關注個人公衆號,一塊兒探討技術,嚮往技術,追求技術...