1.1.1 数组基础
数组(Array)是相同数据类型的数据的有序集合。
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引(index)来访问它们。
数组是引用数据类型。
数组的三个特点
【1】数组的长度是确定的。数组一旦申请完空间,长度不能发生变化,用length属性访问。
【2】数组的元素都是同一数据类型的。
【3】数组是有序的。每个元素通过下标/索引从0开始。
1.1.2 内存空间分类(c)
内存分为两类
栈(stack)内存:基本数据类型分配在栈内存,栈内存空间不需要开发者回收,系统会自动回收。栈内存占空间整个内存空间的比例较小。
堆(heap)内存:引用数据类型分配在堆内存,堆内存一定要开发者通过new来申请,开发者申请的内存使用完成后一定要回收。jvm中有专门的垃圾回收机制(gc)回收使用完的堆内存。堆内存占整个内存空间的比例较大。
1.2 数组的声明声明数组有两种方式
(1)数据类型 [ ] 变量 //推荐写法
(2)数据类型 变量 [ ]
案例:声明一个数组申请空间并赋值
public class New01{
public static void main(String[] args){
//声明一个数组
int a;
//声明数组变量
int[] arr;
//给数组变量分配空间
arr = new int[5];
//给每个空间赋值
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
//访问元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
}
}
1.2.1 数组的内存空间
1.2.2 数组声明的其他方式
标准的声明和赋值方法过于复杂,可以使用简写的方式如下
数据类型 [ ] arr = new int [ ] {值1,值2,......};
jvm 根据后面值得个数申请空间并把值赋值到对于空间。案例如下
public class New02{
public static void main(String[] args){
//[1]数组的声明方式
//int[] arr = new int[5];
//arr[0] = 10;
//arr[1] = 20;
//System.out.println(arr);
//[2]值声明
int[] arr2;
arr2 = new int[]{10,20,30,40,50};
//int[] arr2 = new int[]{10,20,30,40,50};
System.out.println(arr2.length);
System.out.println(arr2[2]);
//[3]数组的字面量声明
//字面量声明不支持分开赋值
/*
int[] arr3;
arr3 = {10,20,30,40,50};
*/
int[] arr3 = {10,20,30,40,50};
System.out.println(arr3.length);
System.out.println(arr3[4]);
}
}
1.2.3 数组的遍历
public class New03{
public static void main(String[] args){
int[] arr = {10,20,30,40,50};
for(int i=0;i<arr.length;i++){
System.out.println("arr["+i+"]"+"="+arr[i]);
//数组的遍历写法
}
}
}
1.3 数组的常用算法
1.3.1 插入算法一个数组有序,添加一个元素后,数组依然有序。
public class New07{
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;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");
}
}
}
1.3.2 删除算法
一个有序的数组,删除一个元素后依然有序。
public class New08{
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];
}
arr[arr.length-1] = 0;
}
//验证
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
}
}
1.3.3 冒泡排序算法
案例如下
public class New09{
public static void main(String[] args){
int[] arr = {9,4,2,452,242,345,1};
int tmp = 0;
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-1;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");
}
}
}