2021-07-26 尚硅谷_數(shù)組

1彤委、數(shù)組的概念

數(shù)組是多個(gè)相同類(lèi)型數(shù)據(jù)一定順序排列的集合鞭铆,并使用一個(gè)名字命名,并通過(guò)編號(hào)的方式對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一管理焦影。

特點(diǎn):
1.數(shù)組是有序排列的衔彻。
2.數(shù)組屬于引用數(shù)據(jù)類(lèi)型的變量。數(shù)組的元素偷办,既可以是基本數(shù)據(jù)類(lèi)型,也可以是引用數(shù)據(jù)類(lèi)型澄港。
3.創(chuàng)建數(shù)組對(duì)象會(huì)在內(nèi)存中開(kāi)辟一整塊連續(xù)的空間椒涯。
4.數(shù)組的長(zhǎng)度一旦確定,就不能修改回梧。

2废岂、一維數(shù)組的使用

2.1 一維數(shù)組的聲明和初始化
  • 靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時(shí)進(jìn)行。
int[] ids = new int[]{1001, 1002, 1003, 1004};
  • 動(dòng)態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作分開(kāi)進(jìn)行狱意。
String[] names = new String[5];
  • 也是正確的寫(xiě)法(不是標(biāo)準(zhǔn)的寫(xiě)法)
int ids[] = {1001, 1002, 1003, 1004};
int[] ids = {1001, 1002, 1003, 1004}; // 不加new湖苞,類(lèi)型推斷

總結(jié):數(shù)組一旦初始化完成,其長(zhǎng)度就確定了详囤。

2.2 如何調(diào)用數(shù)組的指定位置的元素
names[0] = "姓名一";
names[1] = "姓名二";
names[2] = "姓名三";
names[3] = "姓名四";
names[4] = "姓名五";
2.3 如何獲取數(shù)組的長(zhǎng)度

屬性:length

System.out.println(names.length); // 5
2.4 如何遍歷數(shù)組
for (int i = 0; i < names.length; i++) {
  System.out.println(names[i]);
}
2.5 數(shù)組元素的默認(rèn)初始化值
  • 數(shù)組元素是整型時(shí)财骨,默認(rèn)初始化值是0镐作。·
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]); // 0 0 0 0
}
  • 數(shù)組元素是浮點(diǎn)型時(shí)隆箩,默認(rèn)初始化值是0.0该贾。
float[] arr1 = new float[4];
for (int i = 0; i < arr1.length; i++) {
  System.out.println(arr1[i]); // 0.0
}
  • char類(lèi)型,默認(rèn)初始化值是ASSIC碼為0對(duì)應(yīng)的那個(gè)字符捌臊,為0'\u000'杨蛋,而非'0'
char[] arr2 = new char[4];
arr2[0] == 0; // true
  • 數(shù)組元素是boolean時(shí)理澎,默認(rèn)初始化值是false逞力。
  • 數(shù)組元素是引用數(shù)據(jù)類(lèi)型時(shí),默認(rèn)初始化值是null糠爬。
2.6 數(shù)組的內(nèi)存解析

內(nèi)存結(jié)構(gòu)(JVM當(dāng)中實(shí)現(xiàn)的)寇荧,所以,不同的jdk當(dāng)中秩铆,內(nèi)存的結(jié)構(gòu)也有所區(qū)別砚亭。以下講解一個(gè)比較穩(wěn)定的結(jié)構(gòu)。

列舉內(nèi)存當(dāng)中幾個(gè)主要的結(jié)構(gòu):

  • 棧(stack):主要存放局部變量
  • 堆(heap):主要存放new出來(lái)的結(jié)構(gòu)殴玛,如數(shù)組捅膘、對(duì)象。
  • 方法區(qū)滚粟,包含常量池寻仗,靜態(tài)域(靜態(tài)的一些變量),和一些類(lèi)加載的信息凡壤。

3署尤、二維數(shù)組的使用

3.1 二維數(shù)組的聲明和初始化
  • 靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時(shí)進(jìn)行。
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
  • 動(dòng)態(tài)初始化1:數(shù)組的初始化和數(shù)組元素的賦值操作分開(kāi)進(jìn)行亚侠。
String[][] arr1 = new String[3][2];
  • 動(dòng)態(tài)初始化2:數(shù)組的初始化和數(shù)組元素的賦值操作分開(kāi)進(jìn)行曹体。
String[][] arr1 = new String[3][];
  • 也是正確的寫(xiě)法(不是標(biāo)準(zhǔn)的寫(xiě)法)
int arr2[][] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr3[] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr4[] = {{1, 2, 3}, {4, 5}, {6, 7, 8}};

總結(jié):數(shù)組一旦初始化完成,其長(zhǎng)度就確定了硝烂。

3.2 如何調(diào)用數(shù)組的指定位置的元素
System.out.println(arr[0][0]);

String[][] arr1 = new String[3][];
// 報(bào)錯(cuò)
// System.out.println(arr1[0][0]);
3.3 如何獲取數(shù)組的長(zhǎng)度

屬性:length

3.4 如何遍歷二維數(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.println(arr[i][j]);
  }
}
3.5 數(shù)組元素的默認(rèn)初始化值

規(guī)定:二維數(shù)組分為外層數(shù)組的元素箕别,內(nèi)層數(shù)組的元素。

