欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javaSE中數(shù)組的概念與使用詳細(xì)教程

 更新時(shí)間:2023年08月15日 09:28:39   作者:paper?jie  
這篇文章主要給大家介紹了關(guān)于javaSE中數(shù)組的概念與使用的相關(guān)資料,數(shù)組在內(nèi)存中是一段連續(xù)的空間,空間的編號(hào)都是從0開(kāi)始的,依次遞增,該編號(hào)稱為數(shù)組的下標(biāo),需要的朋友可以參考下

數(shù)組的概念

什么是Java中的數(shù)組

數(shù)組:可以看成是相同類型元素的一個(gè)集合。在內(nèi)存中是一段連續(xù)的空間。在java中,包含6個(gè)整形類型元素的數(shù)組,可以看做是酒店中連續(xù)的6個(gè)房間.

1. 數(shù)組中存放的元素其類型相同

2. 數(shù)組的空間是連在一起的

3. 每個(gè)空間有自己的編號(hào),其實(shí)位置的編號(hào)為0,即數(shù)組的下標(biāo) 

數(shù)組的創(chuàng)建和初始化

數(shù)組的創(chuàng)建

topy[] 數(shù)組名 = new array[n];

topy:表示數(shù)組中存放元素的類型

topy[]:表示數(shù)組的類型

n:表示數(shù)組的長(zhǎng)度

int[] array1 = new int[10]; // 創(chuàng)建一個(gè)可以容納10個(gè)int類型元素的數(shù)組
double[] array2 = new double[5]; // 創(chuàng)建一個(gè)可以容納5個(gè)double類型元素的數(shù)組
String[] array3 = new double[3]; // 創(chuàng)建一個(gè)可以容納3個(gè)字符串元素的數(shù)組

數(shù)組的初始化

數(shù)組的初始化主要分為動(dòng)態(tài)初始化以及靜態(tài)初始化 

動(dòng)態(tài)初始化: 在創(chuàng)建數(shù)組的時(shí)侯,直接指定數(shù)組中的元素個(gè)數(shù) 

int[] array = new int[10];

靜態(tài)初始化: 在創(chuàng)建數(shù)組的時(shí)候,不直接指定元素個(gè)數(shù),但是直接將具體的數(shù)據(jù)放入數(shù)組中

int[] array = {1,2,3,4,5,6}

栗子:

int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{"hell", "Java", "!!!"};

注意:

靜態(tài)初始化雖然沒(méi)有指定數(shù)組的長(zhǎng)度,編譯器在編譯時(shí)會(huì)根據(jù){}中元素個(gè)數(shù)來(lái)確定數(shù)組的長(zhǎng)度。

靜態(tài)初始化時(shí), {}中數(shù)據(jù)類型必須與[]前數(shù)據(jù)類型一致。

靜態(tài)初始化可以簡(jiǎn)寫(xiě),省去后面的new T[]。 

這里靜態(tài)和動(dòng)態(tài)初始化也可以分為兩步,但是省略格式不可以 

int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
// 注意省略格式不可以拆分, 否則編譯失敗
// int[] array3;
// array3 = {1, 2, 3};

如果沒(méi)有對(duì)數(shù)組進(jìn)行初始化,數(shù)組中元素有其默認(rèn)值

如果數(shù)組中存儲(chǔ)元素類型為基類類型,默認(rèn)值為基類類型對(duì)應(yīng)的默認(rèn)值

如果數(shù)組中存儲(chǔ)元素類型為引用類型,默認(rèn)值為null 

數(shù)組的使用

數(shù)組中元素的訪問(wèn)

 數(shù)組在內(nèi)存中是一段連續(xù)的空間,空間的編號(hào)都是從0開(kāi)始的,依次遞增,該編號(hào)稱為數(shù)組的下標(biāo),數(shù)組可以通過(guò)下標(biāo)訪問(wèn)其任意位置的元素  

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通過(guò)[]對(duì)數(shù)組中的元素進(jìn)行修改
array[0] = 100;
System.out.println(array[0]);

 注意:數(shù)組是一段連續(xù)的內(nèi)存空間,因此支持隨機(jī)訪問(wèn),即通過(guò)下標(biāo)訪問(wèn)快速訪問(wèn)數(shù)組中任意位置的

下標(biāo)從0開(kāi)始,介于[0, N)之間不包含N,N為元素個(gè)數(shù),不能越界,否則會(huì)報(bào)出下標(biāo)越界常。 

遍歷數(shù)組

遍歷就是說(shuō)將數(shù)組中的所有元素都訪問(wèn)一遍,訪問(wèn)可以將數(shù)組的所有元素進(jìn)行打印。

栗子:這里我們通過(guò)循環(huán)遍歷來(lái)賦值和打印,也可以使用foreach來(lái)遍歷打印。

for-each 是 for 循環(huán)的另外一種使用方式. 能夠更方便的完成對(duì)數(shù)組的遍歷. 可以避免循環(huán)條件和更新語(yǔ)句寫(xiě)錯(cuò)

   public static void main(String[] args) {
        int[] array = new int[10];
        //通過(guò)遍歷賦值
        for (int i = 0; i < array.length; i++) {
            array[i] = i+1;
        }
        //循環(huán)遍歷打印
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        //用foreach遍歷
        for (int x: array) {
            System.out.print(x);
        }

注意:在數(shù)組中可以通過(guò) 數(shù)組對(duì)象.length 來(lái)獲取數(shù)組的長(zhǎng)度 

引用類型 - 數(shù)組

JVM的內(nèi)存分布 

內(nèi)存是一段連續(xù)的存儲(chǔ)空間,主要用來(lái)存儲(chǔ)程序運(yùn)行時(shí)數(shù)據(jù)的,

1. 程序運(yùn)行時(shí)代碼需要加載到內(nèi)存

2. 程序運(yùn)行產(chǎn)生的中間數(shù)據(jù)要存放在內(nèi)存

3. 程序中的常量也要保存

4. 有些數(shù)據(jù)可能需要長(zhǎng)時(shí)間存儲(chǔ),而有些數(shù)據(jù)當(dāng)方法運(yùn)行結(jié)束后就要被銷毀 

所以呢,JVM也對(duì)所使用的內(nèi)存按照功能的不同進(jìn)行了劃分: 

這里介紹一下上面的幾個(gè)區(qū)分:

程序計(jì)數(shù)器: 只是一個(gè)很小的空間, 保存下一條執(zhí)行的指令的地址

虛擬機(jī)棧: 與方法調(diào)用相關(guān)的一些信息,每個(gè)方法在執(zhí)行時(shí),都會(huì)先創(chuàng)建一個(gè)棧幀,棧幀中包含有:局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、返回地址以及其他的一些信息,保存的都是與方法執(zhí)行時(shí)相關(guān)的一些信息。比如:局部變量。當(dāng)方法運(yùn)行結(jié)束后,棧幀就被銷毀了,即棧幀中保存的數(shù)據(jù)也被銷毀了。

本地方法棧: 本地方法棧與虛擬機(jī)棧的作用類似. 只不過(guò)保存的內(nèi)容是Native方法的局部變量. 在有些版本的 JVM 實(shí)現(xiàn)中(例如HotSpot), 本地方法棧和虛擬機(jī)棧是一起的

堆: JVM所管理的最大內(nèi)存區(qū)域. 使用 new 創(chuàng)建的對(duì)象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是隨著程序開(kāi)始運(yùn)行時(shí)而創(chuàng)建,隨著程序的退出而銷毀,堆中的數(shù)據(jù)只要還有在使用,就不會(huì)被銷毀。

方法區(qū): 用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù). 方法編譯出的的字節(jié)碼就是保存在這個(gè)區(qū)域 

基本類型變量與引用類型變量的區(qū)別

基本數(shù)據(jù)類型創(chuàng)建的變量,稱為基本變量,該變量空間中直接存放的是其所對(duì)應(yīng)的值;

而引用數(shù)據(jù)類型創(chuàng)建的變量,一般稱為對(duì)象的引用,其空間中存儲(chǔ)的是對(duì)象所在空間的地址。

下面的代碼,a、b、arr,都是函數(shù)內(nèi)部的變量,因此其空間都在main方法對(duì)應(yīng)的棧幀中分配。a、b是內(nèi)置類型的變量,因此其空間中保存的就是給該變量初始化的值。array是數(shù)組類型的引用變量,其內(nèi)部保存的內(nèi)容可以簡(jiǎn)單理解成是數(shù)組在堆空間中的首地址。

