黑馬程序員————java基礎----數組

------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;
		}
	}


                    d.封裝函數(進制轉換)

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][];//數組的行數一定要指定,能省略的是列數。

                 原理:二維數組存放的是數組的引用。每個實體都有地址值

                 圖例:

 

                       


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章