1.数组定义
- 数组是一种数据结构,是用来存储同一数据类型的有序集合,并可以用下标索引访问数组中的值。简而言之就是开辟了一段连续的有具有索引的存储单元。
- 唯一性:不可以存储不同的数据类型。
- 快速访问:可以通过下标 索引符号[ ] 快速访问数据。
- 客户端程序员未赋值,JVM会自动赋值(int自动赋值0,boolean自动赋值false,引用类型自动赋值null)
- 可以int [] a定义数组,也可以int a []定义数组 前者更符合java设计思想 后者是C程序员的习惯。
2.foreach 循环
for each只读取容器内的数据而不会更改数据。
for(variable : collection) 语句块,collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象 《java核心技术 | 》
3.数组初始化
- int [] a={1,2,3,4,5,6,7,8,9};
- int [] a =new int[9];
- int [] a =new int[]{1,2,3,4,5,6,7,8,9};
- new int {1,2,3,4,5,6,7,8,9,};//匿名初始化 《java核心技术 | 》
- small Primes = new int[] { 17, 19, 23, 29, 31, 37 }; 是 int [] anonymous = { 17, 19, 23, 29, 31, 37 };
smallPrimes = anonymous; 的简写形式- 《java核心技术 | 》
6.数组的引用本质其实就是指针(c/c++)
当我们定义两个数组 int a1[]={1,2,3,4,5,6,7,8,9};
int b1[]={1,2,3,} //故意长度不相等
很明显a这时候报了数组越界异常,这时候变量a指向了b1。(下图虚线 是赋值语句的结果,a指向b1)
4.数组在内存中存储形式
4.1 基本数据类型数组
以int [] a =new int[9];为例子,在栈内存(stack)存放内存开辟空间用来存放变量a它是堆内数组的应用并指向数组第一个地址 ,在堆(heap)开辟一段连续的内存空间 且空间长度是int*9用于存放这九个int数据。
4.2 引用类型数据
当创建数组对象时,实际上是创建的引用数组,并且数组内的每个存储单元存储的是数组的引用对象的地址并自动赋初始值关键字null在使用引用前必须指定他的对象。
5.常用算法
5.1插入算法
public class Add{
public static void main(String[] args){
// 一个有序的数组,向该数组中添加一个元素,数组依然有序。
int[] arr = {1,3,7,9,12,20,0};
int t = 0;
// 【1】找位置
int loc = -1; // 表示t应该添加到的位置
for(int i = 0;i<arr.length-1;i++){
if(arr[i] >= t){
loc = i;
break;
}
}
System.out.println("loc = "+loc);
if(loc < 0){ // 没找到合适的位置
arr[arr.length-1] = t;
}else{
// 【2】依次后移
for(int j=arr.length-1;j>loc;j--){
arr[j] = arr[j-1];
}
// 【3】添加插入的值
arr[loc] = t;
}
// 验证
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+"t");
}
}
}
5.2 删除算法
public class Delete{
public static void main(String[] args){
// 删除算法
int[] arr = {1,3,7,9,12,20};
int t = 1;
// 【1】找位置
int loc = -1;
for(int i=0;i<arr.length;i++){
if(t == arr[i]){
loc = i;
break;
}
}
// 【2】移动元素
if(loc < 0){
System.out.println(t+"在数组中不存在");
}else{
for(int j = loc;j<arr.length-1;j++){
arr[j] = arr[j+1];
}
// 【3】最后一个元素置0
arr[arr.length-1] = 0;
}
// 验证
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+"t");
}
}
}
5.3冒泡排序
public class Bubble{
public static void main(String[] args){
// 对一个无序的数组进行排序
int[] arr = {10,5,3,4,2,9,7};
int tmp = 0;
for(int i=0;i<arr.length-1;i++){ // 外层控制趟数
for(int j=0;j<arr.length-1-i;j++){ // 两两比较
if(arr[j]>arr[j+1]){
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"t");
}
}
}
- 最特殊的情况就是数组全部逆序那么这时每一趟的每一次比较都需要执行 ,又因两个for循环所以时间复杂度是O(