日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

詳解Java數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組(Array)

 板橋胡同37號(hào) 2019-10-20

開始本文前,先跟大家推薦個(gè)知識(shí)星球:小猿和他的朋友們 ,目前星球還在優(yōu)惠階段,大家可以點(diǎn)進(jìn)來看看 。

今天重點(diǎn)介紹下數(shù)組的概念,數(shù)據(jù)就是一種數(shù)據(jù)結(jié)構(gòu),可以用來存儲(chǔ)多個(gè)數(shù)據(jù),每個(gè)數(shù)組中可以存放相同類型的數(shù)據(jù)。比如,在學(xué)校,我們是一個(gè)班,這里的班級(jí)中每個(gè)同學(xué)都是這個(gè)班級(jí)數(shù)組中的元素,都是同樣的類型為學(xué)生,對(duì)應(yīng)的學(xué)號(hào)就是我們的索引,但是在現(xiàn)實(shí)中的學(xué)號(hào)一般都是從1開始的,而在Java中的數(shù)組索引是從0開始的。

定義一個(gè)數(shù)組為方括([]),通過數(shù)組元素的索引(或下標(biāo),角標(biāo))來訪問數(shù)組中的元素,同時(shí)可以為數(shù)組賦值和取出數(shù)組的元素值。

數(shù)組

問: 在Java中為什么要有數(shù)組呢?
答: 數(shù)組就是一個(gè)容器,是用來存儲(chǔ)同種數(shù)據(jù)類型的多個(gè)值。

數(shù)組的概念

同一種類型的數(shù)據(jù)的集合,用來裝數(shù)據(jù)的,數(shù)組就是一個(gè)容器。在Java中數(shù)組的好處就是可以用數(shù)組中的元素從0開始編號(hào),可以利用下標(biāo)(索引),對(duì)齊進(jìn)行操作,即方便又快捷。

在Java中的數(shù)組是用存儲(chǔ)同種數(shù)組的元素,其指的是數(shù)據(jù)類型要相同,在數(shù)組中存放的數(shù)據(jù)類型是唯一的,只能存儲(chǔ)一種數(shù)據(jù)類型,不能存儲(chǔ)多種數(shù)據(jù)類型。數(shù)組可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用數(shù)據(jù)類型。

數(shù)組的定義格式:

一般數(shù)組的定義為:

int[] array; 或 int array[];

這兩種定義的語法通常都可以用,但是建議是使用 int[] array 這種語法,因?yàn)榇蠖鄶?shù)程序員常用,這種語法定義更具有可讀性。

格式1:

數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)組類型[元素個(gè)數(shù)或者數(shù)組的長度];

例如:

int[] arr = new int[5];

格式2:

元素類型[] 數(shù)組名 = new 元素類型[]{元素1,元素2,。。。};

例如:

int[] arr = new int[]{1,2,34};

int[] arr = {2,34,5};

數(shù)組的定義方式:

數(shù)組的表示:[],通過關(guān)鍵字new來創(chuàng)建數(shù)組

一個(gè)數(shù)組一旦初始化建立,那么數(shù)組就會(huì)在內(nèi)存中有一塊空間被固定下來,那么這塊空間就是這個(gè)數(shù)組的,不可變,即數(shù)組的長度將不可改變。就算把這個(gè)數(shù)組中的數(shù)組清空,在內(nèi)存中還是這塊空間被保存下來。比如,一家酒店我們把它定義一個(gè)數(shù)組,那么每個(gè)房間就是這家就是的長度,這家酒店我們就把它當(dāng)做是我們在內(nèi)存中開辟的一塊固定下來的空間,每個(gè)房間中入住的人就是這塊空間,也就是數(shù)組的元素,房間號(hào)碼我們可以當(dāng)做的數(shù)組的索引,通過房間號(hào)找到相應(yīng)的入住者。當(dāng)這家酒店中的每個(gè)元素即是客人都走時(shí),這家酒店中的房間依然保留著,依然還是酒店,所以依然還是數(shù)組了。數(shù)組中的長度即酒店中的房間還是這個(gè)數(shù)量(長度)。

數(shù)組代碼示例:

package com。dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 數(shù)據(jù)類型[] 數(shù)組名=new 數(shù)據(jù)類型[數(shù)組的長度];
       int[] arr = new int[5];
       /*
        * int: 代表數(shù)據(jù)類型
        * []: 代表數(shù)組
        * arr: 合法的標(biāo)識(shí)符
        *
        * new: 創(chuàng)建新的實(shí)體或?qū)ο?br>         * int: 數(shù)據(jù)類型
        * []: 代表的數(shù)組
        * 5: 代表數(shù)組的長度
       */

   }

}

數(shù)組的索引

例如:

int[] arr = new int[3];

