1.为什么使用数组?
- 比如我要统计每位员工的工资,我得定义多个变量去分开存储,因为一个变量只能保存一个数据,如果过多的员工,太麻烦了,那么我怎么用一个变量去存储多个员工工资呢?可以使用数组,数组就是一个大的容器,他可以存放多个值
2.什么是数组? - 数组和变量差不多,都是存放数据的,不同的是变量只能保存一条数据,而数组可以保存多条数据,前提这个多条数据必须是同一类型的
- 数组是引用数据类型
- 数组一旦初始化,长度不可变。长度确定下来了
3.如何定义数组? - 数组类型[] 数组名;
- 如果定义好数组以后,必须要给数组进行初始化。
- 数组是一个引用数据类型
4、数据的初始化 - Java中的数组必须先初始化,然后才能使用
- 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
- Java中可以使用关键字new创建数组对象,完成静态初始化或动态初始化
数组的初始化分为两种情况: - (1).动态初始化:指定数组的长度,一旦长度指定,就是数组中只能存放多少数组
- 两种格式:
- 第一种:
- 数组类型[] 数组名=new 数组类型[数组长度];
- 第二种方式:
- 数组类型[] 数组名;
- 数组名=new 数组类型[数组长度];
- (2)静态初始化:不是指定数组长度,而是直接在初始化数组的同时给数组赋值
- 第一种:
- 数组类型[] 数组名=new 数组类型[]{数据1,数据2…};
- 第二种:
- 数组类型[] 数组名;
- 数组名=new 数组类型[]{数据1,数据2.。。。};
- 还有一种最简单的方式:
- 数组类型[] 数组名={数据1,数据2…};
5、数组中常见的几种异常
*(1)数组索引越界 ArrayIndexOutOfBoundsException
访问到了数组中的不存在的索引时发生
*(2)空指针异常 NullPointerException
数组引用没有指向实体,却在操作实体中的元素时
6、数据遍历
*(1)for循环遍历数组(i代表的是数组的下标,第一个元素下标为0)
int array=new int[]{14,2,6,34,90,89,12};
System.out.println(“使用for循环遍历数组”);
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
*(2)foreach(for循环的增强版)
System.out.println(“foreach遍历数组”);
for(定义变量接受数组的每一个元素值:要遍历的数组名)
for(int a:array){
System.out.println(a);
}
7、数组的分类:
*(1)基本数据类型的数组:
byte,short,long,int,float,double,char,boolean;
默认值:0 0 0 0 0.0 0.0 空格 false;
*(2)引用数据类型的数组:
string默认值为null,接口,自己定义的类;
引用数据类型的默认值为null;
8、java中的内存是怎么进行分配的 - 动态初始化数组时,由系统给出初始值,初始值为0
- Java中内存的申请和释放都是JVM进行管理的,Java程序要运行,JVM都会自动的向电脑申请一块内存,把这块内存分为五部分:
栈(Stack):主要存放局部变量,即在方法定义中或方法声明上的变量
堆(Heap):凡是new出来的都存在堆里面,堆当中的数据都有默认原则
整数:0,小数:0.0,布尔:false,char:空格,引用数据类型:null
方法区(Method Area):存放的是与.class相关的信息
本地方法区(Native Method Area):与操作系统有关
寄存器(Register):与CPU有关 - 堆内存的特点:(1)每一个new出来的东西都会有一个地址;
(2)每个变量都会有默认值—课下作业
(3)使用完毕就变成了垃圾,但是并没有立即回收,会等到垃圾回收器空闲时回收 - 栈内存的特点:用完就释放掉
9、冒泡排序 - 冒泡算法原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较 - 思想:数组中的元素两两比较,从大到小用<或从小到大用>输出;
- 例:10,20,30,40,50,60 从大到小输出
20,30,40,50,60,10 第一趟 5次
30,40,50,60,20,10 第二趟 4次
40,50,60,30,20,10 第三趟 3次
50,60,40,30,20,10 第四趟 2次
60,50,40,30,20,10 第五趟 1次 - 总结:(1)N个数(数组的长度)比较了N-1趟;
(2)次数=N-趟数=N-(N-1)=2N+1 - 升序口诀:n个数据来排队,
两两比较小靠前;
外层循环n-1,
内层循环n-1-i。
10、二维数组(数组中的数组)
*(1)声明二维数组格式:
数据类型[][] 数组名;
第一个中括号:二维数组中有几个一维数组,即有几行;
第一个中括号:每个一维数组中有多少个元素,即有几列;
*(2)初始化二维数组: - 动态初始化:
数据类型[][] 数组名=new 数据类型[长度][长度];
二维数组的默认值为0; - 静态初始化:
1)数据类型[][] 数组名=new 数据类型[][]
{ {数据[0][0] 数据[0][1] …数据[0][n]}
…
…
{数据[n][0] 数据[n][1] …数据[n][n]} };
一个大括号里边的数据表示一个一维数组;
2)数据类型[][] 数组名= {
{数据[0][0] 数据[0][1] …数据[0][n]}
…
…
{数据[n][0] 数据[n][1] …数据[n][n]} };
*(3)遍历二维数组:
1)第一种:嵌套for循环:
外层循环控制行(每一个一位数组),
内层循环控制列(每个数组中的元素)。
2)第二种:增强for循环
for(int[] i:数组名){//获取每一个一位数组
for(int a:数组名){
system.out.print(a+" ");
}
system.out.println();
}