数组定义
数组是一种数据结构,是用来存储同一数据类型的有序集合,并可以用下标索引访问数组中的值。简而言之就是开辟了一段连续的有具有索引的存储单元。
唯一性:不可以存储不同的数据类型。
快速访问:可以通过下标 索引符号[ ] 快速访问数据。
客户端程序员未赋值,JVM会自动赋值(int自动赋值0,boolean自动赋值false,引用类型自动赋值null)
可以int [] a定义数组,也可以int a []定义数组 前者更符合java设计思想 后者是C程序员的习惯。
2.for each 循环
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类型数组
以int [] a =new int[9];为例子,在栈内存(stack)存放内存开辟空间用来存放变量a它是堆内数组的应用并指向数组第一个地址 ,在堆(heap)开辟一段连续的内存空间 且空间长度是int*9用于存放这九个int数据。
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 删除算法
5.3冒泡排序
public class Test10{
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");
}
}
}