容器:是将多个数据存储到一起,每个数据称为该容器的元素
Java中容器:
数组
集合
数组:存储同一种数据类型多个元素的容器
数组的特点:
1.数组里面存储的元素数据类型是同一种
2.数组里面要存储多个元素(数组里面其实也可以没有元素或者一个元素,但这样的数组没有任何意义)
3.在程序运行过程中,数组是不可改变的(讲解内存图的时候再说)
数据类型 变量名 = 初始化值;
数组的定义
数据类型[] 数组名;(推荐)
例如: int[] arr : 定义一个int类型的数组,数组名为arr
数据类型 数组名[];
例如: int arr[] : 定义一个int类型的变量,变量名为arr数组
数据类型:数组里面存储元素的数据类型
[]:定义的是一个数组
数组名:给数组起的名字,见名知意
数组的初始化
动态初始化:进行初始化时,只初始化数组的大小,里面的元素不确定
格式:
数据类型[] 数组名 = new 数据类型[数组长度];
new:向内存申请一块区域,用来成初始化数组
数据类型:数组里面存储元素的数据类型
[数组长度]:数组里面存储元素的个数
静态初始化:进行初始化时,确定数组里面的具体元素,JVM可以间接获取数组的长度
标准格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,......,元素n};
简化格式:
数据类型[] 数组名 = {元素1,元素2,......,元素n};
面试题:
动态初始化和静态初始化的区别?
标准版的静态初始化和简化版的静态初始化有什么区别?
初始化的注意事项:
在进行数组的初始化过程中,不允许动静结合的方式
//数据类型[] 数组名;
int[] arr01;
//数据类型 数组名[];
int arr02[];
//数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr03 = new int[3];
//数据类型[] 数组名 = new 数据类型[]{元素1,元素2,......,元素n}
int[] arr04 = new int[]{11,22,33};
//数据类型[] 数组名 = {元素1,元素2,......,元素n};
int[] arr05 = {11,22,33};
数组的访问
数组的索引(角标,下标):
针对数组里面的元素进行相应编号
从0开始,数组最大索引值(数组的长度-1)
作用:
可以针对数组的元素进行获取和重新赋值
格式:
数组名[索引值]
数组的两个小问题
ArrayIndexOutOfBoundsException:数组索引越界异常
产生原因:访问不存在或者错误的索引值
NullPointerException:空指针异常
产生原因:通过null访问数组的元素或者对象中数据
数组的遍历:
获取数组中的每个元素
动态获取数组的长度:
数组名.length
需求:根据指定格式打印数组
数组:[元素1,元素2,元素3,......元素n]
数组的运行:
初级运算:不针对数组里面的数据做任何改动
求数组的和,最值,平均值....
中级运算:不针对数组里面的数据做任何改动,获取所需的数据存储到另外的一个数组
数组的动态扩容,删除,插入....
高级运算:改变数组里面元素的顺序
反转,排序
数组的特点:
在程序的运行过程中,数组的长度是不可以改变
数组的动态扩容
往数组里面最后位置添加一个元素
冒泡排序:
原理:比较两个相邻的元素,将值大的元素交换至右端。
结论:
1.数组中含有n个元素,进行排序就要进行n-1轮
2.每一轮都要进行(n-当前轮数)的判断
public static void main (String[] args) {
int[] arr = {6,3,7,8,2,9,1};
System.out.print("排序前:[");
for (int i = 0; i < arr.length ; i++ ) {
if (i == arr.length -1) {
System.out.println(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
for (int count = 1; count < arr.length; count++) { // 外层循环控制的就是求几次最大值
for (int i = 0; i < arr.length - count; i++ ) { // 内层循环控制的就是求一次最大值比较的次数
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
System.out.print("排序后:[");
for (int i = 0; i < arr.length ; i++ ) {
if (i == arr.length -1) {
System.out.println(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
}
}
二分查找法
使用二分查找法前提条件:
1.数组的元素是有序的
2.保证数组里面的元素比较多的
public static void main (String[] args) {
//1.定义初始化一个数组
int[] arr = {2,5,7,8,10,15,18,20,22,25,28};//有序
//2.定义所需的数据
//定义并初始化指定元素
int num = 18;
//定义并初始化指定元素的索引值
int index = -1;
// 定义并初始化数组的范围
int start = 0;
int end = arr.length - 1;
// 定义并初始化中间值
int mid = (start + end)/2;
//3.查找指定元素
while (start <= end) {
if (num < arr[mid]) {
//修改查找范围
end = mid - 1;
//mid = (start + end) / 2;
} else if (num > arr[mid]) {
start = mid + 1;
//mid = (start + end) / 2;
} else {
index = mid;
break;
}
mid = (start + end) / 2;
}
System.out.println("index = " + index);
}
多维数组:
一维数组:
数组中直接有具体的数据的数组,定义数组时有一个[]修饰
二维数组:
定义数组时有两个[][]进行修饰
二维数组里面的元素就是一个一维数组
......
```java
二维数组的定义
数据类型[][] 数组名(推荐)
数据类型 数组名[][]
数组类型[] 数组名[]
二维数组的初始化
动态初始化
格式1:
数据类型[][] 数组名 = new 数据类型[x][y];
x : 整数,二维数组里面存在几个一维数组
y : 整数,每个一维数组里面存在几个元素
格式2:
数据类型[][] 数组名 = new 数据类型[x][];
x : 整数,二维数组里面存在几个一维数组
静态初始化
标准版:
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2,...},{元素1,元素2,...},.....};
简化版:
数据类型[][] 数组名 ={{元素1,元素2,...},{元素1,元素2,...},.....};
可变参数:JDK1.5的新特性
和方法定义格式中的形参列表有关
参数的个数是可变
可变参数其实就是一个数组
格式
数据类型... 数组名