JavaSE學習筆記(7)---數組

来源:https://www.cnblogs.com/xjtu-lyh/archive/2020/02/10/12293277.html
-Advertisement-
Play Games

JavaSE學習筆記(7) 數組 1、什麼是數組 數組是相同類型數據的有序集合。數組描述的是相同類型的若幹個數據,按照一定的先後次序排列組合而成。其中,每一個數據稱作一個元素,每個元素可以通過一個索引(下標)來訪問它們。數組的三個基本特點: 1. 長度是確定的。數組一旦被創建,它的大小就是不可以改變 ...


JavaSE學習筆記(7)---數組

1、什麼是數組

數組是相同類型數據的有序集合。數組描述的是相同類型的若幹個數據,按照一定的先後次序排列組合而成。其中,每一個數據稱作一個元素,每個元素可以通過一個索引(下標)來訪問它們。數組的三個基本特點:

  1. 長度是確定的。數組一旦被創建,它的大小就是不可以改變的。
  2. 其元素必須是相同類型,不允許出現混合類型。
  3. 數組類型可以是任何數據類型,包括基本類型和引用類型。

提示

數組變數屬引用類型,數組也可以看成是對象,數組中的每個元素相當於該對象的成員變數。數組本身就是對象,Java中對象是在堆中的,因此數組無論保存原始類型還是其他對象類型,數組對象本身是在堆中存儲的

2、數組的聲明和初始化

聲明數組

type [] array = {}
//例如
int [] a = {1,2,3,4};
int [] b = new int[4];

註意事項

  1. 聲明的時候並沒有實例化任何對象,只有在實例化數組對象時,JVM才分配空間,這時才與長度有關。
  2. 聲明一個數組的時候並沒有數組真正被創建。
  3. 構造一個數組,必須指定長度。

創建基本類型一維數組

public class Test {
    public static void main(String args[]) {
        int[] s = null; // 聲明數組;
        s = new int[10]; // 給數組分配空間;
        for (int i = 0; i < 10; i++) {
            s[i] = 2 * i + 1;//給數組元素賦值;
            System.out.println(s[i]);
        } 
    }
}

基本類型數組記憶體分配圖

图7-1 基本类型数组内存分配图.png

創建引用類型一維數組

class Man{
    private int age;
    private int id;
    public Man(int id,int age) {
        super();
        this.age = age;
        this.id = id;
    }
}
public class AppMain {
    public static void main(String[] args) {
        Man[] mans;  //聲明引用類型數組; 
        mans = new Man[10];  //給引用類型數組分配空間;
         
        Man m1 = new Man(1,11);
        Man m2 = new Man(2,22);  
         
        mans[0]=m1;//給引用類型數組元素賦值;
        mans[1]=m2;//給引用類型數組元素賦值;
    }
}

引用類型數組記憶體分配圖

图7-2 引用类型数组内存分配图.png

初始化數組

數組的初始化方式總共有三種:靜態初始化、動態初始化、預設初始化。下麵針對這三種方式分別講解。

1、靜態初始化

除了用new關鍵字來產生數組以外,還可以直接在定義數組的同時就為數組元素分配空間並賦值。

int[] a = { 1, 2, 3 };// 靜態初始化基本類型數組;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 靜態初始化引用類型數組;

2.動態初始化

數組定義與為數組元素分配空間並賦值的操作分開進行。

int[] a1 = new int[2];//動態初始化數組,先分配空間;
a1[0]=1;//給數組元素賦值;
a1[1]=2;//給數組元素賦值;

3.數組的預設初始化

數組是引用類型,它的元素相當於類的實例變數,因此數組一經分配空間,其中的每個元素也被按照實例變數同樣的方式被隱式初始化。

int a2[] = new int[2]; // 預設值:0,0
boolean[] b = new boolean[2]; // 預設值:false,false
String[] s = new String[2]; // 預設值:null, null

3、遍曆數組

傳統for迴圈遍歷

int [] a = {0,1,2,3,4}
for(int i=0;i<a.lenth;i++){
    System.out.println(a[i]);
}

for-each遍歷

 增強for迴圈for-each是JDK1.5新增加的功能,專門用於讀取數組或集合中所有的元素,即對數組進行遍歷。
String[] ss = { "aa", "bbb", "ccc", "ddd" };
for (String temp : ss) {
    System.out.println(temp);
    }

