1.数组是一个什么东西呢?为什么使用数组
- 比如我要存5位员工的工资,我可以使用变量来存储,需要定义多个变量,因为每一个变量只能存一个值;
如果是更多的员工,那么定义变量的数量会更多,这样太麻烦了。 - 我们可以使用数组解决这个问题,数组就是一个容器,可以一次性存放多个数据,前提是数据类型必须要统一。
2.如何定义数组?
数组类型[ ] 数组名 ;
3. 如何初始化数组?
如果数组定义好以后,必须得进行初始化。
数组的初始化一共有两种:
(1)动态初始化
:指定数组的长度,长度指的是数组中能存多少数据,数组的长度定义好以后是不能改变的。
两种格式:
① 第一种格式:
数组类型[ ] 数组名 = new 数据类型 [ 数组长度 ] ;
②第二种格式:
数组类型[ ] 数组名;
数组名 = new 数据类型 [ 数组长度 ] ;
例如:
// 第一种
int[] arr = new int[8];
//第二种
int[] arr;
arr = new int [8];
(2)静态初始化
:不是指定数组的长度,而是直接在创建数组的同时给数组添加数据。
两种格式:(其实跟动态差不多)
①第一种
数组类型 [ ] 数组名 = new 数组类型 [ ] { 数据1,数据2.。。。。。} ;
②第二种
数组类型[ ] 数组名;
数组名 = new 数组类型 [ ]{ 数据1,数据2.。。。} ;
③简写
数组类型[] 数组名 = {数据1,数据2.。。。。。};
例如:
//第一种
int[] arr = new int[]{12,15,16,99,,,};
//第二种
int[] arr;
arr = new int[]{12,15,16,99,,,};
//简写
int[] arr={12,15,16,99,,,};
4.怎么访问数组里面的元素?
数组名[数组下标];
(数组的下标从0开始。)
例如:arr [0];
*5.附加资料
栈:存放局部变量
堆:new出来的东西都在堆里
方法区:存的是class文件
本地方法区:操作系统
寄存器:和cpu有关
两种常见异常:
- ArrayIndexOutOfBoundsException 数组越界异常
- NullPointerException 空指针异常
int[] arr1 = new int[2];
System.out.println(arr1[2]);//错,数组下标从0开始
//ArrayIndexOutOfBoundsException 数组越界异常
int[] arr2 = null;
System.out.println(arr2[0]);
//NullPointerException 空指针异常
6.怎样获取数组中每一个元素的值?
(1)for循环
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
(2)foreach(for循环的增强版)
语法:
for(变量类型 接收数组元素值的变量名:数组名)
for(int a:arr){
System.out.println(a);
}
7.数组类型的分类
(1)基本数据类型
byte | short | int | long | float | double | boolean | char |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0.0 | 0.0 | false | 空格 |
(2)引用数据类型
String … 还可以是我们自己封装的类
默认值:都是null
例如:
Person数据类型
Person[] per = new Person[3];
per[0]= new Person("张三", 12);
per[1]= new Person("李四", 15);
per[2]= new Person("王五", 13);
需要建一个Person类
public class Person {
private String name;//姓名
private int age;//age
//以下的get-set方法,有参无参,tostring方法都是自动生成的。
//右键Source里边有 选项。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
接着获取数据,
有两种遍历方法:(for和foreach)结果是一样的。
for(int i=0;i<per.length;i++){
System.out.println(per[i].toString());
}
for (Person per1 : per) {
System.out.println(per1);
}
8.冒泡排序 (重点例题**********
)
//从大到小
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;
}
}
}
//foreach遍历输出
for(int num:arr){
System.out.println(num);
}
9.二维数组
:数组中的数组
(用法跟一维数组类似。)
(1) 创建二维数组:
数组类型[ ][ ] 数组名;
(2) 初始化:
①动态初始化
- 第一个中括号:由几行组成,表示有几个一维数组组成。
- 第二个中括号:由列组成,表示一个一维数组里面可以保存几个元素。
int[][] arr=new int[3][3];
//赋值
arr[0][0]=1;//第一个一维数组的第一个元素为1;
arr[0][2]=2;
②静态初始化
int[][] arr1=new int[][]{{1,5},{5,9,12},{9,76,80,70}};
③简写
int[][] arr2 = {{12,89},{90,26}};
遍历输出:
for:
//遍历
//外层控制行
for(int i=0;i<arr1.length ;i++){
//内层控制列
for(int j=0;j<arr1[i].length ;j++){
System.out.printf("%d\t",arr1[i][j]);
}
System.out.println();
}
foreach:
for (int[] arr3 : arr) {
for (int i : arr3) {
System.out.printf("%d\t",i);
}
*练习
- 使用冒泡算法对数组排序 int [] number =new[10]{20,5,17,28,19,15,29,87,65,32} 要求:从大到小进行打印。