您好,登錄后才能下訂單哦!
這篇“Java數組的基本操作有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java數組的基本操作有哪些”文章吧。
問題1:
聲明變量時,每一個單獨的變量都要對應一個變量名,但現在要處理一組相同類型的數據時,如要表示班上100個人的年齡,絕對不希望定義100個變量來表示每個人的年齡,那怎么辦呢?再看下列例子。
int age = 17;//表示一個年齡
問題2:
求兩個數之和,需要一個方法,求5個數之和,需要重載一個方法,求100個數之和、1000個數之和、10000個數之和,方法的參數列表會很長很長,而且方法得有很多個,而且還得去記住哪個方法是兩個參數的,哪個方法是三個參數的。這樣總感覺很不爽,仔細分析這個功能,其實就是求一組數值的和而已,這個方法并不在乎具體是多少個加數,它只在乎需要把哪些數加起來。
大師的建議:定義方法的形參時,最好不好超過5個。
簡單來講就是一組數據,一堆數據。所謂數組是在程序設計中為了處理方便,把具有相同類型的若干變量按有序的形式組織起來的一種數據形式。這些按一定順序排列的同類型數據的集合稱為數組。而數組中的每一個數據稱之為數組元素,數組中的元素以索引來表示其存放的位置,索引從0開始,步長是1,有點像Excel表格的行號逐行遞增。
方式1(推薦使用): 數組元素的類型[] 數組名; eg:int[] ages;
可以把int[]看成是一種數據類型,int類型的數組類型。
方式2:數組元素的類型 數組名[]; eg: int ages[];
注意:數組必須先初始化才能使用。因為初始化表示在內存中分配空間。
Java中數組必先初始化后才能使用,所謂初始化就是給數組元素分配內存,并為每個元素賦初始值。
初始化數組的兩種方式分為靜態初始化、動態初始化;無論以哪種方式初始化數組一旦初始化完成,數組的長度就固定了,除非重新初始化。也就是說數組是定長的。
數組是定長的:數組一旦初始化成功,數組中的元素個數就已經固定了,不能更改。如果需要更改,只能重新做初始化。
由我們自己來為每一個數組元素設置初始化值,而數組的長度由系統(JVM)決定。
語法:
數組元素類型[] 數組名 = new 數組元素類型[]{元素1,元素2,元素3,.......};
舉例:
int[] nums = new int[]{1,3,5,7,9};
簡單寫法,必須聲明之后立刻初始化,不能先聲明后初始化; int[] nums = {1,3,5,7,9};
圖解數組靜態初始化操作及重新賦值操作
由我們來設置數組的元素個數(數組長度),而每一個數組元素的初始值由系統決定。
語法:
數組元素類型[] 數組名 = new 數組元素類型[ length ];
舉例:
int[] ages = new int[ 100 ];
注意:int[] nums = new int[5]{1,3,5,7,9};//寫法是錯誤的。不能同時使用靜態初始化和動態初始化。
當我們事先知道需要存儲哪一些數據的時候,選用靜態初始化;
當我們事先不知道,需要存儲哪些數據的時候,只能使用動態初始化;
Java中給數據類型設定了初始值,如下圖:
數據類型 | 初始值 |
byte、short、int | 0 |
long | 0L |
float | 0F |
double | 0.0D |
boolean | false |
char | ’\u0000‘ (表示空) |
引用數據類型 | null |
獲取元素: 元素類型 變量 = 數組名[index];
設置元素: 數組名[index] = 值;
遍歷數組元素: 建議使用for循環,因為for循環事先知道循環的次數。
數組長度: int len = 數組名.length; length是屬性,不是方法.
索引范圍: 從0開始,逐一遞增。 [0,數組名.length-1]
NullPointerException:空指針異常(空引用)。
出現該異常的原因:當數組還未初始化,就直接操作數組
如以下代碼:
String[] bs = null; System.out.println(bs.length)
ArrayIndexOutOfBoundsException:數組的索引越界異常。
出現該異常的原因:根據索引取出數據元素時,輸入了超出數組索引范圍之外的值。
如下代碼:
int[] nums = {1,3,5,7,9}; int a = nums[4];
/** * 求數組最大值 * * @param nums * @return */ public static int getMax(int[] nums) { int result = 0; for (int i = 0; i < nums.length; i++) { int num = nums[i]; if (result < num) { result = num; } } return result; } /** * 求數據最小值 * * @param nums * @return */ public static int getMin(int[] nums) { int result = 0; for (int i = 0; i < nums.length; i++) { int num = nums[i]; if (i == 0) { result = num; } if (result > num) { result = num; } } return result; }
當我們直接使用System.out.println()打印數組的時候,打印出來是hashCode值,如
int[] nums = new int[]{1, 3, 5, 7, 9}; System.out.println(nums);
我們不喜歡,我們想打印數組的時候,把該數組的元素打印出來,這時需要循環遍歷打印
int[] nums = new int[]{1, 3, 5, 7, 9}; for (int i = 0; i < nums.length; i++) { System.out.print(nums[i] + " "); }
但是呢,每次想打印數據中的元素都還要循環遍歷一遍,好麻煩啊! 有沒有更好的方式呢?其實不用著急,Java前輩們已經幫我們想到了這一點了,我們只需要調用Arrays.toString()方法就能夠對數組進行打印。
例子:原數組[A, B, C, D, E],要求對該數組進行逆序操作得到新數組:[E, D, C, B, A]。
public static String[] reversedOrder(String[] nums) { String[] result = new String[nums.length]; int index = 0; for (int i = nums.length - 1; i >= 0; i--) { result[index] = nums[i]; index++; } return result; }
數組的線性搜索指得就是挨個遍歷,查找數組中與key相同的元素,若查找不到則可以返回-1(慣例,自定義),其效率為O(n)。
例子:int[] arr = {10,20,30,10,50,-30,10};獲取元素10在arr數組中第一次出現的索引和最后一次出現的索引
/** * 獲取數組中指定元素第一次出現的索引 * * @param nums * @param element * @return */ public static int indexOf(int[] nums, int element) { for (int i = 0; i < nums.length; i++) { if (element == nums[i]) { return i; } } return -1; } /** * 獲取數組中指定元素最后一次出現的索引 * * @param nums * @param element * @return */ public static int lastIndexOf(int[] nums, int element) { for (int i = nums.length - 1; i >= 0; i--) { if (element == nums[i]) { return i; } } return -1; }
在前面的文章中我們有提到數組其實就是是多個數據的集合。如果現在有多個數組,我想把多個數組保存在一個集合中,此時我又應該如何完成呢?此時就需要引入多維數組的概念。多維數組其實就是把整個數組看成一個元素,存放到另一個數組當中去。
多維數組的語法:
數組元素類型[] 數組名;
例如如下定義二維數組的格式:
int[][] arr = new int[][] { arr1 ,arr2,arr3 }; int[][] arr = new int[][] { {1,2,3} , {4,5}, {6} };
一維數組:數組中的每一個元素都是一個值(基本類型和引用類型的值);
二維數組:數組中的每一個元素又是一個一位數組;
三維數組:數組中的每一個元素又是一個二維數組;
注意:嚴格上說在Java中不存在多維數組的概念。為了和C語言做區分一般稱之為數組中的數組。
靜態初始化:
int[][] arr = new int[][] {
{1,2,3} ,
{4,5},
{6}
};
動態初始化:
int[][] arr = new int[3][5] ;//創建一個長度為3的二維數組,每一個元素(一維數組)的長度為5。
針對于N維數組,需要N個循環嵌套。
Java5對數組的新語法支持主要是增強for循環(foreach)和方法的可變參數。
在之前我們使用for循環的打印元素操作如下
int[] nums = new int[]{1, 3, 5, 7, 9}; for (int i = 0; i < nums.length; i++) { System.out.println(nums[i]); }
其實我們在使用循環迭代數組的時候,往往是不關心迭代變量(數組的索引)。那在Java中有沒有更好的方式,在迭代數組元素的時候就只操作數組元素,不去操作數組的索引呢?其實是有的。
從Java5開始(JDK1.5)開始,Java提供了一種新的語法:增強for循環(foreach)。
語法:
for(數組元素類型 變量 : 數組名)
{
循環體
}
我們通過反編譯工具查看字節碼,會發現foreach其實在底層依然是使用for循環+索引來操作數組的。我們把增強for循環稱之為編譯器的新特性---->語法糖。
注意:語法糖的最大甜頭就是讓開發者寫更少、更簡單的代碼,完成相同的功能。當我們在迭代數組元素的時候不關心數組的索引的時,首選使用foreach。當然咯,foreach遠遠沒有本篇博客講解的這么簡單,星仔到時候帶著大家在集合框架篇的時候再深入講解foreach。
Java5的時候為什么要增加可變參數呢?我們來看一下以下的需求
需求:編寫一個方法,統計使用數組傳遞過來的總和。
雖然說也是可以實現,但是我們心里肯定是不爽的,主要在于以下幾點:
為了求多個數之和,我們還得先創建一個數組來存儲數據。
如果多個數是變化的,比如求3個數之和變成求5個數之和.......,還得去修改定義數組,但是數組是定長的。
那如果要解決該問題該怎么辦呢?這個時候就需要引入Java5的另一個新特性:方法的可變參數(說的是參數的個數可變)
注意:
方法的可變參數其實也是一個語法糖,是編譯器級別的新特性。主要是為了讓開發者寫代碼更簡單。
方法的可變參數其底層是就是一個數組類型。
可變參數必須作為方法的最后一個參數,避免參數的歧義性。
一個方法最多只有一個可變參數。
數組拷貝:從指定源數組中復制一個數組,復制從指定的位置開始,到目標數組的指定位置結束。
從 src 引用的源數組到 dest 引用的目標數組,數組組件的一個子序列被復制下來。
被復制的組件的編號等于 length 參數。
源數組中位置在 srcPos 到 srcPos+length-1 之間的組件被分別復制到目標數組中的 destPos 到 destPos+length-1 位置。
數組拷貝操作是經常使用到的,SUN就直接把數組的拷貝操作存放在JDK中的System類中。
Object:Java語言中的根類。是所有類的老祖宗。Object可以表示任意數據類型。
該方法沒有方法體,該方法使用了native修飾符(本地方法)。該方法底層使用了C/C++語言實現了,Java直接調用其他語言編寫好的功能。
arraycopy 方法使用方式:
System.arraycopy(src, 2, dest, 5, 4);
查閱API文檔了(Java的幫助文檔/好比字典),在什么類中有什么功能的方法即可。文檔在手,天下我有!
以上就是關于“Java數組的基本操作有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。