2021-07-26 尚硅谷_数组

1、数组的概念

数组是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

特点:
1.数组是有序排列的。
2.数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
3.创建数组对象会在内存中开辟一整块连续的空间。
4.数组的长度一旦确定,就不能修改。

2、一维数组的使用

2.1 一维数组的声明和初始化
  • 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[] ids = new int[]{1001, 1002, 1003, 1004};
  • 动态初始化:数组的初始化和数组元素的赋值操作分开进行。
String[] names = new String[5];
  • 也是正确的写法(不是标准的写法)
int ids[] = {1001, 1002, 1003, 1004};
int[] ids = {1001, 1002, 1003, 1004}; // 不加new,类型推断

总结:数组一旦初始化完成,其长度就确定了。

2.2 如何调用数组的指定位置的元素
names[0] = "姓名一";
names[1] = "姓名二";
names[2] = "姓名三";
names[3] = "姓名四";
names[4] = "姓名五";
2.3 如何获取数组的长度

属性:length

System.out.println(names.length); // 5
2.4 如何遍历数组
for (int i = 0; i < names.length; i++) {
  System.out.println(names[i]);
}
2.5 数组元素的默认初始化值
  • 数组元素是整型时,默认初始化值是0。·
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]); // 0 0 0 0
}
  • 数组元素是浮点型时,默认初始化值是0.0
float[] arr1 = new float[4];
for (int i = 0; i < arr1.length; i++) {
  System.out.println(arr1[i]); // 0.0
}
  • char类型,默认初始化值是ASSIC码为0对应的那个字符,为0'\u000',而非'0'
char[] arr2 = new char[4];
arr2[0] == 0; // true
  • 数组元素是boolean时,默认初始化值是false
  • 数组元素是引用数据类型时,默认初始化值是null
2.6 数组的内存解析

内存结构(JVM当中实现的),所以,不同的jdk当中,内存的结构也有所区别。以下讲解一个比较稳定的结构。

列举内存当中几个主要的结构:

  • 栈(stack):主要存放局部变量
  • 堆(heap):主要存放new出来的结构,如数组、对象。
  • 方法区,包含常量池,静态域(静态的一些变量),和一些类加载的信息。

3、二维数组的使用

3.1 二维数组的声明和初始化
  • 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
  • 动态初始化1:数组的初始化和数组元素的赋值操作分开进行。
String[][] arr1 = new String[3][2];
  • 动态初始化2:数组的初始化和数组元素的赋值操作分开进行。
String[][] arr1 = new String[3][];
  • 也是正确的写法(不是标准的写法)
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}};

总结:数组一旦初始化完成,其长度就确定了。

3.2 如何调用数组的指定位置的元素
System.out.println(arr[0][0]);

String[][] arr1 = new String[3][];
// 报错
// System.out.println(arr1[0][0]);
3.3 如何获取数组的长度

属性:length

3.4 如何遍历二维数组
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 数组元素的默认初始化值

规定:二维数组分为外层数组的元素,内层数组的元素。

int[][] arr = new int[4][3];
// 外层元素:arr[0], arr[1]等
// 内层元素:arr[0][0], arr[1][2]等
  • 针对初始化方式一,比如:int[][] arr = new int[4][3];
    外层元素的初始化值为:地址值。
    内层元素的初始化值为:与一维数组初始化情况相同。
  • 针对初始化方式二,比如:int[][] arr = new int[4][];
    外层元素的初始化值为:null
    内层元素的初始化值为:不能调用,否则报错。
3.6 二维数组的内存解析

4、练习

4.1 使用二维数组打印一个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、数组中涉及到的常见算法

5.1 数组元素的赋值(杨辉三角、回形数等)
5.2 求数值型数组中元素的最大值、最小值、平均数、总和等
5.3 数组的复制、反转、查找(线性查找、二分查找)
  • 线性查找——从前往后依次查找
5.4 数组元素的排序算法
  • 冒泡排序
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工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

  • boolean equals(int[] a, int[] b):判断两个数组是否相等。
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
// 比较每个位置上的元素是否都相等
Arrays.equals(arr1, arr2); // false
  • String toString(int[] a):输出数组信息。
Arrays.toString(arr1); // [1, 2, 3, 4] 字符串类型
  • void fill(int[] a, int val):将指定值填充到数组之中。
Arrays.fill(arr1, 10); // [10, 10, 10, 10]
  • void sort(int[] a):对数组进行排序。
Arrays.sort(arr2); // [1, 2, 3, 4]
  • int binarySearch(int[] a, int key):对排序后的数组进行二分法检索指定的值。
    说明:返回指定元素对应的下标;没有找到指定元素时,会返回一个负数。因此,可以根据返回值是否 >= 0来判断是否找到该元素。
int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
int index = Arrays.binarySearch(arr3, 210); // 8

7、数组中常见的异常

  • 数组角标越界的异常: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());
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容