------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!
-------
數組
一、數組介紹
數組就相當於一個容器,裏面存放相同數據類型的數據。和集合的最大區別是:數組長度固定。
二、數組初始化格式
①int[] arr=new int[3];//表示該數組存放了3個int類型的數據
這會有默認初始化值,均爲0;String類型的爲null。
③int[] arr=new int[]{3,5,6};//該數組存了3個int類型值。
②int[] arr={1,2,4,6};//表示數組裏面有4個int類型是值,分別是1,2,4,6
注意:要麼指明數組的大小,要麼指明數組的值,長度和值不能同時出現。
數組越界問題:
int[] arr=new arr[3];
system.out.println(arr[3]);
當數組下標超過數組長度減1(arr.length()-1)時,編譯不會出錯,但是當運行時,要爲數組分配空間,這
時數組並不存在該角標的值,會報告ArrayIndexOutOfBoundsException異常
空指針異常:
int[] arr=null;
system.out.println(arr[1]);
這時報告空指針NullPointException異常.
原因在於:引用沒有指向任何值,但卻還在操作實體。
三、數組遍歷
數組的長度:int length= arr.length();數組的角標都是從0開始,因此數組最後一個值的角標是length-1。
class Demo
{
public void printArray(){
// int[] arr=new int[]{1,2,4};
int[] arr=null;
//對數組進行遍歷,採用for循環
for(int x=0;x<arr.length;x++)
{
//獲取數組中每一個元素
System.out.println("arr["+x+"]="+arr[x]);
}
}
}
四、數組常見操作
a. 打印:system.out.println(arr);
打印結果:[I@de6ced
分析結果:這代表是數組類型的引用,你面存放int型數據。de6ced表示哈希值,即數組存放的內存地址。
b.獲取數組中元素的最值
思路:1.獲取最值,需要進行比較,由於最值不知道,因此定義一個臨時變量max賦值上0角標或者是數組第一 個元素。
2.遍歷數組,取得數組中每一個值,然後和max進行比較,若大於max ,那麼將max賦上新值,否則 max不變。
3.數組元素都比較完了最後的max 就是該數組最大值。
五、數組排序
a.選擇排序
圖例:
特點:先取得數組中第一個元素和後面所有元素進行比較,如大於後面的數,就互換位置。
再取第二個元素和數組後面所有元素比較
每一輪比較完後,都會產生一個最小值在數組頭角標上。
這是一個嵌套循環。
代碼實現:
public void selectSort()
{//選擇排序
int arr[]={2,1,5,3,7};
for(int x=0;x<arr.length-1;x++)//遍歷數組
{//arr.length-1數組最後一個元素不用再比較,否則數組越界,因爲沒有arr[length]這個元素
for(int y=x+1;y<arr.length;y++)
{//都是和後一個元素進行比較
if(arr[x]>arr[y])
{
int temp=arr[x];//第三方變量作爲中間轉換容器
arr[x]=arr[y];//最小值放在第一個位置。
arr[y]=temp;
}
}
}
}
b.冒泡排序
圖例:
特點:相鄰兩個元素進行比較,如果符合條件,就進行換位。
小值往前,大值往後。
一圈完成後,最大值在最後,所有第二圈最後一值可以不參加比較。
代碼實現:
public void buffleSort()
{//冒泡排序
int[] arr={1,3,2,8,5,0};
for(int x=0;x<arr.length-1;x++)//控制外循環,比較的圈數。
{
//每次進行比較時,都是第一個元素和第二個元素比較。
for(int y=0;y<arr.length-x-1;y++)
{//arr.length-x內循環在逐漸減小,所以後面的元素不用筆記
if(arr[y]>arr[y+1])
{
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
}
補充:a.排序最快的是希爾排序。
b.當數組元素較多時,要考慮排序的效率和性能。
c.在堆內存中換位置是比較消耗資源。因此做好是先把要換位置的元素角標在棧內存中記錄下來,當比較完後,最後在換位置。
d.不管是選擇排序還是冒泡排序,都用到了位置置換,那麼可以把此功能封裝函數,以便複用。
六、進制轉換
a.十進制-二進制
原理:除2模2的過程。
結果是要倒敘的,才符合二進制。
代碼體現:
public void toBin(int num)
{//十進制轉換二進制
//用StringBuffer存儲結果,再將其反轉,就是所求數的二進制
StringBuffer sb=new StringBuffer();
while(num>0)
{
sb.append(num%2);//取的模2的值
num=num/2;//不斷除2,然後再模2
}
sb.reverse();//最後將其反轉,得到二進制
}
b.十進制-十六進制
原理:先拿數與上15,然後進行右移4的操作。(無符號右移>>>高位補上0)
圖例:
代碼體現:
public void toHex(int num)
{ //十進制轉換十六進制
//用StringBuffer存儲結果,再將其反轉,就是所求數的十六進制
StringBuffer sb=new StringBuffer();
for(int x=0;x<8;x++){////4字節總共32位,十六進制是4位一組,因此是8
int temp=num & 15;//先進行與比較,存到臨時變量中
if(temp>9) //十六進制在9之後的數用字母表示。
sb.append((char)(temp-10+'A'));
//12-10=2+‘A’=67轉換成字母就是C
else
sb.append(temp);
num=num>>>4;//右移4位
}
sb.reverse();
}
c.查表法
原理:將所有元素臨時存儲起來,並建立好聯繫。每次與上15之後的值作爲索引取查之前建立好的表,然後獲得對應的元素。
補充:字符數組初始化的值是"\u0000",就是一個空格。
代碼體現:
public void toHex2(int num)
{
char[] ch={'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'c','D','E','F'};//建立起表的對應關係
//定義一個臨時容器
char[] arr=new char[8];//4字節總共32位,十六進制是4位一組,因此是8組
int pos=arr.length;//定義一個指針
while(num!=0)//這個判斷可以除去0值。只取有效位。
{
int temp=num & 15;
arr[--pos]=ch[temp];//將與上的數最爲角標查表,倒着存
num=num>>>4;
}
}
public void trans(int num,int base,int offset)
{
//base是要相與的數 offset是要移位的數
if(num==0)
return ;
char[] ch={'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'c','D','E','F'};//建立起表的對應關係
char[] arr=new char[32];//int型元素是4字節32位
int pos=arr.length;
while(num!=0)
{
int temp=num & base;
arr[--pos]=ch[temp];
num=num>>>offset;
}
}
七、二維數組
概述:二維數組可以看出是一維數組,只不過該數組中存放的元素是數組。
初始化:int[][] arr=new int[2][];//數組的行數一定要指定,能省略的是列數。
原理:二維數組存放的是數組的引用。每個實體都有地址值。
圖例: