首頁 >Java >java教程 >Java學習總結之數組(整理分享)

Java學習總結之數組(整理分享)

WBOY
WBOY轉載
2022-04-01 12:01:332699瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於數組的相關問題,包括了為什麼要使用數組、數組的定義、數組的初始化以及數組的基本操作等等,希望對大家有幫助。

Java學習總結之數組(整理分享)

推薦學習:《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 什麼時候使用靜態初始化,什麼時候使用動態初始化呢?

當我們

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

當我們

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

longfloat

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

#資料類型

#初始值

#byte、short、int

#0

0L

#0F

#0F

##double

0.0D

#boolean
####false######################char###############'\ 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 9c7b11bfa3ff5f0940b8ea5c0821c84e 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 3f40d6801d52824bc5cc39707ea4ab57= 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 ed78c9b2c0c5a5caec46ff34a5fe5ba5= 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 fc94e68f7aa2711b3ffbc52bdc58654b语法糖。<p><strong>注意</strong>:语法糖的最大甜头就是让开发者写更少、更简单的代码,完成相同的功能。<span style="color:#4da8ee;"><strong>当我们在迭代数组元素的时候不关心数组的索引的时,首选使用foreach</strong></span>。当然咯,foreach远远没有本篇博客讲解的这么简单,星仔到时候带着大家在集合框架篇的时候再深入讲解foreach。</p><p style="text-align:center;"><img alt="" src="https://img.php.cn/upload/article/000/000/067/b9c206b202be8e9cc09cbc7b102a4161-37.png"></p><h2 id="5.2%20%E6%96%B9%E6%B3%95%E7%9A%84%E5%8F%AF%E5%8F%98%E5%8F%82%E6%95%B0">5.2 方法的可变参数</h2><p><strong>Java5的时候为什么要增加可变参数呢?我们来看一下以下的需求</strong></p><p>需求:编写一个方法,统计使用数组传递过来的总和。</p><p><img alt="" src="https://img.php.cn/upload/article/000/000/067/0ab0ceca8f5fec17090a4aca68d9e560-39.png"></p><p><strong>虽然说也是可以实现,但是我们心里肯定是不爽的,主要在于以下几点:</strong></p>
  • 为了求多个数之和,我们还得先创建一个数组来存储数据。
  • 如果多个数是变化的,比如求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学习教程

以上是Java學習總結之數組(整理分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除