數(shù)組可以存儲(chǔ)多個(gè)數(shù)據(jù),并且會(huì)對(duì)數(shù)組進(jìn)行編號(hào),從0開始操作元素,可以通過編號(hào)(索引,角標(biāo),下標(biāo))找到該元素。代碼中會(huì)在內(nèi)存空間中開辟3個(gè)空間,如三個(gè)房子編號(hào),從0開始,第二個(gè)房子為1,第三個(gè)房子為2。這只是一種比如,我們把它看作三個(gè)空間,對(duì)應(yīng)的三個(gè)地址編號(hào)而已,通過地址是不是就可以找到房子了呢!

數(shù)組也是一種數(shù)據(jù)類型,為引用類型,如int為一種基本數(shù)據(jù)類型,那么int[]這是一種屬于int數(shù)組的一種引用類型,所以int[]是一種數(shù)據(jù)類型,創(chuàng)建int[]類型的對(duì)象為創(chuàng)建數(shù)組。

什么是數(shù)組的初始化?

就是為數(shù)組開辟連續(xù)的內(nèi)存空間,并為每個(gè)數(shù)據(jù)元素賦予值。

只要數(shù)組進(jìn)行分配,就具有初始化值,數(shù)組變量一旦在內(nèi)存空間分配了區(qū)域,就會(huì)在每個(gè)空間里存儲(chǔ)數(shù)組的初始化值,就算內(nèi)存空間為空,也會(huì)有一個(gè)初始化的值為null,這里的值會(huì)根據(jù)變量類型來給定初始化值,初始化值可以有系統(tǒng)進(jìn)行自動(dòng)分配,如果我們不給定值的話,另一種就是由我們程序員給定初始化值。

如何對(duì)數(shù)組進(jìn)行初始化?

動(dòng)態(tài)初始化就是程序員指定數(shù)組的長度,有系統(tǒng)進(jìn)行數(shù)組元素的分配初始值。

例如: int[] arr = new int[5];

格式如下:

arrayName = new type[length];

使用動(dòng)態(tài)初始化過程如下:

int[] array = new int[5];

靜態(tài)初始化就是程序員給定初始化值,然后由系統(tǒng)進(jìn)行決定長度。

靜態(tài)初始化的語法格式:

array = new type[]{元素1,元素2,元素3,。。。};

定義一個(gè)int數(shù)組類型的變量:

int[] intArray;

靜態(tài)初始化,給定數(shù)組元素的初始化值,不給定數(shù)組長度,由系統(tǒng)決定數(shù)組長度:

intArray = new int[]{23,45,6}; 或 intArray = {2,34,5,6};

在程序員的通常寫法中,數(shù)組的定義和數(shù)組進(jìn)行初始化都是同時(shí)完成如:

int[] a = {1,2,3,4};

代碼案例:

package com。dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[數(shù)組長度];
       int[] arr = new int[5]; // 動(dòng)態(tài)初始化,在內(nèi)存中開辟連續(xù)的5塊空間
       System。out。println(arr[0]); // 系統(tǒng)會(huì)給出默認(rèn)的初始化值
       // 整數(shù)類型都為0
       arr[0] = 12;
       System。out。println(arr[0]);
   }

}

結(jié)果:

效果

結(jié)果在內(nèi)存中開辟連續(xù)的5塊空間,在內(nèi)存中進(jìn)行存儲(chǔ),這5塊空間有自己的地址,用于方便去找到,可以通過地址先找到該數(shù)組,如找一棟樓,需要地址,然后找數(shù)組中的元素,如每個(gè)房間,通過編號(hào)找到每個(gè)元素。

案例:

System。out。println(arr);// 打印結(jié)果
[I@7852e922// 16進(jìn)制的表現(xiàn)形式// [ 代表數(shù)組// I 代表是int類型// @ 固定的// 7852e922 代表16進(jìn)制的地址值

在Java中運(yùn)行程序會(huì)進(jìn)行劃分空間進(jìn)行運(yùn)行程序:五塊內(nèi)存空間

1.棧:用來存儲(chǔ)局部變量的
2.堆:存儲(chǔ)new出來的數(shù)組或?qū)ο?br>3.方法區(qū):面向?qū)ο?br>4.本地方法區(qū):和系統(tǒng)相關(guān)
5.寄存器:供給CPU使用(不需要了解)

局部變量是定義在方法聲明上或方法中的變量,在棧內(nèi)存中,存儲(chǔ)的都是局部變量,只要在方法中定義的變量都是局部變量,一旦變量的生命周期結(jié)束該變量就會(huì)被釋放,用完就會(huì)被刪掉了。

堆內(nèi)存,存儲(chǔ)的都是實(shí)體,就是對(duì)象,凡是用new 創(chuàng)建的都是在堆里面。

