Java數組的基本操作
一、為什麼要使用陣列以及陣列的定義
1.1 為什麼使用陣列
問題1:
宣告變數時,每個單獨的變數都要對應一個變數名,但現在要處理一組相同類型的資料時,如要表示班上100個人的年齡,絕對不希望定義100個變數來表示每個人的年齡,那怎麼辦呢?再看下列例子。
int age = 17;//表示一個年齡
問題2:
求兩個數和,需要一個方法,求5個數字和,需要重載一個方法,求100個數和、1000個數之和、10000個數之和,方法的參數列表會很長很長,而且方法得有很多個,而且還得去記住哪個方法是兩個參數的,哪一個方法是三個參數的。這樣總覺得很不爽,仔細分析這個功能,其實就是求一組數值的和而已,這個方法並不在乎具體是多少個加數,它只在乎需要把哪些數加起來。
大師的建議:定義方法的形參時,最好不好超過5個。
1.2 什麼是陣列
簡單來講就是一組數據,一堆數據。所謂數組是在程式設計中為了處理方便,把具有相同類型的若干變數按有序的形式組織起來的一種資料形式。這些按一定順序排列的同類型資料的集合稱為數組。而數組中的每一個資料稱為數組元素,數組中的元素以索引來表示其存放的位置,索引從0開始,步長是1,有點像Excel表格的行號逐行遞增。
1.3 陣列的定義
方式1(建議使用): 陣列元素的型別[] 陣列名稱; eg:int [] ages;
可以把int[]看成是一種資料型,int型別的陣列型別。
方式2:陣列元素的型別 陣列名稱[]; eg: int ages[];
注意:陣列必須先初始化才能使用。因為初始化表示在記憶體中分配空間。
二、數組的初始化
Java中數組必先初始化後才能使用,所謂初始化就是給數組元素分配內存,並為每個元素賦初始值。
初始化數組的兩種方式分為靜態初始化、動態初始化;無論以哪種方式初始化數組一旦初始化完成,數組的長度就固定了,除非重新初始化。也就是說數組是定長的。
陣列是定長的:陣列一旦初始化成功,陣列中的元素個數就已經固定了,不能更改。如果需要更改,只能重新做初始化。
2.1 陣列的靜態初始化
由我們自己來為每個陣列元素設定初始化值,而陣列的長度由系統(JVM)決定。
語法:
陣列元素類型[] 陣列名稱= new 陣列元素類型[]{元素1,元素2,元素3,.......};
範例:
int[] nums = new int[]{1,3,5,7,9};
簡單寫法,必須宣告之後立刻初始化,不能先宣告後初始化; int[] nums = {1,3,5,7,9};
圖解數組靜態初始化操作及重新賦值操作
2.2 陣列的動態初始化
由我們來設定陣列的元素個數(陣列長度),而每一個陣列元素的初始值由系統決定。
語法:
陣列元素類型[] 陣列名稱= new 陣列元素類型[ length ];
#範例:
int[] ages = new int[ 100 ];
注意:int[] nums = new int[5]{1,3,5,7,9};/ /寫法是錯誤的。 不能同時使用靜態初始化和動態初始化。
2.3 什麼時候使用靜態初始化,什麼時候使用動態初始化呢?
當我們事先知道需要儲存哪一些資料的時候,選用靜態初始化;
當我們事先不知道,需要儲存哪些資料的時候,只能使用動態初始化;
Java中為資料類型設定了初始值,如下圖:
#資料型別 | #初始值 |
byte、short、int | 0 |
long | 0L |
float | 0F |
#double | 0.0D |
boolean | #false |
##false | |
三、数组基本操作(一维数组)
3.1 数组基本操作:
获取元素: 元素类型 变量 = 数组名[index];
设置元素: 数组名[index] = 值;
遍历数组元素: 建议使用for循环,因为for循环事先知道循环的次数。
数组长度: int len = 数组名.length; length是属性,不是方法.
索引范围: 从0开始,逐一递增。 [0,数组名.length-1]
3.2 操作数组常见异常:
NullPointerException:空指针异常(空引用)。
出现该异常的原因:当数组还未初始化,就直接操作数组
如以下代码:
String[] bs = null; System.out.println(bs.length)
ArrayIndexOutOfBoundsException:数组的索引越界异常。
出现该异常的原因:根据索引取出数据元素时,输入了超出数组索引范围之外的值。
如下代码:
int[] nums = {1,3,5,7,9}; int a = nums[4];
3.3 获取数组最大最小元素
/** * 求数组最大值 * * @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; }
3.4 打印数组元素
当我们直接使用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()方法就能够对数组进行打印。
3.5 逆序排列数组元素
例子:原数组[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; }
3.6 线性搜索:元素出现索引(第一次/最后一次)
数组的线性搜索指得就是挨个遍历,查找数组中与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} };
4.1 多维数组和一维数组的区别
一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值);
二维数组:数组中的每一个元素又是一个一位数组;
三维数组:数组中的每一个元素又是一个二维数组;
注意:严格上说在Java中不存在多维数组的概念。为了和C语言做区分一般称之为数组中的数组。
4.2 二维数组的初始化操作
静态初始化:
int[][] arr = new int[][] {
{1,2,3} ,
{4,5},
{6}
};
动态初始化:
int[][] arr = new int[3][5] ;//创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5。
针对于N维数组,需要N个循环嵌套。
五、Java5对数组的新语法支持
Java5对数组的新语法支持主要是增强for循环(foreach)和方法的可变参数。
5.1 增强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。
5.2 方法的可变参数
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數組的基本操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。
