java中的數(shù)組

java初級編程——數(shù)組

數(shù)組的概述

   /*
 * 一、數(shù)組的概述
 * 1.數(shù)組的理解:數(shù)組(Array)尾序,是多個相同類型數(shù)據(jù)按一定順序排列的集合抒巢,并使用一個名字命名,
 * 并通過編號的方式對這些數(shù)據(jù)進行統(tǒng)一管理。
 * 
 * 2.數(shù)組相關(guān)的概念:
 * >數(shù)組名
 * >元素
 * >角標再来、下標鹰霍、索引
 * >數(shù)組的長度:元素的個數(shù)
 * 
 * 3.數(shù)組的特點:
 * 1)數(shù)組是有序排列的
 * 2)數(shù)組屬于引用數(shù)據(jù)類型的變量闻鉴。數(shù)組的元素,既可以是基本數(shù)據(jù)類型茂洒,也可以是引用數(shù)據(jù)類型
 * (引用類型一般都是通過new關(guān)鍵字創(chuàng)建對象孟岛,然后把這個對象賦予給相應(yīng)的變量,最常用的引用類型是String類型)
 * 3)創(chuàng)建數(shù)組對象會在內(nèi)存中開辟一整塊連續(xù)的空間 
 * 4)數(shù)組的長度一旦確定督勺,就不能修改渠羞。
 * 
 * 4. 數(shù)組的分類:
 *   ① 按照維數(shù):一維數(shù)組、二維數(shù)組智哀、次询。。瓷叫。
 *   ② 按照數(shù)組元素的類型:基本數(shù)據(jù)類型元素的數(shù)組屯吊、引用數(shù)據(jù)類型元素的數(shù)組
 * 
 * 5. 一維數(shù)組的使用
 *   ① 一維數(shù)組的聲明和初始化
 *   ② 如何調(diào)用數(shù)組的指定位置的元素
 *   ③ 如何獲取數(shù)組的長度
 *   ④ 如何遍歷數(shù)組
 *   ⑤ 數(shù)組元素的默認初始化值 :見ArrayTest1.java
 *   ⑥ 數(shù)組的內(nèi)存解析 :見ArrayTest1.java
 */
public class ArrayTest {
    
    public static void main(String[] args) {
        
        //1. 一維數(shù)組的聲明和初始化
        int num;//聲明
        num = 10;//初始化
        int id = 1001;//聲明 + 初始化
        
        int[] ids;//聲明
        //1.1 靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時進行
        ids = new int[]{1001,1002,1003,1004};
        //1.2動態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作分開進行
        //動態(tài)語句僅僅是指定數(shù)組內(nèi)元素個數(shù),未對數(shù)組元素的賦值
        String[] names = new String[5];
        
        //錯誤的寫法:
//      int[] arr1 = new int[];
//      int[5] arr2 = new int[5];
//      int[] arr3 = new int[3]{1,2,3};
        //前面的中括號應(yīng)該是空著的
        
    
        //也是正確的寫法:
        int[] arr4 = {1,2,3,4,5};//類型推斷
        
        //總結(jié):數(shù)組一旦初始化完成赞辩,其長度就確定了雌芽。
        
        //2.如何調(diào)用數(shù)組的指定位置的元素:通過角標的方式調(diào)用。
        //數(shù)組的角標(或索引)從0開始的辨嗽,到數(shù)組的長度-1結(jié)束世落。
        names[0] = "王銘";
        names[1] = "王赫";
        names[2] = "張學良";
        names[3] = "孫居龍";
    names[4] = "王宏志";//charAt(0)
    //      names[5] = "周揚";從語法上可以過
        
        //3.如何獲取數(shù)組的長度。
        //屬性:length
        System.out.println(names.length);//5
        System.out.println(ids.length);
        
        //4.如何遍歷數(shù)組
        /*System.out.println(names[0]);
        System.out.println(names[1]);
        System.out.println(names[2]);
        System.out.println(names[3]);
        System.out.println(names[4]);*/
        
        for(int i = 0;i < names.length;i++){
            System.out.println(names[i]);
        }
    
        
    }

}

數(shù)組的初始化

/*
 * ⑤ 數(shù)組元素的默認初始化值
 *      > 數(shù)組元素是整型:0(int,short,byte,long)
 *      > 數(shù)組元素是浮點型:0.0(float,double)
 *      > 數(shù)組元素是char型:0或'\u0000',而非'0'
 *      > 數(shù)組元素是boolean型:false
 * 
 *      > 數(shù)組元素是引用數(shù)據(jù)類型(比如字符串):null
 *  
 *  ⑥ 數(shù)組的內(nèi)存解析
 */
public class ArrayTest1 {
    