int[][] arr = new int[4][3];
// 外層元素:arr[0], arr[1]等
// 內(nèi)層元素:arr[0][0], arr[1][2]等
  • 針對(duì)初始化方式一滞谢,比如:int[][] arr = new int[4][3];
    外層元素的初始化值為:地址值串稀。
    內(nèi)層元素的初始化值為:與一維數(shù)組初始化情況相同。
  • 針對(duì)初始化方式二狮杨,比如:int[][] arr = new int[4][];
    外層元素的初始化值為:null母截。
    內(nèi)層元素的初始化值為:不能調(diào)用,否則報(bào)錯(cuò)橄教。
3.6 二維數(shù)組的內(nèi)存解析

4清寇、練習(xí)

4.1 使用二維數(shù)組打印一個(gè)10行的楊輝三角
int [][] arr = new int[10][];
for (int i = 0; i < 10; i++) {
  arr[i] = new int[i + 1];
  arr[i][0] = arr[i][i] = 1;
  for (int j = 0; j <= i; j++) {
     if ( j == 0 || j == i) {
       System.out.print(1);
     }
     if (i > 1) {
       int num = arr[i - 1][j - 1] + arr[i - 1][j];
       System.out.print(num);
       arr[i][j] = num;
     }
  }
  System.out.println();
}

5喘漏、數(shù)組中涉及到的常見(jiàn)算法

5.1 數(shù)組元素的賦值(楊輝三角、回形數(shù)等)
5.2 求數(shù)值型數(shù)組中元素的最大值颗管、最小值陷遮、平均數(shù)、總和等
5.3 數(shù)組的復(fù)制垦江、反轉(zhuǎn)帽馋、查找(線(xiàn)性查找、二分查找)
  • 線(xiàn)性查找——從前往后依次查找
5.4 數(shù)組元素的排序算法
  • 冒泡排序
int[] arr = new int[]{43, 32, 76, -98, 0, 64, 33, -21, 32, 99};
for(int i = 0; i < arr.length - 1; i++){
  for(int j=0; j< arr.length - 1 - i; j++){
    if (arr[j] > arr[j + 1]) {
        int temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
    }
  }
}

6比吭、Arrays工具類(lèi)的使用

java.util.Arrays類(lèi)即為操作數(shù)組的工具類(lèi)绽族,包含了用來(lái)操作數(shù)組(比如排序和搜索)的各種方法。

  • boolean equals(int[] a, int[] b):判斷兩個(gè)數(shù)組是否相等衩藤。
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
// 比較每個(gè)位置上的元素是否都相等
Arrays.equals(arr1, arr2); // false
  • String toString(int[] a):輸出數(shù)組信息吧慢。
Arrays.toString(arr1); // [1, 2, 3, 4] 字符串類(lèi)型
  • void fill(int[] a, int val):將指定值填充到數(shù)組之中。
Arrays.fill(arr1, 10); // [10, 10, 10, 10]
  • void sort(int[] a):對(duì)數(shù)組進(jìn)行排序赏表。
Arrays.sort(arr2); // [1, 2, 3, 4]
  • int binarySearch(int[] a, int key):對(duì)排序后的數(shù)組進(jìn)行二分法檢索指定的值检诗。
    說(shuō)明:返回指定元素對(duì)應(yīng)的下標(biāo);沒(méi)有找到指定元素時(shí)瓢剿,會(huì)返回一個(gè)負(fù)數(shù)逢慌。因此,可以根據(jù)返回值是否 >= 0來(lái)判斷是否找到該元素间狂。
int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
int index = Arrays.binarySearch(arr3, 210); // 8

7攻泼、數(shù)組中常見(jiàn)的異常

  • 數(shù)組角標(biāo)越界的異常:ArrayIndexOutOfBoundsExcetion
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(arr[4]);
System.out.println(arr[-2]);
  • 空指針異常:NullPointerException
// 情況一:
int[] arr1 = new int[]{1, 2, 3};
arr1 = null;
System.out.println(arr1[0]);

// 情況二:
int[][] arr2 = new int[4][];
System.out.println(arr2[0][0]);

// 情況三:
String[] arr3 = new String[]{"AA", "BB", "CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鉴象,隨后出現(xiàn)的幾起案子忙菠,更是在濱河造成了極大的恐慌,老刑警劉巖纺弊,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牛欢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淆游,警方通過(guò)查閱死者的電腦和手機(jī)傍睹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稽犁,“玉大人,你說(shuō)我怎么就攤上這事骚亿∫押ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵来屠,是天一觀(guān)的道長(zhǎng)虑椎。 經(jīng)常有香客問(wèn)我震鹉,道長(zhǎng),這世上最難降的妖魔是什么捆姜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任传趾,我火速辦了婚禮,結(jié)果婚禮上泥技,老公的妹妹穿的比我還像新娘浆兰。我一直安慰自己,他們只是感情好珊豹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布簸呈。 她就那樣靜靜地躺著,像睡著了一般店茶。 火紅的嫁衣襯著肌膚如雪蜕便。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天贩幻,我揣著相機(jī)與錄音轿腺,去河邊找鬼。 笑死丛楚,一個(gè)胖子當(dāng)著我的面吹牛族壳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸯檬,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼决侈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了喧务?” 一聲冷哼從身側(cè)響起赖歌,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎功茴,沒(méi)想到半個(gè)月后庐冯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坎穿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年展父,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玲昧。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栖茉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孵延,到底是詐尸還是另有隱情吕漂,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布尘应,位于F島的核電站惶凝,受9級(jí)特大地震影響吼虎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苍鲜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一思灰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧混滔,春花似錦洒疚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至愿伴,卻和暖如春肺魁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隔节。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工鹅经, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怎诫。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓瘾晃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幻妓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹦误,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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