new,一個(gè)new指在內(nèi)存中進(jìn)行開辟空間,在堆內(nèi)存中每個(gè)實(shí)體都是一個(gè)首地址值,堆內(nèi)存的變量都是有默認(rèn)的初始化值的,不同類型都不一樣,當(dāng)實(shí)體不在使用時(shí),堆中的變量不會(huì)馬上刪除,會(huì)由Java系統(tǒng)中的垃圾回收機(jī)制進(jìn)行回收(Java中有個(gè)垃圾回收機(jī)制,自動(dòng)回收垃圾)

數(shù)組地址,例如:0x0011,可以通過索引找到每個(gè)值,系統(tǒng)會(huì)給初始化值。

整數(shù)類型:

byte, short, int, long 的默認(rèn)初始化值都為0

浮點(diǎn)類型:

float, double 的默認(rèn)初始化值都為0。0

布爾類型:

boolean的默認(rèn)初始化值為false

字符類型:

char默認(rèn)初始化值為 “\u0000”,char在內(nèi)存中是占兩個(gè)字節(jié),是16個(gè)二進(jìn)制位。\u0000每個(gè)0代表16進(jìn)制的0,那么四個(gè)0就是代表16個(gè)二進(jìn)制位。

一個(gè)字節(jié)代表8個(gè)二進(jìn)制位,那么兩個(gè)字節(jié),就代表16個(gè)二進(jìn)制位。'\u0000'每個(gè)0代表16進(jìn)制的0,那么四個(gè)0就是代表16個(gè)二進(jìn)制位。

char在內(nèi)存中占兩個(gè)字節(jié)

代表16個(gè)二進(jìn)制位, 兩個(gè)字節(jié)代表16個(gè)二進(jìn)制位。
一個(gè)字節(jié)代表8個(gè)二進(jìn)制位,那么兩個(gè)字節(jié)就代表16個(gè)二進(jìn)制位。

\u0000:
每個(gè)0代表16進(jìn)制的0,那么四個(gè)0就代表16個(gè)二進(jìn)制位。
兩個(gè)字節(jié)就代表16個(gè)二進(jìn)制位,那么四個(gè)0代表16個(gè)二進(jìn)制位。