    public static void main(String[] args) {
        //5.數(shù)組元素的默認初始化值
//      沒有輔助屉佳,是系統(tǒng)默認的值
//      默認初始化值肯定要動態(tài)賦值
        int[] arr = new int[4];
        for(int i = 0;i < arr.length;i++){
            System.out.println(arr[i]);
        }
        System.out.println("**********");
        
        short[] arr1 = new short[4];
        for(int i = 0;i < arr1.length;i++){
            System.out.println(arr1[i]);
        }
        System.out.println("**********");
        float[] arr2 = new float[5];
        for(int i = 0;i < arr2.length;i++){
            System.out.println(arr2[i]);
        }
        
        System.out.println("**********");
        char[] arr3 = new char[4];
        for(int i = 0;i < arr3.length;i++){
            System.out.println("----" + arr3[i] + "****");
        }
//      此處結(jié)果的空格僅僅是效果谷朝,實際仍然是0
        if(arr3[0] == 0){
            System.out.println("你好!");
        }
        
        System.out.println("**********");
        boolean[] arr4 = new boolean[5];
        System.out.println(arr4[0]);
        
        System.out.println("**********");
        String[] arr5 = new String[5];
        System.out.println(arr5[0]);
        if(arr5[0] == null){
            System.out.println("北京天氣不錯武花!");
        }
    }

}

簡單的內(nèi)存結(jié)構(gòu)

  • 棧(stack):
    • 線性圆凰,一維
    • 存放局部變量
  • 堆(heap)
    • 存放new定義的結(jié)構(gòu):對象、數(shù)組
  • 方法區(qū):
    • 常量池
    • 靜態(tài)域
內(nèi)存的簡化結(jié)構(gòu)

一維數(shù)組的內(nèi)存解析

//棧結(jié)構(gòu)和對結(jié)構(gòu)
//arr在main方法中体箕,放在方法中的變量都叫局部變量专钉,局部變量放在stack中
//new的結(jié)構(gòu)在heap里,有一個長度是3的結(jié)構(gòu)累铅,且在內(nèi)存中連續(xù)存儲
//heap空間中跃须,連續(xù)的元素有首地址值
//把heap空間中的首地址值賦給stack空間的arr
//stack空間的arr通過地址值可以找到堆空間的數(shù)組了
int[] arr = new int[]{1,2,3};

//new的結(jié)構(gòu)在heap里,有一個長度是4的結(jié)構(gòu)娃兽,且在內(nèi)存中連續(xù)存儲,默認值是null(空值)
//heap空間中菇民,連續(xù)的元素有首地址值
//把heap空間中的首地址值賦給stack空間的arr1

String[] arr1 = new String[4];

//德華賦給長度為4的第2個位置;學友賦給第3個位置
arr1[1] = "德華";
arr1[2] = "學友";

//將原來的首位置值改成新賦值的new的首位置值
arr1 = new String[3];
Syste.out.println(arr1[1]);//輸出null
//如果最后stack空間沒有變量調(diào)動heap空間投储,那么堆空間中的內(nèi)容就不會被調(diào)動第练,賦的值會被回收
//如果main方法中的變量全被執(zhí)行過了,那么heap中的變量就會全部沒用(回收)玛荞,arr1娇掏,2就會出stack==》相當于整個空間會被清空掉

一維數(shù)組使用練習

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[] { 8, 2, 1, 0, 3 };
        int[] index = new int[] { 2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3 };
        String tel = "";
        for (int i = 0; i < index.length; i++) {
            tel += arr[index[i]];
        }
        System.out.println("聯(lián)系方式:" + tel);//18...
    }

}

成績練習

import java.util.Scanner;

/*
 * 2. 從鍵盤讀入學生成績,找出最高分冲泥,并輸出學生成績等級驹碍。
        成績>=最高分-10    等級為’A’   
        成績>=最高分-20    等級為’B’
        成績>=最高分-30    等級為’C’   
        其余                               等級為’D’
        
        提示:先讀入學生人數(shù),根據(jù)人數(shù)創(chuàng)建int數(shù)組凡恍,存放學生成績志秃。

 * 
 */
public class ArrayExer1_1 {
    public static void main(String[] args) {
        //1.使用Scanner,讀取學生個數(shù)
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入學生人數(shù):");
        int number = scanner.nextInt();
        
        //2.創(chuàng)建數(shù)組嚼酝,存儲學生成績:動態(tài)初始化
        int[] scores = new int[number];
        //3.給數(shù)組中的元素賦值
        System.out.println("請輸入" + number + "個學生成績:");
        int maxScore = 0;
        for(int i = 0;i < scores.length;i++){
            scores[i] = scanner.nextInt();
            //4.獲取數(shù)組中的元素的最大值:最高分
            if(maxScore < scores[i]){
                maxScore = scores[i];
            }
        }
//      for(int i = 0;i < scores.length;i++){
//          if(maxScore < scores[i]){
//              maxScore = scores[i];
//          }
//      }
        
        //5.根據(jù)每個學生成績與最高分的差值浮还,得到每個學生的等級,并輸出等級和成績
        char level;
        for(int i = 0;i < scores.length;i++){
            if(maxScore - scores[i] <= 10){
                level = 'A';
            }else if(maxScore - scores[i] <= 20){
                level = 'B';
            }else if(maxScore - scores[i] <= 30){
                level = 'C';
            }else{
                level = 'D';
            }
            
            System.out.println("student " + i + 
                    " score is " + scores[i] + ",grade is " + level);
        }
        
    }
}

多維數(shù)組的使用

  • 如果說可以把一維數(shù)組當成幾何中的線性圖形闽巩,那么二維數(shù)組就相當于是一個表格钧舌,如Excel一樣。
  • 數(shù)組本身屬于引用數(shù)據(jù)類型涎跨,數(shù)組元素也可以是引用數(shù)據(jù)類型洼冻。---->數(shù)組元素也可以數(shù)數(shù)組
  • 對于二維數(shù)組,可以看成是一維數(shù)組array1又作為另一個一維數(shù)組array2的元素而存在隅很。其實撞牢,==從數(shù)組底層的運行機制來看,其實沒有所謂的多維數(shù)組==。
/*
 * 二維數(shù)組的使用
 * 
 * 1.理解:
 * 對于二維數(shù)組的理解屋彪,我們可以看成是一維數(shù)組array1又作為另一個一維數(shù)組array2的元素而存在所宰。
 * 其實,從數(shù)組底層的運行機制來看畜挥,其實沒有多維數(shù)組仔粥。
 * 
 * 2. 二維數(shù)組的使用:
 *   ① 二維數(shù)組的聲明和初始化
 *   ② 如何調(diào)用數(shù)組的指定位置的元素
 *   ③ 如何獲取數(shù)組的長度
 *   ④ 如何遍歷數(shù)組
 *   ⑤ 數(shù)組元素的默認初始化值 :見 ArrayTest3.java
 *   ⑥ 數(shù)組的內(nèi)存解析 :見 ArrayTest3.java
 * 
 * 
 */
public class ArrayTest2 {
    public static void main(String[] args) {
        //1.二維數(shù)組的聲明和初始化
        int[] arr = new int[]{1,2,3};//一維數(shù)組
        //靜態(tài)初始化
        int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
        //動態(tài)初始化1
        String[][] arr2 = new String[3][2];
        //動態(tài)初始化2
        String[][] arr3 = new String[3][];
        //錯誤的情況 
//      String[][] arr4 = new String[][4];
//      String[4][3] arr5 = new String[][];
//      int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
//      有長度就不賦值,不賦值就有長度
        //也是正確的寫法:
        int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
        int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//類型推斷
        
        //2.如何調(diào)用數(shù)組的指定位置的元素
        System.out.println(arr1[0][1]);//2
        System.out.println(arr2[1][1]);//null
        
        arr3[1] = new String[4];//arr3之前的定義僅僅空有三個元素蟹但,但每個元素內(nèi)沒有東西躯泰,調(diào)用會空指針報錯
//      此處定義String[4],是在原來arr3的第二個位置處定義4個元素
        System.out.println(arr3[1][0]);
        
        //3.獲取數(shù)組的長度
        System.out.println(arr4.length);//3
        System.out.println(arr4[0].length);//3
        System.out.println(arr4[1].length);//4
        
        //4.如何遍歷二維數(shù)組
        for(int i = 0;i < arr4.length;i++){
            
            for(int j = 0;j < arr4[i].length;j++){
                System.out.print(arr4[i][j] + "  ");
            }
            System.out.println();
        }
        
    }
}
/*
 * 二維數(shù)組的使用:
 *  規(guī)定:二維數(shù)組分為外層數(shù)組的元素,內(nèi)層數(shù)組的元素
 *      int[][] arr = new int[4][3];
 *      外層元素:arr[0],arr[1]等
 *      內(nèi)層元素:arr[0][0],arr[1][2]等
 * 
 *   ⑤ 數(shù)組元素的默認初始化值 
 *   針對于初始化方式一:比如:int[][] arr = new int[4][3];
 *      外層元素的初始化值為:地址值
 *      內(nèi)層元素的初始化值為:與一維數(shù)組初始化情況相同
 *      
 *   針對于初始化方式二:比如:int[][] arr = new int[4][];
 *      外層元素的初始化值為:null
 *      內(nèi)層元素的初始化值為:不能調(diào)用矮湘,否則報錯斟冕。
 *   
 *   ⑥ 數(shù)組的內(nèi)存解析 
 * 
 */
public class ArrayTest3 {
    public static void main(String[] args) {
        
        int[][] arr = new int[4][3];
        System.out.println(arr[0]);//[I@15db9742 地址
        System.out.println(arr[0][0]);//0
        
//      System.out.println(arr);//[[I@6d06d69c 兩個作中括號說明是int型
        
        System.out.println("*****************");
        float[][] arr1 = new float[4][3];
        System.out.println(arr1[0]);//地址值
        System.out.println(arr1[0][0]);//0.0
        
        System.out.println("*****************");
        
        String[][] arr2 = new String[4][2];
        System.out.println(arr2[1]);//地址值
        System.out.println(arr2[1][1]);//null,因為是String型
        
        System.out.println("*****************");
        double[][] arr3 = new double[4][];
        System.out.println(arr3[1]);//null缅阳,內(nèi)層沒有初始化過,但皆為數(shù)組景描,屬于引用類型十办,引用類型默認值都是null
//      System.out.println(arr3[1][0]);//報錯
        
    }
}

二維數(shù)組的內(nèi)存結(jié)構(gòu)

int[][]arr1 = new int[4][];
//內(nèi)層結(jié)構(gòu)沒寫,此時是int型的一維數(shù)組,未賦值超棺,外層結(jié)構(gòu)中顯示為null
arr1[1] = new int[]{1,2,3};
//定義第一個
內(nèi)層結(jié)構(gòu)(靜態(tài)賦值)向族,內(nèi)部為int型初始化,先為0棠绘,后賦值1,2,3
arr1[2] = new int[4];
//定義第二個內(nèi)層結(jié)構(gòu)(動態(tài)賦值)件相,內(nèi)部為int型初始化,為0氧苍,未賦值
arr1[2][1] = 30;
//定義第二個內(nèi)層結(jié)構(gòu)中第二個位置夜矗,賦值30
二維數(shù)組內(nèi)存解析

練習

1.寫出一維數(shù)組初始化的兩種方式
int[] arr = new int[5];//動態(tài)初始化

String[] arr1 = new String[]{"Tom","Jerry","Jim"};//靜態(tài)初始化

數(shù)組一旦初始化,其長度就是確定的让虐。arr.length
數(shù)組長度一旦確定紊撕,就不可修改。

2.寫出二維數(shù)組初始化的兩種方式
int[][] arr = new int[4][3];//動態(tài)初始化1
int[][] arr1 = new int[4][];//動態(tài)初始化2

int[][] arr2 = new int[][]{{1,2,3},{4,5,6},{7,8}};//靜態(tài)初始化

3.如何遍歷如下的二維數(shù)組
int[] arr = new int[][]{{1,2,3},{4,5},{6,7,8}};

for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}

4.不同類型的一維數(shù)組元素的默認初始化值各是多少

整型 : 0
浮點型:0.0
char:0
boolean :false
引用類型:null

5.一維數(shù)組的內(nèi)存解析:
String[] strs = new String[5];
strs[2] = “Tom”;
strs = new String[3];


內(nèi)存解析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赡突,一起剝皮案震驚了整個濱河市对扶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惭缰,老刑警劉巖浪南,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漱受,居然都是意外死亡络凿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喷众,“玉大人各谚,你說我怎么就攤上這事〉角В” “怎么了昌渤?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長憔四。 經(jīng)常有香客問我膀息,道長,這世上最難降的妖魔是什么了赵? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任潜支,我火速辦了婚禮,結(jié)果婚禮上柿汛,老公的妹妹穿的比我還像新娘冗酿。我一直安慰自己,他們只是感情好络断,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布裁替。 她就那樣靜靜地躺著,像睡著了一般貌笨。 火紅的嫁衣襯著肌膚如雪弱判。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天锥惋,我揣著相機與錄音昌腰,去河邊找鬼。 笑死膀跌,一個胖子當著我的面吹牛遭商,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淹父,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼株婴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暑认?” 一聲冷哼從身側(cè)響起困介,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘸际,沒想到半個月后座哩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡粮彤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年根穷,在試婚紗的時候發(fā)現(xiàn)自己被綠了姜骡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡屿良,死狀恐怖圈澈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尘惧,我是刑警寧澤康栈,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站喷橙,受9級特大地震影響啥么,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贰逾,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一悬荣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疙剑,春花似錦氯迂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轧简,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾二,已是汗流浹背哮独。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留察藐,地道東北人皮璧。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像分飞,于是被迫代替她去往敵國和親悴务。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容