結果如下:

图7-4 示例7-8运行效果图.png

註意事項

  1. for-each增強for迴圈在遍曆數組過程中不能修改數組中某元素的值。
  2. for-each僅適用於遍歷,不涉及有關索引(下標)的操作。

4、數組的拷貝

​ System類里也包含了一個static void arraycopy(object src,int srcpos,object dest, int destpos,int length)方法,該方法可以將src數組裡的元素值賦給dest數組的元素,其中srcpos指定從src數組的第幾個元素開始賦值,length參數指定將src數組的多少個元素賦給dest數組的元素。

示例:數組拷貝

String[] s = {"阿裡","尚學堂","京東","搜狐","網易"}; 
String[] sBak = new String[6];
System.arraycopy(s,0,sBak,0,s.length);
for (int i = 0; i < sBak.length; i++) {
    System.out.print(sBak[i]+ "\t");
    }

結果如下:

图7-5 示例7-9运行效果图.png

5、Arrays類

 JDK提供的java.util.Arrays類,包含了常用的數組操作,方便我們日常開發。Arrays類包含了:排序、查找、填充、列印內容等常見的操作。

列印數組

import java.util.Arrays;
public class Test {
    public static void main(String args[]) {
        int[] a = { 1, 2 };
        System.out.println(a); // 列印數組引用的值;
        System.out.println(Arrays.toString(a)); // 列印數組元素的值;
    }
}

图7-6 示例7-10运行效果图.png

註意

此處的Arrays.toString()方法是Arrays類的靜態方法,不是前面講的Object的toString()方法。

數組元素的排序(sort方法)

import java.util.Arrays;
public class Test {
    public static void main(String args[]) {
        int[] a = {1,2,323,23,543,12,59};
        System.out.println(Arrays.toString(a));
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

图7-7 示例7-11运行效果图.png

數組元素是引用類型的排序(Comparable介面的應用)

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        Man[] msMans = { new Man(3, "a"), new Man(60, "b"), new Man(2, "c") };
        Arrays.sort(msMans);
        System.out.println(Arrays.toString(msMans));
    }
}
 
class Man implements Comparable {
    int age;
    int id;
    String name;
 
    public Man(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
 
    public String toString() {
        return this.name;
    }
 
    public int compareTo(Object o) {
        Man man = (Man) o;
        if (this.age < man.age) {
            return -1;
        }
        if (this.age > man.age) {
            return 1;
        }
        return 0;
    }
}

​ Comparable介面里定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現該介面的類必須實現該方法,實現了該介面的類的對象就可以比較大小。當一個對象調用該方法與另一個對象進行比較時,例如obj1.compareTo(obj2),如果該方法返回0,則表示兩個對象相等,如果該方法返回一個正整數,則表明obj1大於obj2;如果該方法返回一個負整數,則表明obj1小於obj2。

下麵是一些已經實現了Comparable介面的常用類:

  1. BigDecimal類、BigInteger以及所有的數值型對應的包裝類:按他們對應的數值大小進行比較
  2. Character:按照字元的UNICODE值進行比較
  3. Boolean:true對應的包裝類實例大於false對應的包裝類實例
  4. String:按照字元的UNICODE值進行比較
  5. Date\Time:後面的時間、日期比前面的時間、日期大

二分法查找

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        int[] a = {1,2,323,23,543,12,59};
        System.out.println(Arrays.toString(a));
        Arrays.sort(a);   //使用二分法查找,必須先對數組進行排序;
        System.out.println(Arrays.toString(a));
        //返回排序後新的索引位置,若未找到返回負數。
        System.out.println("該元素的索引:"+Arrays.binarySearch(a, 12)); 
    }
}

图7-8 示例7-13运行效果图.png

數組填充

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        int[] a= {1,2,323,23,543,12,59};
        System.out.println(Arrays.toString(a));
        Arrays.fill(a, 2, 4, 100);  //將2到4索引的元素替換為100;
        System.out.println(Arrays.toString(a));
    }
}

图7-9 示例7-14运行效果图.png

6、多維數組

​ 多維數組可以看成以數組為元素的數組。可以有二維、三維、甚至更多維數組,但是實際開發中用的非常少。最多到二維數組(學習容器後,我們一般使用容器,二維數組用的都很少)。

二維數組的聲明

public class Test {
    public static void main(String[] args) {
        // Java中多維數組的聲明和初始化應按從低維到高維的順序進行
        int[][] a = new int[3][];
        a[0] = new int[2];
        a[1] = new int[4];
        a[2] = new int[3];
        // int a1[][]=new int[][4];//非法
    }
}

二維數組的靜態初始化

public class Test {
    public static void main(String[] args) {
        int[][] a = { { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };
        System.out.println(a[2][3]);
    }
}

图7-10 示例7-16内存分配图.png

二維數組的動態初始化

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        int[][] a = new int[3][];
        // a[0] = {1,2,5}; //錯誤,沒有聲明類型就初始化
        a[0] = new int[] { 1, 2 };
        a[1] = new int[] { 2, 2 };
        a[2] = new int[] { 2, 2, 3, 4 };
        System.out.println(a[2][3]);
        System.out.println(Arrays.toString(a[0]));
        System.out.println(Arrays.toString(a[1]));
        System.out.println(Arrays.toString(a[2]));
    }
}

图7-11 示例7-17运行效果图.png

獲取數組長度

//獲取的二維數組第一維數組的長度。
System.out.println(a.length);
//獲取第二維第一個數組長度。
System.out.println(a[0].length);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 第一個程式 1.1 Hello Python書寫步驟 步驟一:新建文本文檔文件,修改名稱為hello.py 步驟二:使用記事本打開文件,書寫程式內容如下: 步驟三:打開命令行,輸入執行指令:python hello.py 運行結果:屏幕顯示hello python 1.2 Bug 軟體的Bug ...
  • Java是使用“訪問控制符”來控制哪些細節需要封裝,哪些細節需要暴露的。 Java中4種“訪問控制符”分別為private、default、protected、public,它們說明瞭面向對象的封裝性,所以我們要利用它們儘可能的讓訪問許可權降到最低,從而提高安全性。 下麵詳細講述它們的訪問許可權問題。其 ...
  • 1. Python語言 1.1 編程語言 語言是人類最重要的交際工具,是人類之間進行信息交換的主要表達方式。 編程語言是用來定義電腦程式的語言,用來向電腦發出指令。 1.2 Python語言 Python語言是一種面向對象的解釋型電腦程式設計語言。 Python語言創始人為吉多·範羅蘇姆(Gu ...
  • 我要看電視,只需要按一下開關和換台就可以了。有必要瞭解電視機內部的結構嗎?有必要碰碰顯像管嗎?製造廠家為了方便我們使用電視,把複雜的內部細節全部封裝起來,只給我們暴露簡單的介面,比如:電源開關。具體內部是怎麼實現的,我們不需要操心。 需要讓用戶知道的才暴露出來,不需要讓用戶知道的全部隱藏起來,這就是 ...
  • 一步一步,從零搭建Go語言開發環境。 安裝Go語言及搭建Go語言開發環境 下載 Go官網下載地址:https://golang.org/dl/ Go官方鏡像站(推薦):https://golang.google.cn/dl/ 版本的選擇 Windows平臺和Mac平臺推薦下載可執行文件版,Linux ...
  • VS Code是微軟開源的一款編輯器,插件系統十分的豐富。本文就介紹瞭如何使用VS Code搭建Go語言開發環境。 VS Code配置Go語言開發環境 說在前面的話,Go語言是採用UTF8編碼的,理論上使用任何文本編輯器都能做Go語言開發。大家可以根據自己的喜好自行選擇。編輯器/IDE沒有最好只有最 ...
  • 變數和常量是編程中必不可少的部分,也是很好理解的一部分。 標識符與關鍵字 標識符 在編程語言中標識符就是程式員定義的具有特殊意義的詞,比如變數名、常量名、函數名等等。 Go語言中標識符由字母數字和_(下劃線)組成,並且只能以字母和_開頭。 舉幾個例子:abc, _, _123, a123。 關鍵字 ...
  • Go語言中有豐富的數據類型,除了基本的整型、浮點型、布爾型、字元串外,還有數組、切片、結構體、函數、map、通道(channel)等。Go 語言的基本類型和其他語言大同小異。 基本數據類型 整型 整型分為以下兩個大類: 按長度分為:int8、int16、int32、int64 對應的無符號整型:ui ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...