第4章 数组

1. 数组的概念

数组:一组无序的同类数据,在内存中连续存放形成的一种数据结构
与数组对应的另一个基本数据结构是:链表
链表:一组无序的同类数据,在内存中分散存放形成的一种数据结构

2. 一维数组的声明和使用

一维数组是一种“线性结构”

2.1 一维数组的声明和初始化
  • 声明
int[] a;

int a[];

推荐使用第一种方式

  • 初始化
    数组的特点:定长的,初始化后不可更改长度,要求在初始化时必须指定长度(最大存储量)
    示例1:声明了一个可以最多存储5个数字的数组,此时没有指定具体数字,int类型默认值为0,数组中相当于存储了5个“0”。
int[] a = new int[5];

示例2:声明了一个可以最多存储5个数字的数组,此时指定了具体的数字分别是1,2,5,12和7

int[] b = {1,2,5,12,7};
int[] c = new int[]{1,2,5,12,7};
2.2 一维数组的访问

需要通过下标去访问数组中的某个元素
下标:从0开始,下标最大值是(数组的长度-1) [0, 最大长度-1]
示例3:查看数组中的第2个元素

System.out.println(a[1]);

示例4:修改数组中的第4个元素的值为35

a[3] = 35;

如果使用了一个超过下标范围的数字作为数组下标使用,代码会发生问题。
比如长度是5的数组a,最大下标是4,访问a[5]就会发生下述异常


数组异常

java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常

2.3 遍历数组

访问数组中的所有元素
数组属性 a.length 表示数组的长度

int[] a = {23,12,11,15,28,42,31,55,8,17,12};
for(int i = 0; i < a.length; i++) {
    System.out.println(a[i]);
}

示例5:给定数组 {23,12,11,15,28,42,31,55,8,17,12},请计算平均值

int[] a = {23,12,11,15,28,42,31,55,8,17,12};
int sum = 0;
for(int i = 0; i < a.length; i++) {
    sum += a[i];
}
int avg = sum / a.length;
System.out.println(avg);

示例6:找到数组中的最小值

int[] a = {23,12,11,15,28,42,31,55,8,17,12};
int min = a[0];
for(int i = 1; i < a.length; i++) {
    if(a[i] < min) {
        min = a[i];
    }
}
System.out.println(min);
2.4 一维数组的内存分配

任何数组都属于引用数据类型

一维数组的内存分配

3. 多维数组的声明和使用(了解)

多维数组可以理解为:
二维数组是一种类似“表结构”
三维数组是一种类似“空间结构”
更高维的数组在现实世界中很少意义
实际上,多维数组是:数组类型的数组
以二维数组为例理解多维数组的概念

3.1 二维数组的声明和初始化
3.1.1 二维数组的声明
int[][] a;

int a[][];

int[] a[];

推荐使用第一种方式声明二维数组

3.1.2 二维数组的初始化

指定第一维的长度和第二维的长度

int[][] a = new int[3][4];

指定第一维的长度而不指定第二维的长度

int[][] a = new int[3][];

不允许在未指定第一维时,直接指定第二维
不允许两个维度的长度都不指定
下面这个是一个错误的示例

int[][] a = new int[][4]; //错误示例!!
int[][] a = new int[][]; //错误示例!!

可以直接数字的初始化,初始化了一个3x4的数组
第一维的长度为3,第二维的长度为4

int[][] a = {{1,2,3,4},{5,6,7,8},{1,4,2,8}};
1 2 3 4
5 6 7 8
1 4 2 8

初始化一个“锯齿数组”

int[][] a = {{1,2,3},{5,6,7,8,9},{1,4,2,8}};
int[][] d = new int[][]{{1,2,3},{5,6,7,8,9},{1,4,2,8}};
1 2 3
5 6 7 8 9
1 4 2 8
3.2 二维数组的遍历

二维数组a中
a.length得到第一维长度、
a[i].length对应的二维长度

int a[][] = {{1,2,3},{5,6,7,8,9},{1,4,2,8}};

for(int i = 0; i < a.length; i++) {//遍历第一维
    for(int j = 0; j < a[i].length; j++) {
        System.out.print(a[i][j]);
        System.out.print("\t");
    }
    System.out.println();
}
3.3 二维数组的内存分配
二维数组的内存

4. 数组的排序(十分重要)

一维数组的内部排序

内部排序指的是不借助其他数组完成数组内部排序

4.1 冒泡排序法(笔试重点)

冒泡排序是一种稳定排序,两个相同数字的相对位置不会发生改变
所谓稳定"{12(a),11,15,6,2,9,12(b),7}"
稳定排序的结果一定是"{2,6,7,9,11,12(a),12(b),15}"
不稳定排序结果不一定是这样
数组中,相邻两个数进行比较,较大数放在后面,不断地进行这个过程。最大的数就会被放到结尾(升序)
冒泡排序法一个数的示例图

冒第一个数

类似地继续地从头冒第二个数,第三个数...直到将所有的数字都放在合适的位置上
推导代码:

public class Test1 {
    
    public static void display(int[] a) {
        for(int t : a) {
            System.out.print(t);
            System.out.print("\t");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] a = {15,7,22,14,8,16,10};
        
        int temp = 0; //temp表示临时的意思    用于交换数字
        System.out.println("第一个数===================================");
        display(a);
        for(int j = 0; j < a.length-1; j++) {   
            if(a[j] > a[j+1]) {
                //交换
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
            display(a);
        }
        System.out.println("第二个数===================================");
        display(a);
        for(int j = 0; j < a.length-2; j++) {   
            if(a[j] > a[j+1]) {
                //交换
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
            display(a);
        }
        System.out.println("第三个数===================================");
        display(a);
        for(int j = 0; j < a.length-3; j++) {   
            if(a[j] > a[j+1]) {
                //交换
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
            display(a);
        }
    }
}

更改为循环方式,最终代码:

int temp = 0; 
for(int i = 1; i < a.length; i++) {
    for(int j = 0; j < a.length-i; j++) {   
        if(a[j] > a[j+1]) {
            temp = a[j];
            a[j] = a[j+1];
            a[j+1] = temp;
        }
    }
}
4.2 选择排序法

选择排序是一种不稳定排序,两个相同数字的相对位置可能发生改变
从第一个位置起,将所有其他位置的数字与该位置进行比较,如果其他位置上的数字小于第一个位置,就进行交换。

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