public static void func() {
int a = 10;
int b = 20;
int[] arr = new int[]{1,2,3};
}

 從上圖可以看到,引用變量并不直接存儲(chǔ)對(duì)象本身,可以簡(jiǎn)單理解成存儲(chǔ)的是對(duì)象在堆中空間的起始地址。通過(guò)該地址,引用變量便可以去操作對(duì)象。有點(diǎn)類似C語(yǔ)言中的指針,但是Java中引用要比指針的操作更簡(jiǎn)單

具體分析引用變量

public static void func() {
int[] array1 = new int[3];
array1[0] = 10;
array1[1] = 20;
array1[2] = 30;
int[] array2 = new int[]{1,2,3,4,5};
array2[0] = 100;
array2[1] = 200;
array1 = array2;
array1[2] = 300;
array1[3] = 400;
array2[4] = 500;
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}

java中的null

null 在 Java 中表示 "空引用" , 也就是一個(gè)不指向?qū)ο蟮囊?nbsp;

int[] arr = null;
System.out.println(arr[0]);
// 執(zhí)行結(jié)果
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)

 null 的作用類似于 C 語(yǔ)言中的 NULL (空指針), 都是表示一個(gè)無(wú)效的內(nèi)存位置. 因此不能對(duì)這個(gè)內(nèi)存進(jìn)行任何讀寫(xiě)操作. 一旦嘗試讀寫(xiě), 就會(huì)拋出 NullPointerException.(可以理解為空指針異常)

Java 中并沒(méi)有約定 null 和 0 號(hào)地址的內(nèi)存有任何關(guān)聯(lián)  

數(shù)組的應(yīng)用

保存數(shù)據(jù)

public static void main(String[] args) {
int[] array = {1, 2, 3};
for(int i = 0; i < array.length; ++i){
System.out.println(array[i] + " ");
}
}

作為函數(shù)的參數(shù) 

函數(shù)傳基本類型:

public static void main(String[] args) {
int num = 0;
func(num);
System.out.println("num = " + num);
}
public static void func(int x) {
x = 10;
System.out.println("x = " + x);
} /
/ 執(zhí)行結(jié)果
x = 10
num = 0

這里在func方法中修改形參 x 的值, 不影響實(shí)參的 num 值

參數(shù)傳數(shù)組類型,也就是引用類型:

public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
 // 執(zhí)行結(jié)果
a[0] = 10
arr[0] = 10

發(fā)現(xiàn)在func方法內(nèi)部修改數(shù)組的內(nèi)容, 方法外部的數(shù)組內(nèi)容也發(fā)生改變.因?yàn)閿?shù)組是引用類型,按照引用類型來(lái)進(jìn)行傳遞(可以理解為傳的是地址),是可以修改其中存放的內(nèi)容的   

總結(jié): 所謂的 "引用" 本質(zhì)上只是存了一個(gè)地址. Java 將數(shù)組設(shè)定成引用類型, 這樣的話后續(xù)進(jìn)行數(shù)組參數(shù)傳參, 其實(shí)只是將數(shù)組的地址傳入到函數(shù)形參中. 這樣可以避免對(duì)整個(gè)數(shù)組的拷貝(數(shù)組可能比較長(zhǎng), 那么拷貝開(kāi)銷就會(huì)很大)

作為函數(shù)的返回值 

直接上代碼:

求斐波那契數(shù)的前n項(xiàng):

public class TestArray {
public static int[] fib(int n){
if(n <= 0){
return null;
} in
t[] array = new int[n];
array[0] = array[1] = 1;
for(int i = 2; i < n; ++i){
array[i] = array[i-1] + array[i-2];
} r
eturn array;
}
public static void main(String[] args) {
int[] array = fib(10);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}

數(shù)組練習(xí) 

數(shù)組變字符串

使用Java 中提供了 java.util.Arrays 包:

    public static void main5(String[] args) {
        int[] array ={1,2,3,4,5,5,7,8};
       String Arr =  Arrays.toString(array);
       //String Arr = My_Arrays(array);
        System.out.println(Arr);
    }

自己定義一個(gè)方法:

    public static void main5(String[] args) {
        int[] array ={1,2,3,4,5,5,7,8};
       //String Arr =  Arrays.toString(array);
       String Arr = My_Arrays(array);
        System.out.println(Arr);
    }
    public static String My_Arrays(int[] array) {
        if(array.length == 0) {
            return "[]";
        }
        String ret = "[";
        for (int i = 0; i < array.length; i++) {
            ret += array[i];
            if(i < array.length - 1) {
                ret += ",";
            }
        }
        ret += "]";
        return ret;
    }

數(shù)組拷貝 

使用了Arrays包中的拷貝方法去:

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        int[] newArr = new  int[10];
        newArr = Arrays.copyOf(array, array.length);
        for (int i = 0; i < array.length; i++) {
            System.out.print(newArr[i] + " ");
        }
    }

