目录
数组的概念
- 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
- 数组既可以存储基本数据类型,也可以存储引用数据类型。
/*
* 数组类型的分类:
* 1.基本数据类型
* byte short int long float double boolean char
* 默认值: 0 0 0 0 0.0 0.0 false 空格
* 2.引用数据类型
* String等;还可以是自己封装的类
* 默认值:都是null
*/
- 数组一旦初始化,长度不可变。长度确定下来了!
一个图书存储与数组存储的对应图来了解一下数组中包含的一些内容,如下图(左)所示。
下面看一个整型数组的例子,下图(右)。
数组的定义格式
一维数组的声明方式: 类型 数组名[] 或 类型[] 数组名;
例如:
int a[];
int[] a1;
double b[];
Date[]c; //对象数组
单独声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
这两种定义做完了,数组中是没有元素值的
数组的初始化
- Java中的数组必须先初始化,然后才能使用
- 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
- Java中可以使用关键字new创建数组对象,完成静态初始化或动态初始化
动态初始化
- 概念:初始化时只指定数组长度,由系统为数组分配初始值
- 格式:数据类型[] 数组名 = new 数据类型[数组长度]; //数组长度其实就是数组中元素的个数
- 举例:int[] arr = new int[3];
- 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值
输出数组中元素的值
- 定义并用运算符new为之分配空间后,才可以引用数组中的某个元素;
- 每个数组都有一个属性 length 指明它的长度,例如:a.length 指明数组 a 的长度(元素个数)
- 数组名和编号的配合就可以获取数组中的指定编号的元素。这个编号的专业叫法:索引(下标)。
- 数组元素的引用方式:数组名[数组元素下标]
- 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i]
- 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 至 n-1
内存结构
静态初始化
- 概念:初始化时指定每个数组元素的初始值,由系统决定数组长度
- 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
- 举例:int[] arr = new int[]{1,2,3};
- 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。
- 其实这种写法还有一个简化的写法:int[] arr = {1,2,3};
内存结构
注意:int[] a = new int[]; new的时候就要分配内存,不指定就不知道分配多少,数组一旦初始化,长度不可变。长度确定下来了!!!int[] a ={1,2,3};也可以
- 获取数组的长度:int n=数组名.length;
二维数组概述
二维数组[][]:数组中的数组 |
格式1(动态初始化):int[][] arr = new int[3][2]; |
定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78; |
格式2(动态初始化):int[][] arr = new int[3][]; |
二维数组中有3个一维数组。 每个一维数组都是默认初始化值null (注意:区别于格式1) 可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2]; 注: int[][]arr = new int[][3]; //非法
|
格式3(静态初始化):int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}}; |
定义一个名称为arr的二维数组,二维数组中有三个一维数组 每一个一维数组中具体元素也都已初始化 第一个一维数组 arr[0] = {3,8,2}; 第二个一维数组 arr[1] = {2,7}; 第三个一维数组 arr[2] = {9,0,1,6}; 第三个一维数组的长度表示方式:arr[2].length; |
Ø
注意特殊写法情况:
int
[]
x,y
[]; x
是一维数组,
y
是二维数组。
Ø
Java
中多维数组
不
必都是规则矩阵形式
|
冒泡排序
冒泡排序的基本思路:假设要被排序的数组arr[0…n-1]是垂直放置的,我们将其中的每个元素都看成重量为arr[i]的气泡。那么,根据常识,我们知道重量轻的气泡会向上冒。所以我们制定轻气泡不能在重气泡下的原则。现在,我们从下向上扫描数组arr[n]中的每个元素,凡是发现违反本原则的轻气泡,就使其向上“冒”,反复的执行这个过程,直到所有元素都满足该原则。
冒泡算法原理
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
代码框架
for (i = 0; i < N-1 ; i++)
{
for (j = 0; j < N-1-i ; j++)
{
// 比较 j 和 j+1 位置的元素
// 如果前大后小就交换
}
}
冒泡排序举例
package com.wzb.java;
/*
* 冒泡排序
*/
public class Demo05 {
public static void main(String[] args) {
//将arr数组中的元素用冒泡排序的方法从大到小进行排序
int[] arr={10,20,30,40,50,60,70};
//排序代码块
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
//从大到小用小于,从小到大用大于
if(arr[j]<arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
//循环输出排序后的数组元素
for(int num:arr){
System.out.println(num);
}
}
}
数组常见问题
数组索引越界
- ArrayIndexOutOfBoundsException
- 访问到了数组中的不存在的索引时发生
空指针异常
- NullPointerException
- 数组引用没有指向实体,却在操作实体中的元素时