char:就代表16個(gè)二進(jìn)制位。
\u0000`:就代表16個(gè)二進(jìn)制位 = 四個(gè)0就代表16個(gè)二進(jìn)制位。
每個(gè)0就代表16個(gè)進(jìn)制的二進(jìn)制數(shù)。1個(gè)0就代表4位,16進(jìn)制是4位代表一位的,4個(gè)就代表16個(gè)二進(jìn)制數(shù)。

16個(gè)二進(jìn)制位: 0000
一個(gè)就代表4個(gè)二進(jìn)制位,那么4個(gè)就代表16個(gè)二進(jìn)制位。

數(shù)組元素如果是引用數(shù)據(jù)類型為類,接口和數(shù)組,那么數(shù)組元素的初始化值是null。

注意:靜態(tài)初始化和動(dòng)態(tài)初始化不能同時(shí)用,不要在進(jìn)行數(shù)組初始化值是,既要分配數(shù)組元素初始化值,還要給定數(shù)組的長度,千萬不要,知道嗎!

槍中的彈夾,子彈是一顆一顆地壓進(jìn)去的,第一顆壓進(jìn)的子彈是最后打出來的,最后一顆的子彈先發(fā)射出來。所以java中的方法就想彈夾一樣,而主方法,是先進(jìn)入內(nèi)存的,虛擬機(jī)調(diào)用主方法,程序運(yùn)行起來,首先進(jìn)入內(nèi)存的,進(jìn)入棧的,是主方法。

主方法就像子彈一樣,放入到棧低,壓進(jìn)棧,壓棧。主方法直接壓入棧底,運(yùn)行完之后會(huì)彈出去,就叫彈棧。棧是先進(jìn)后出。主方法壓進(jìn)棧。方法里的局部變量,類型為數(shù)組類型。

代碼案例:

package com。dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // int x = 12; // x就是局部變量
       int[] arr = new int=[3];
       // 動(dòng)態(tài)初始化,創(chuàng)建3塊連續(xù)的空間
       // 方法里的局部變量
   }
}

在棧中存放主方法,主方法內(nèi)有局部變量,這個(gè)局部變量為數(shù)組類型:

int[] arr;

然后在堆中是數(shù)組類型new出來的值。

內(nèi)存分析案例:

效果

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // int x = 12; // x就是局部變量
       int[] arr = new int[3];
       // 動(dòng)態(tài)初始化,創(chuàng)建3塊連續(xù)的空間
       // 方法里的局部變量
       arr[0] = 10;
       arr[1] = 20;
       System.out.println(arr[0]);
       System.out.println(arr[1]);
   }
}

制作內(nèi)存圖:

地址值是賦予給arr,只是通過地址找到實(shí)體的。

效果

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr1 = new int[3]; // 創(chuàng)建數(shù)組長度為3
       int[] arr2 = new int[3];
       
       System.out.println(arr1); // 打印數(shù)組的地址值
       System.out.println(arr2);
       
       arr1[0] = 10; // 給第一個(gè)數(shù)組中的第一個(gè)元素賦值
       arr2[1] = 20; // 給第二個(gè)數(shù)組中的第二個(gè)元素賦值
       
       System.out.println(arr1[0]);
       System.out.println(arr1[1]);
       System.out.println(arr1[2]);
       
       System.out.println('-----------');
       
       System.out.println(arr2[0]);
       System.out.println(arr2[1]);
       System.out.println(arr2[2]);
   }
}

效果

制作內(nèi)存圖:

效果

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr1 = new int[3];
       int[] arr2 = new int[5];
       int[] arr3 = arr2;
       
       System.out.println(arr1);
       System.out.println(arr2);
       System.out.println(arr3);
       
       arr1[0] = 10;
       arr1[1] = 20;
       
       arr2[1] = 30;
       
       arr3[1] = 40;
       arr3[2] = 50;
       
       System.out.println(arr1[0]);
       System.out.println(arr1[1]);
       System.out.println(arr1[2]);
       System.out.println('--------------');
       System.out.println(arr2[0]);
       System.out.println(arr2[1]);
       System.out.println(arr2[2]);
       System.out.println(arr2[3]);
       System.out.println(arr2[4]);
       System.out.println('--------------');
       System.out.println(arr3[0]);
       System.out.println(arr3[1]);
       System.out.println(arr3[2]);
       System.out.println(arr3[3]);
       System.out.println(arr3[4]);
   }
}

結(jié)果:

效果

制作內(nèi)存圖:

效果

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 數(shù)據(jù)類型[] 數(shù)組名=new 數(shù)據(jù)類型[]{元素1,元素2,...};
       // int[] arr = new int[] {1,23,45,67,28};
       // int[] arr2 = {2,35,6,12}; // 靜態(tài)初始化的簡寫形式
       
       // int[] arr; //聲明數(shù)組引用
       // arr = new int[] {11,22,33,44}; // 可以不同行
       
       // int [] arr2;
       // arr2 = {23,43,55}; // 簡寫形式聲明和賦值必須在同一行
       
       // int[] arr = new int[3]{23,22,1}; //會(huì)報(bào)錯(cuò),不允許動(dòng)靜結(jié)合
       // 應(yīng)該寫成 int[] arr = new int[3]; 為動(dòng)態(tài)初始化
       // int[] arr = new int[]{23,44,2}; 為靜態(tài)初始化
       
   }
}
package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 數(shù)據(jù)類型[] 數(shù)組名=new 數(shù)據(jù)類型[]{元素1,元素2,...};
       // int[] arr = new int[] {1,23,45,67,28};
       // int[] arr2 = {2,35,6,12}; // 靜態(tài)初始化的簡寫形式
       
       int[] arr = {12,23,34};
       System.out.println(arr);
       System.out.println(arr[0]);
   }
}

制作內(nèi)存圖:

效果

數(shù)組中的異常問題:

程序員寫程序不能保證自己寫的代碼是正確的,總會(huì)出現(xiàn)一些錯(cuò)誤,這時(shí)我們要學(xué)會(huì)調(diào)式這些代碼程序保證可以正常的運(yùn)行。

數(shù)組索引越界異常
ArrayIndexOutOfBoundsException,指你訪問的索引不存在。

int arr = {1,34,234};
System.out.println(arr[23]);

空指針異常
NullPointerException,指數(shù)組已經(jīng)不在指向堆內(nèi)存了,而你還用數(shù)組名去訪問元素。

int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr = new int[5];
       System.out.println(arr[5]); // 當(dāng)訪問數(shù)組中不存在的索引,就會(huì)出現(xiàn)索引越界異常.
   }
}

結(jié)果圖:

效果

當(dāng)訪問數(shù)組中不存在的索引的時(shí)候就會(huì)導(dǎo)致數(shù)組越界異常。

同理

System.out.println(arr[-1]); 同樣導(dǎo)致數(shù)組越界異常。

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr = new int[5];
       // System.out.println(arr[5]);
       arr = null;
       System.out.println(arr[0]); // 當(dāng)數(shù)組引用賦值為null,在去調(diào)用數(shù)組中的元素就會(huì)出現(xiàn)空指針異常.
   }
}

結(jié)果圖片:

效果

數(shù)組的遍歷:

循環(huán)數(shù)組中的每個(gè)數(shù)組元素。

使用foreach循環(huán),這種循環(huán)遍歷數(shù)組是非常方便的,foreach循環(huán)的格式如下:

for (type variableName : array ){
// 訪問每個(gè)元素
}

代碼案例:

public class ForeachTest {
public static void main(String[] args){
 String[] names = { “dashu”, “dashucoding”};
 // 使用foreach循環(huán)遍歷數(shù)組中的每個(gè)元素
 for(String name : names){
  System.out.println(name);
 }
}
}

代碼案例:

package com.dashucoding;/*
*  數(shù)組的遍歷:依次輸出數(shù)組中的每個(gè)元素
*  數(shù)組的屬性:arr.length數(shù)組的長度
*  數(shù)組的最大索引:arr.length-1;
* */
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr = {1122,3344,55};
       /*      System.out.println(arr[0]);
       System.out.println(arr[1]);
       System.out.println(arr[2]);
       System.out.println(arr[3]);
       System.out.println(arr[4]);*/

       
       for(int i = 0; i < arr.length; i++) {
           System.out.println(arr[i]);
       }
       
       System.out.println('---------');
       
       // arr.length 代表數(shù)組的長度
       System.out.println(arr.length);
       
       System.out.println('---------');
       
       int[] arr2 = {1,2,3};
       print(arr2);
   }

   /*
    * 遍歷數(shù)組的方法
    * 返回值類型為void
    * 參數(shù)列表int[] arr
    * */

   private static void print(int[] arr) {
       // TODO Auto-generated method stub
       for(int i = 0;i<arr.length;i++) {
           System.out.println(arr[i]);
       }
   }

}

結(jié)果圖片:

效果

最大值

代碼案例:

package com.dashucoding;/*
* 數(shù)組
* 如何獲取數(shù)組的最大值
* */
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr = {23,3412,33};
       int max = getMax(arr);
       System.out.println(max);
   }
   
   /*
    * 獲取數(shù)組最大值
    * 返回值類型為int
    * 參數(shù)列表為int[] arr
    * */

   public static int getMax(int[] arr) {
       int max = arr[0];
       for (int i = 1; i < arr.length; i++) { // 從數(shù)組的第二個(gè)元素開始遍歷
           if(max < arr[i]) { // 如果max記錄的值小于數(shù)組中的元素,就max記錄記錄最大的
               max = arr[i];
           }
       }
       return max;
   }
}

結(jié)果圖:

效果

分析制圖:

效果

數(shù)組的操作反轉(zhuǎn):

操作反轉(zhuǎn),就是前后倒置

package com.dashucoding;/*
* 數(shù)組
* 如何獲取數(shù)組的最大值
* */
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr = {22,33,44,55};
       reverseArray(arr);
       print(arr);
   }
       /*
        * 數(shù)組元素的反轉(zhuǎn)
        * 返回值類型void
        * 明確參數(shù)列表int[] arr
        * */

   public static void reverseArray(int[] arr) {
       for(int i=0; i < arr.length / 2; i++) {
           // arr[0] 第一個(gè) 和 arr[arr.length-1-0] 最后一個(gè) 交換
           // arr[1] 和 arr[arr.length-1-1] 交換
           // arr[2] 和 arr[arr.length-1-2] 交換
           // ...
           
           /*int temp = arr[0];
           arr[0] = arr[arr.length-1];
           arr[arr.length-1] = temp;*/

           
           int temp = arr[i];
           arr[i] = arr[arr.length-1-i];
           arr[arr.length-1-i] = temp;
           
       }
   }
   
   /*
    * 數(shù)組遍歷
    * 明確返回值類型void
    * 明確參數(shù)列表int[] arr
    * */

   public static void print(int[] arr) {
       for(int i = 0; i < arr.length; i++) {
           System.out.print(arr[i] + ' ');
       }
   }
}

結(jié)果圖片:

效果

根據(jù)鍵盤錄入索引,查找對(duì)應(yīng)的星期:

代碼案例:

package com.dashucoding;
import java.util.Scanner;
/*
* 數(shù)組
* 如何進(jìn)行數(shù)組查表(根據(jù)鍵盤錄入索引,查找對(duì)應(yīng)的星期)
* */
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       System.out.println('星期' + getWeek(2));
       
       System.out.println('----------');
       
       // 鍵盤錄入
       Scanner sc = new Scanner(System.in);
       System.out.println('請輸入對(duì)應(yīng)的星期范圍,對(duì)應(yīng)1至7');
       int week = sc.nextInt();
       System.out.println('星期' + getWeek(week));
   }
   
   /*
    * 根據(jù)索引返回對(duì)應(yīng)的星期
    * 返回值的類型char
    * 能存儲(chǔ)中文的char
    * 參數(shù)列表int week
    * 通過索引獲取數(shù)組中的元素
    * */

   public static char getWeek(int week) {
       char[] arr = {' ','一','二','三','四','五','六','日'}; // 定義一張星期表
       return arr[week]; // 通過索引獲取數(shù)組中的元素
   }
}

數(shù)組元素查找:

package com.dashucoding;
import java.util.Scanner;
/*
* 數(shù)組
* 數(shù)組元素查找
* 查找指定元素第一次在數(shù)組中出現(xiàn)的索引
* */
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[] arr = {11,22,33,44,55};
       int index = getIndex(arr,22);
       System.out.println(index);
       
       System.out.println('----------');
       
       int index2 = getIndex(arr,10);
       System.out.println(index2);
   }
   
   /*
    * 查找元素索引
    * 返回值類型int
    * 參數(shù)列表int[] arr, 要查找的值int value
    * */

   public static int getIndex(int[] arr, int value) {
       for(int i = 0; i < arr.length; i++) { // 數(shù)組的遍歷
           if(arr[i] == value) { // 如果數(shù)組中的元素與查找元素匹配,就是這個(gè)元素
               return i; // 返回索引
           }
       }
       // 如果沒有查到,沒找到返回給你一個(gè)-1,如果返回值為-1,就知道沒在數(shù)組中找到
       return -1;
   }
}

結(jié)果圖片:

效果

二維數(shù)組的格式:

int[][] arr = new int[3][2];

表示二維數(shù)組的格式:

數(shù)據(jù)類型 數(shù)組名[][] = new 數(shù)據(jù)類型[m][n];
數(shù)據(jù)類型[] 數(shù)組名[] = new 數(shù)據(jù)類型[m][n];
// 建議這么寫
int[][] arr = new int[3][2];
// 一維數(shù)組
int[] x; // 二維數(shù)組int[] x,y[];int[] y[];

二維數(shù)組案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       /*
        * 二維數(shù)組
        * 二維數(shù)組中有3個(gè)一維數(shù)組
        * 每個(gè)一維數(shù)組中有2個(gè)元素
        * */

       int[][] arr = new int[3][2];
       // 打印二維數(shù)組
       System.out.println(arr);
       // 打印二維數(shù)組中的第一個(gè)一維數(shù)組
       System.out.println(arr[0]);
       // 打印二維數(shù)組中的第一個(gè)一維數(shù)組的第一個(gè)元素
       System.out.println(arr[0][0]);
       
       // 打印結(jié)果
       /*
        * [[I@7852e922 // 二維數(shù)組的地制值
        * [I@4e25154f // 一維數(shù)組的地址值
        * 0 // 元素值
        * */

   }
}

結(jié)果圖片:

效果

二維數(shù)組:

package com.dashucoding;
import java.util.Scanner;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       int[][] arr = new int[3][2];
       
       System.out.println(arr);
       System.out.println(arr[0]);
       System.out.println(arr[0][0]);
   }
}

內(nèi)存分析:

效果

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 二維數(shù)組,二維數(shù)組中有3個(gè)一維數(shù)組,三個(gè)一維數(shù)組都沒有被賦值
       int[][] arr = new int[3][];
       // 打印二維數(shù)組中的三個(gè)一維數(shù)組
       System.out.println(arr[0]);
       System.out.println(arr[1]);
       System.out.println(arr[2]);
       
       arr[0] = new int[3]; // 第一個(gè)一維數(shù)組中存儲(chǔ)三個(gè)int值
       arr[1] = new int[5]; // 第二個(gè)一維數(shù)組中存儲(chǔ)五個(gè)int值
       
       System.out.println('-----');
       
       // 打印二維數(shù)組中的三個(gè)一維數(shù)組
       System.out.println(arr[0]);
       System.out.println(arr[1]);
       System.out.println(arr[2]);
   }
}

結(jié)果圖片:

效果

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 二維數(shù)組,二維數(shù)組中有3個(gè)一維數(shù)組,三個(gè)一維數(shù)組都沒有被賦值
       int[][] arr = new int[3][];
       // 打印二維數(shù)組中的三個(gè)一維數(shù)組
       System.out.println(arr[0]);
       System.out.println(arr[1]);
       System.out.println(arr[2]);
   }
}

分析內(nèi)存圖:

效果

二維數(shù)組格式:

int[][] arr = { {12,3}, {4,5}, {6,7,8,9} };

代碼案例:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 二維數(shù)組
       int[][] arr = { {12,3}, {45}, {6,7,8,9} };
       System.out.println(arr); //二維數(shù)組的地址值
       System.out.println(arr[0]); //一維數(shù)組的地址值
       System.out.println(arr[0][0]); //元素
   }
}

結(jié)果圖:

效果

內(nèi)存分析圖:

效果

二維數(shù)據(jù)的遍歷:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 二維數(shù)組的遍歷
       int[][] arr = { {1,23}, {4,5}, {6,7,8,9} };
       for(int i = 0; i < arr.length; i++) {
           // 獲取每個(gè)二維數(shù)組中的一維數(shù)組
           // 獲取一維數(shù)組中的元素
           for(int j = 0; j < arr[i].length; j++) {
               System.out.print(arr[i][j] + ' ');
           }
           System.out.println();
       }
   }
}

結(jié)果圖:

效果

二維數(shù)組的求和:

package com.dashucoding;
public class DemoArray {

   public static void main(String[] args) {
       // TODO Auto-generated method stub
       // 二維數(shù)組求和
       int[][] arr = { {1,23}, {4,56}, {78,9} };
       int sum = 0;
       for(int i = 0; i < arr.length; i++) {
           // 獲取每個(gè)一維數(shù)組
           for(int j = 0; j < arr[i].length; j++) {
               //獲取每個(gè)一維數(shù)組
               sum = sum + arr[i][j];
           }
       }
       System.out.println(sum);
   }
}

結(jié)果圖:

效果

基本數(shù)據(jù)類型的值傳遞,不會(huì)改變原值,因?yàn)檎{(diào)用后會(huì)彈棧,局部變量就會(huì)隨之消失,而引用數(shù)據(jù)類型的值傳遞,會(huì)改變原值,因?yàn)槭褂梅椒◤棗?,但是堆?nèi)存數(shù)組對(duì)象還在,可以通過地址繼承訪問。

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

代碼案例:

// 打印數(shù)組public static void printArray(int[] arr){
for(int x=0;x<arr.length;x++)
{
   if(x!=arr.length-1){
    System.out.print(arr[x]+',');
   }else{
    System.out.print(arr[x]);
   }
 }
}

數(shù)組轉(zhuǎn)字符串:

// 數(shù)組轉(zhuǎn)換成為字符串// 結(jié)果返還為字符串,參數(shù)為數(shù)組public static String toString (int[] arr){
// 定義字符串變量
String temp = '[';
for(int x = 0; x<arr.length; x++){
 // 判斷是否為最后一位元素
 if(x != arr.length - 1){
  temp = temp + arr[x] + ',';
 }else{
   temp = temp + arr[x] + ']';
  }
}
}
public static String getWeek(int num){
String[] weeks = { '1', '2', '3', '4', '5', '6', '7' };
if(num>7 || num<1){
 return num + '沒有對(duì)應(yīng)的星期';
}
return weeks[num];
}

選擇排序

選擇排序是第一個(gè)人和后續(xù)排序的人進(jìn)行比較,若第一個(gè)人大于第二個(gè)人,就進(jìn)行交換,那么這時(shí)第一人就是最小的,然后這時(shí)的第一個(gè)人和第三個(gè)人進(jìn)行比較,若這時(shí)的第一個(gè)人大于第三個(gè)人,就進(jìn)行交換位置,這時(shí)第一個(gè)人又換人了,也變得更小了,就這樣,把剩下的人以這種方法進(jìn)行比較,直到最后,第一輪結(jié)束,在第一位的就是最小的值。

這種就是排序算法,比如有6個(gè)人,第一輪要進(jìn)行5次比較。小的值往前跑嘛。

//第一輪  for(int index=1;index<arr.length;index++)  
{  if(arr[0]>arr[index])  
{  
 int temp = arr[0];  
 arr[0] = arr[index];  
 arr[index] = temp;  
}  
}  
print(arr);  
 //第二輪  for(int index=2;index<arr.length;index++)  
{  if(arr[1]>arr[index])  
{  
 int temp = arr[1];  
 arr[1] = arr[index];  
 arr[index] = temp;  
}  
}  
print(arr);  
 //第三輪  for(int index=3;index<arr.length;index++)  
{  if(arr[2]>arr[index])  
{  
 int temp = arr[2];  
 arr[2] = arr[index];  
 arr[index] = temp;  
}  
}  
print(arr);  
 //第四輪  for(int index=4;index<arr.length;index++)  
{  if(arr[3]>arr[index])  
{  
 int temp = arr[3];  
 arr[3] = arr[index];  
 arr[index] = temp;  
}  
}  
print(arr);  
 //第五輪  for(int index=5;index<arr.length;index++)  
{  if(arr[4]>arr[index])  
{  
 int temp = arr[4];  
 arr[3] = arr[index];  
 arr[index] = temp;  
}  
}  
print(arr);  
 //第六輪沒有,我們arr.length=6舉例  //int index = 6;index<arr.length; false

優(yōu)化:

public static void selectionSort(int[] arr)  {  
for(int count=1;count<arr.length;count++)  
{  
for(int index=count;index<arr.length;index++)  
{  
 if(arr[count-1]>arr[index])  
 {  
   int temp = arr[count-1];  
   arr[count-1] = arr[index];  
   arr[index] = temp;  
 }  
}  
}  
for(int x = 0;x<arr.length-1;x++)
{
for(int y=x+1;y<arr.length;y++){
 if(arr[x]>arr[y]){
   int temp = arr[x];
   arr[x] = arr[y];
   arr[y] = temp;
 }
}
}

冒泡排序

為什么這個(gè)排序要叫冒泡呢?為什么不叫其他名詞呢?

其實(shí)這個(gè)取名是根據(jù)排序算法的基本思路命名的,見名知意,冒泡排序,就是想泡泡在水里一樣,在水里大的泡泡先浮出水面,就是大的先排出來,最小的最慢排出。

冒泡排序,是對(duì)排序的各個(gè)元素從頭到尾依次進(jìn)行相鄰的大小比較,比如你是隊(duì)長,在你的面前有一排人,你要將其進(jìn)行排序,依次按照從小到大排序。

怎么理解最大的值被排除,你是隊(duì)長,你對(duì)面前的一群人看不慣,進(jìn)行排序,從左到右開始,第一個(gè)和第二個(gè)進(jìn)行比較,大的那個(gè)就被挑出來,與第三個(gè)進(jìn)行比較,接下來就是依次按照這個(gè)方法比較,就能把那個(gè)最大的值,最高的給挑出來不是,這就是第一輪的比較。

接下來,最大的就不用跟他比較了,上面所述,在排序時(shí),你面前的人,是不能亂動(dòng)的,一旦比較哪個(gè)大,兩者就換位,如果第一比第二個(gè)小,就是第二個(gè)大時(shí),兩者不用換位,第二個(gè)就與第三個(gè)進(jìn)行比較。

依照這個(gè)方法,兩兩比較,大的都被排到了最后,那么一旦排完,是不是都依照從小到大,(從低到高)的順序在你面前排好了。

代碼示例

我們用索引下標(biāo)來解釋

//第一輪  for(int index=0;index < arr.length-1; index++){  //相鄰兩個(gè)比較  
if(arr[index] > arr[index+1]){  
  int temp = arr[index];  
  arr[index] = arr[index+1];  
  arr[index+1] = temp;  
}  
}  
 
print(arr);  
 for(int index=0;index < arr.length-2;index++){  //這里arr.length-2,為什么比上一次多減了1呢?  //因?yàn)榈谝惠?,把最大的排出來了,就不用比較了,少了一個(gè)人  
if(arr[index] > arr[index+1]){  
  int temp = arr[index];  
  arr[index] = arr[index+1];  
  arr[index+1] = temp;  
}  
}  
 
print(arr);  
 for(int index=0;index < arr.length-3;index++){  
if(arr[index]>arr[index+1]){  
  int temp = arr[index];  
  arr[index] = arr[index+1];  
  arr[index+1] = temp;  
}  
}  
 
print(arr);

優(yōu)化:

for(int num=1;num<arr.length;num++){  
 
for(int index=0;index<arr.length-num;index++){  
 
  if(arr[index]>arr[index+1]){  
    int temp = arr[index];  
    arr[index] = arr[index+1];  
    arr[index+1] = temp;  
  }  
}  
}  
for(int x=0;x<arr.length-1;x++){
for(int y=0;y<arr.length-1-x;y++){
 if(arr[y]>arr[y+1]){
  int temp = arr[y];
  arr[y] = arrp[y+1];
  arr[y+1] = temp;
  }
 }
}

二分查找,折半查找

什么是二分查找,折半查找呢?就是我說一個(gè)數(shù),你來猜,你答一個(gè)數(shù),我說大了,或小了,直到找到為止。

public static int searchKey(int[] arr, int key){
for(int x=0;x<arr.length;x++){
  if(arr[x] == key){
   rerurn x;
  }
 return -1;
 }
}

二分

public static int binarySearch(int[] arr, int key){
int max,min,mid;
min = 0;
max = arr.length - 1;
mid = (max+min)>>1;

while(arr[mid] != key){
 if(key>arr[mid]){
   min = mid + 1;
 }else if(key<arr[mid])
   max = mid - 1;

  mid = (max+min)>>1;
 }
return mid;
}
}
public static int binarySearch(int[] arr, int key){
int max, min , mid;
min = 0;
max = arr.length - 1;

while(min <= max)
{
  mid = (min+max)>>1;
  if(key>arr[mid]){
   min = mid + 1;
  }else if(key < arr[mid])
   max = mid - 1;
  } else {
   return mid;
}
return -1;
}

二維數(shù)組

格式:

int[][] arr = new int[2][3];
int[][] arr = { {3,5,6}, {33,44,66}, {23,21,6} };
for(int x=0; x<arr.length; x++){
for(int y=0; y<arr[x].length; y++){
  sum += arr[x][y];
 }
}
public static void revese(int[] arr){
for(int start=0, end = arr.length-1; start<end; start++,end--){
 swap(arr,start,end);
}
}
public static void swap(int[] arr, int a, int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}

本章小結(jié)

本章主要介紹了數(shù)組的定義,初始化,使用等基本知識(shí),結(jié)合了大量的分析內(nèi)存圖用來分析數(shù)組在內(nèi)存中的運(yùn)行機(jī)制,數(shù)組的引用變量和數(shù)組直接的關(guān)系,大量講解多維數(shù)組的實(shí)質(zhì)性問題,文章中給出了多種代碼案例來展示數(shù)組的運(yùn)用擴(kuò)展。

結(jié)言

好了,歡迎在留言區(qū)留言,與大家分享你的經(jīng)驗(yàn)和心得。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多