java基礎——數組操作

高級數組
main方法是static修飾的,說明直接使用Hello類調用即可
在底層是JVM通過Hello.main(實參);
main方法的String數組參數,實際是保留給程序運行者的,給程序傳遞一個數據
方法類型的值傳遞值之基本數據類型
Change方法執行完畢後change的棧幀被銷燬,而main方法棧幀中的x仍然爲10
方法類型的值傳遞值機制之引用數據類型

無論是基本類型還是引用數據類型,用的都是值傳遞方法
基本類型傳遞的是的副本,引用類型傳遞的是地址的副本

數組的語法:
數組元素類型[] 數組名:
Int[][] arr = new int[][]{arr1,arr2,arr3};
-----------------------------------------
一維數組:數組中的每一個元素都是一個值(基本類型和引用類型的值).
二維數組:數組中的每一個元素都是一個一維數組.
三維數組:數組中的每一個元素都是一個二維數組.
-------------------------------------------
嚴格上說,在java中不存多維數組的概念,和c區分,一般稱爲數組中的數組.

Int [][] arr = new int[][]{
{1,2,3},
{2,3},
{5}
}
針對於n維數組需要n維嵌套.
-----------------------------------------------------------------------------------------------
Java5對數組的新語法支持
  1. 增強for循環foreach
  2. 方法的可變參數
其實我們在使用循環迭代數組的時候,往往是不關心迭代變量(數組索引)
有沒有更好的方法迭代數組元素的時候就只操作數組元素,不操作數組的索引

Java5開始(jdk1.5)開始,java提供了一種新的語法:增強for循環(foreach)
語法:
For(數組元素變量 類型:數組名)
{
循環體

}
------------------------------
通過反編譯工具查看字節碼,foreach在底層依然就是使用for循環+索引來操作數組的
我們把增強for循環,稱之爲編譯器的新特性--->叫做語法糖.
語法糖的最大甜頭,就是讓開發者寫更少,更簡練的語句

方法的可變參數:
需求:編寫一個方法,統計使用數組傳過來的總和.

不足的地方:
  1. 爲了求多個數之和,害的先創建一個數組來存儲數據.
  2. 如果多個數是變化的,比如求三個之和變成求五個之和,還得修改數組
期望是這樣調用的:
要解決該問題:必須使用java5的另一個新特性,方法的可變參數(個數可變)

反編譯結果:
------------------
所謂的方法的可變參數也 只是一個語法糖,編譯器級別的新特性
方法的可變參數底層是一個數組
--------------------------------------------------------------------------------
Int類型的數組元素拷貝
int[] src = new int[]{1,2,3,4,5,6,7,8,9,10};//源素組
int[] des = new int[10];
//需求:從src拷貝3,4,5到des數組中
static void copy(int[] src ,int[] des, int srcPos , int desPos, int length)
/*參數
src 源數組
des 目的數組
srcPos 從源數組的哪一個索引位置開始
desPos 在目標數組中的哪一個索引位置開始粘貼
length 拷貝元素的個數
*/
代碼存在問題:
(1)只能拷貝int類型的數組;
(2)代碼不夠健壯


定義一個數組元素的拷貝方法,支持任意類型的數組元素拷貝操作(反射)
數組拷貝操作是經常使用到的,SUN就直接把數組的拷貝操作放在JDK中的system類中

Object:java語言中的根類,老祖宗類,object可以表示任意的數據類型
該方法沒有方法體,該方法使用了native修飾符(本地方,該方法底層使用了C/C++實現了,java直接調用其他語言編寫好的)
查閱api文檔
排序:
按照一定順序進行排序
升序:從小到大
降序:從大到小
------------------------------
排序的分類
選擇排序(直接選擇排序,堆排序)
交換排序(冒泡排序,快速排序)
插入排序(直接插入排序,二分法插入排序,shell排序)
歸併排序等

若有下列int類型的數組需要排序:
Int[] arr={2,9,5,7,4,1};

  1. 冒泡排序
這是最簡單的排序方法,基本思路:對未排序的元素從頭到尾依次標記相鄰的兩個元素的大學關係,若左邊大於右邊則交換順序,第一輪可以得出最大的值,然後用同一的而方法將剩下的元素逐個比較即可.
可以看出如有n個元素,那麼一共需要n-1次比較,第m輪需要進行n-m次比較

static void bubbleSort(int[] arr)
{
for(int times = 1; times <= arr.length - 1 ; times ++)
{
for(int index = 1; index <= arr.length - times; index++)
{
if(arr[index - 1] > arr[index])
{
swap(arr, index - 1, index);
}
}
}
}
  1. 選擇排序(selection sort):
基本思路:選擇某個索引位置的元素,然後後河面元素依次比較,若大於則交換位置,經過第一輪比較排序後可以得出最小值,然後使用同一的方法把剩下的元素逐個比較即可
可以看出選擇排序,第一輪會選出最小值,第二輪選出第二小的值,直到最後.
第一輪從arr[0]和後面的元素比較,第二輪從arr[1]和後面的元素比較,依次類推,n個數需要進行N-1輪,選擇排序每一輪值進行一次交換,相對於冒泡排序效率高一點.

數組的搜索算法:從指定的數組中去搜索某一個元素的索引是多少.
方式一:線性搜索(從頭到尾/從尾到頭):indexof/lastindexof
對於元素過多的數組,性能極低:有n個元素,循環次數= (N+1)/2
方式二:二分搜索/二分查找
前提:數組元素必須有序.
-------------------
算法:當數據量很大適宜採用二分法,數據需是排好的
猜數遊戲:
1到100之間的一個數,要你猜

數組的算法操作,使用太頻繁,SUN公司提供了數組工具Arrays
java.util.Arrays.sort(arr,2,6);//排序操作.(前閉後開,對2到5操作,6開始不再操作)

在java源代碼裏可以查看到具體實現和底層調用



 說明:本文乃學習整理參考而來.

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