搜尋
首頁Javajava教程Java數組的基本操作

Java數組的基本操作


一、為什麼要使用陣列以及陣列的定義

1.1 為什麼使用陣列

問題1:

宣告變數時,每個單獨的變數都要對應一個變數名,但現在要處理一組相同類型的資料時,如要表示班上100個人的年齡,絕對不希望定義100個變數來表示每個人的年齡,那怎麼辦呢?再看下列例子。

int age = 17;//表示一個年齡

問題2:

求兩個數和,需要一個方法,求5個數字和,需要重載一個方法,求100個數和、1000個數之和、10000個數之和,方法的參數列表會很長很長,而且方法得有很多個,而且還得去記住哪個方法是兩個參數的,哪一個方法是三個參數的。這樣總覺得很不爽,仔細分析這個功能,其實就是求一組數值的和而已,這個方法並不在乎具體是多少個加數,它只在乎需要把哪些數加起來。

大師的建議:定義方法的形參時,最好不好超過5個。

1.2 什麼是陣列

簡單來講就是一組數據,一堆數據。所謂數組是在程式設計中為了處理方便,把具有相同類型的若干變數按有序的形式組織起來的一種資料形式。這些按一定順序排列的同類型資料的集合稱為數組。而數組中的每一個資料稱為數組元素,數組中的元素以索引來表示其存放的位置,索引從0開始,步長是1,有點像Excel表格的行號逐行遞增。

Java數組的基本操作

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

圖解數組靜態初始化操作及重新賦值操作

Java數組的基本操作

2.2 陣列的動態初始化

由我們來設定陣列的元素個數(陣列長度),而每一個陣列元素的初始值由系統決定。

語法:

陣列元素類型[]  陣列名稱= new  陣列元素類型[ length ];

#範例:

    int[] ages = new  int[
100
];

注意:int[] nums = new  int[5]{1,3,5,7,9};/ /寫法是錯誤的。 不能同時使用靜態初始化和動態初始化

2.3 什麼時候使用靜態初始化,什麼時候使用動態初始化呢?

當我們事先知道需要儲存哪一些資料的時候,選用靜態初始化;

當我們事先不知道,需要儲存哪些資料的時候,只能使用動態初始化;

Java中為資料類型設定了初始值,如下圖:

char

#資料型別

#初始值

byte、short、int

0

long

0L

float

0F

#double

0.0D

boolean

#false

##false

############'\u0000'(表示空)################## ###引用資料型別###############null################

三、数组基本操作(一维数组)

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

Java數組的基本操作

我们不喜欢,我们想打印数组的时候,把该数组的元素打印出来,这时需要循环遍历打印

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个循环嵌套。

Java數組的基本操作

五、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。

Java數組的基本操作

5.2 方法的可变参数

Java5的时候为什么要增加可变参数呢?我们来看一下以下的需求

需求:编写一个方法,统计使用数组传递过来的总和。

Java數組的基本操作

虽然说也是可以实现,但是我们心里肯定是不爽的,主要在于以下几点:

  • 为了求多个数之和,我们还得先创建一个数组来存储数据。

  • 如果多个数是变化的,比如求3个数之和变成求5个数之和.......,还得去修改定义数组,但是数组是定长的。

那如果要解决该问题该怎么办呢?这个时候就需要引入Java5的另一个新特性:方法的可变参数(说的是参数的个数可变)

注意:

  • 方法的可变参数其实也是一个语法糖,是编译器级别的新特性。主要是为了让开发者写代码更简单。

  • 方法的可变参数其底层是就是一个数组类型

  • 可变参数必须作为方法的最后一个参数,避免参数的歧义性。

  • 一个方法最多只有一个可变参数

Java數組的基本操作

六、数组元素拷贝

数组拷贝:从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

  • 从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。

  • 被复制的组件的编号等于 length 参数。

  • 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。

数组拷贝操作是经常使用到的,SUN就直接把数组的拷贝操作存放在JDK中的System类中

Java數組的基本操作

Object:Java语言中的根类。是所有类的老祖宗。Object可以表示任意数据类型。

该方法没有方法体,该方法使用了native修饰符(本地方法)。该方法底层使用了C/C++语言实现了,Java直接调用其他语言编写好的功能

arraycopy 方法使用方式

System.arraycopy(src, 2, dest, 5, 4);

查阅API文档了(Java的帮助文档/好比字典),在什么类中有什么功能的方法即可。文档在手,天下我有!

Java數組的基本操作


以上是Java數組的基本操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。