數組的基礎
什么是數組呢?
數組指的是一種容器,可以用來存儲同種數據類型的多個值數組的初始化
初始化:就是在內存中,為數組容器開辟空間,并將數據存入容器中的過程。
數組初始化的兩種方式:靜態初始化,動態初始化
數組的靜態初始化
初始化:
就是在內存中,為數組容器開辟空間,并將數據存入容器中的過程
完整格式:數據類型[數組名=hew數據類型]{元素1,元素2,元素3..: );
范例:int[]array=newint[]{11,22,33};
編輯
范例:double[]arrav2=new double[]{11.1.22.2.33.3}:格式:
直接輸出:
輸出的就是地址值:
其中,[表示這個是個數組,D表示是double的類型的數組,后面的就是相當于是地址值
訪問數組:
修改對應的數組值:
//2.把數據存儲到數組當中
//格式:數組名[索引]=具體數據/變量;
//細節:一旦覆蓋之后,原來的數據就不存在了。
arr[0] = 100;
System.out.println(arr[0]);//100獲取對應的元素值:
結果:
數組的長度獲取:
//在Java當中,關于數組的一個長度屬性,length
//調用方式:數組名.length
定義一個數組,存儲1,2,3,4,5,遍歷數組得到每一個元素,求數組里面所有的數據和
定義了一個sum,把值取出來存儲在sum里面就可以了
把數組中的值取出來,模3,滿足條件--count++
//i表示數組里面的每一個索引
//arr[i]表示數組里面的每一個元素
//3.判斷當前的元素是否為3的倍數,如果是那么統計變量最就需要自增一次
變化數據:定義一個數組:存儲1,2,3,4,5,6,7,8,9,10,遍歷數組得到每一個元素
要求:
1,如果是奇數,則將當前數字擴大兩倍
2,如果是偶數,則將當前數字變成二分之一
字符串類型的:
//數組默認初始化值的規律
//整數類型:默認初始化值0
//小數類型:默認初始化值0.0
//字符類型:默認初始化值'/u0000'空格
//布爾類型:默認初始化值false
//引用數據類型:默認初始化值null//格式:
//數據類型[]數組名=new數據類型[數組的長度];
//在創建的時候,由我們自己指定數組的長度,由虛擬機給出默認的初始化值
當訪問了數組中不存在的索引,就會引發索引越界異常。
分析:
每次的max都會被記錄,讓后面的值與之相比:
//1.定義數組用來存儲5個值
int[] arr = {33,5,22,44,55};
//2.定義一個變量max用來存儲最大值
//臨時認為0索引的數據是最大的
int max=arr[0];
//3.循環獲取數組中的每一個元素
//拿著每一個元素跟max進行比較
for(inti=0;i<arr.length;i++){
//i 索引 arr[i] 元素
if(arr[i] > max){
max =arr[i];
//4.當循環結束之后,max記錄的就是數組中的最大值
System.out.println(max);//55
進階
?1.數組是一段連續的內存空間,因此支持隨機訪問,即通過下標訪問快速訪問數組中任意位置的元素
2.下標從0開始,介于[0,N)之間不包含N,N為元素個數又,不能越界,否則會報出下標越界異常。int[] array = {1, 2, 3};
System.out.println(array[3]);//數組中只有3個元素,下標一次為為:012,array[3]下標越界
//執行結果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)
遍歷數組的方式:
for-each 是 for 循環的另外一種使用方式. 能夠更方便的完成對數組的遍歷. 可以避免循環條件和更新語句寫錯
內存是一段連續的存儲空間,主要用來存儲程序運行時數據的的。比如:
1.程序運行時代碼需要加載到內存
2.程序運行產生的中間數據要存放在內存
3.程序中的常量也要保存
4.有些數據可能需要長時間存儲,而有些數據當方法運行結束后就要被銷毀如果對內存中存儲的數據不加區分的隨意存儲,那對內存管理起來將會非常麻煩。比如
因此JVM也對所使用的內存按照功能的不同進行了劃分:
基本數據類型創建的變量,稱為基本變量,該變量空間中直接存放的是其所對應的值;
而引用數據類型創建的變量,一般稱為對象的引用,其空間中存儲的是對象所在空間的地址。
在上述代碼中,a、b、arr,都是函數內部的變量,因此其空間都在main方法對應的棧幀中分配。a、b是內置類型的變量,因此其空間中保存的就是給該變量初始化的值。array是數組類型的引用變量,其內部保存的內容可以簡單理解成是數組在堆空間中的首地址。引用變量并不直接存儲對象本身,可以簡單理解成存儲的是對象在堆中空間的起始地址。通過該 地址,引用變量便可以去操作對象 。有點類似 C語言中的指針,但是Java中引用要比指針的操作更簡單。所有的局部變量存儲在棧當中的? 局部變量存儲在棧當中!!
array這個引用指向了一個數組對象array[0]=9;通過array這個引用 訪問當前的這個對象的0下標
array.length通過array這個引用 訪問當前的這個對象的長度
分析
jvm的回收:
如果這個對象一直沒有人引用他此時就會被JVM自動回收?
int[] array2=null;
array2這個引用不指向任何對象
null在Java中表示"空引用",也就是一個不指向對象的引用.
int[]arr=null;
System.out.println(arr[0]);
//執行結果
Exception in thread "main"java.lang.NullPointerExceptionat Test.main(Test.java:6)
null的作用類似于C語言中的NULL(空指針),都是表示一個無效的內存位置.因此不能對
作.一旦嘗試讀寫,就會拋出NullPointerException.
注意:Java中并沒有約定null和0號地址的內存有任何關聯
看一下這兩個代碼的區別:是不是傳引用 就能夠 修改實參的值?
這里指向新的對象:
結論:一個引用不可能同時指向多個對象
總結:
1.int[array=null;代表這個引用不指向任何對象
2.array1=array2;代表array1這個引用指向了array2這個引用指向的對象
3.一個引用不可能同時指向2個對象如何輸出二維數組中的結果
二維數組也可以是不規則的: