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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...