區(qū)域拷貝:

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7,8,9,10};
        int[] newArr = new int[10];
        newArr = Arrays.copyOf(array, array.length);
        int[] newArr2 = new int[10];
        newArr2 = Arrays.copyOfRange(array, 2, 5);
        for (int i = 0; i < array.length; i++) {
            System.out.print(newArr[i] + " ");
        }
        System.out.println();
        for (int i = 0; i < 3; i++) {
            System.out.print(newArr2[i] + " ");
        }
    }

二維數(shù)組

Java中的二維數(shù)組本質(zhì)上也是一維數(shù)組,每個(gè)元素又是一個(gè)一維數(shù)組。

基本語(yǔ)法:

數(shù)據(jù)類型[][] 數(shù)組名稱 = new 數(shù)據(jù)類型 [行數(shù)][列數(shù)] { 初始化數(shù)據(jù) };

栗子:

int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};
for (int row = 0; row < arr.length; row++) {
for (int col = 0; col < arr[row].length; col++) {
System.out.printf("%d\t", arr[row][col]);
} System.out.println("");
}

這里大家要記住一個(gè)點(diǎn):二維數(shù)組中的行標(biāo)存的就是對(duì)應(yīng)每一列的地址,通過(guò)地址來(lái)找到它們,可以將int[i] arr看做 地址。其他的,二維數(shù)組的用法和一維數(shù)組就沒(méi)有明顯差別了。

總結(jié)

到此這篇關(guān)于javaSE中數(shù)組的概念與使用詳細(xì)教程的文章就介紹到這了,更多相關(guān)javaSE數(shù)組概念與使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java項(xiàng)目中的絕對(duì)路徑和相對(duì)路徑用法說(shuō)明

    java項(xiàng)目中的絕對(duì)路徑和相對(duì)路徑用法說(shuō)明

    這篇文章主要介紹了java項(xiàng)目中的絕對(duì)路徑和相對(duì)路徑用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java占位符替換五種方式小結(jié)

    java占位符替換五種方式小結(jié)

    我們經(jīng)常會(huì)遇到需要替換字符串中的占位符的情況,本文主要介紹了java占位符替換五種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • spring cloud zuul 與 sentinel的結(jié)合使用操作

    spring cloud zuul 與 sentinel的結(jié)合使用操作

    這篇文章主要介紹了spring cloud zuul 與 sentinel 的結(jié)合使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java源碼解析之String類的compareTo(String otherString)方法

    java源碼解析之String類的compareTo(String otherString)方法

    這篇文章主要給大家介紹了關(guān)于java源碼解析之String類的compareTo(String otherString)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Java如何自定義線程池中隊(duì)列

    Java如何自定義線程池中隊(duì)列

    這篇文章主要介紹了Java如何自定義線程池中隊(duì)列,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解

    SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解

    這篇文章主要介紹了SpringBoot之自定義Filter獲取請(qǐng)求參數(shù)與響應(yīng)結(jié)果案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 解決springboot application.yml變灰色的問(wèn)題

    解決springboot application.yml變灰色的問(wèn)題

    這篇文章主要介紹了解決springboot application.yml變灰色的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java解析http協(xié)議字符串的方法實(shí)現(xiàn)

    Java解析http協(xié)議字符串的方法實(shí)現(xiàn)

    本文主要介紹了Java解析http協(xié)議字符串的方法實(shí)現(xiàn),我們探討了如何使用Java解析HTTP協(xié)議字符串,并將其封裝成了一個(gè)HttpRequest類,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • mybatis數(shù)組和集合的長(zhǎng)度判斷及插入方式

    mybatis數(shù)組和集合的長(zhǎng)度判斷及插入方式

    這篇文章主要介紹了mybatis數(shù)組和集合的長(zhǎng)度判斷及插入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java實(shí)現(xiàn)CSV文件導(dǎo)入與導(dǎo)出功能

    java實(shí)現(xiàn)CSV文件導(dǎo)入與導(dǎo)出功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)CSV文件導(dǎo)入與導(dǎo)出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評(píng)論