数组
概念:数组是一个定长的容器,数组中存储的数据类型需要是一致的
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
数组的四种定义方式:
数据类型是数组中元素的数据类型
数组是有默认值的{0,0,0,0,0,0,0,0,0,0,}
int数据类型是数组中元素的数据类型
数组的数据类型是 int[]
元素 --> 数组中储存的值
数组的长度 --> 数组中的元素个数
//数据类型[] 数组名 = new 数据类型[数组中元素的个数]
int[] array = new int[10];
2.先声明数组,然后再进行赋值
//在类中,定义成员变量,方法传递
int[] array2;
array2= new int[10];
3.创建数组的同时,给定当前数组中储存元素的值
//数组的长度:后面{}中储存多少个值,数组就有多长
int[] array3 = new int[]{1,2,3,4}
4.第3的简化版本
int[] array4 = {1,2,3,4}
数组的概念
同一种类型数据的集合。其实数组就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么.不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素, 数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。
数组的内存分析
数组声明后实际上是在栈内存中保存了此数组的名称,接下来便是要在堆内存中配置数组所需的内存,其中“元素的个数”(数组的长度)是告诉编译器,所声明的数组要存放多少个元素,而“new”则是命令编译器根据括号里的长度开辟空间。
二维数组:
Arrays的使用
遍历: toString() 将数组的元素以字符串的形式返回
排序: sort() 将数组按照升序排列
int[] arr = {23,64,2,37,43,67,1};
Arrays.sort(arr);//升序
for(int i=0;i
System.out.println(arr[i]);
}
查找: binarySearch()在指定数组中查找指定元素,返回元素的索引,如果没有找到返回(-插入点-1) 注意:使用查找的功能的时候,数组一定要先排序。
二维数组:实质就是存储是一维数组。
数组定义:
数组类型[][] 数组名 = new 数组类型[一维数组的个数][每一个一维数组中元素的个数];
数组排序:
数组排序有很多中:冒泡 ,选择,插入,快速,堆等等
* 速度最快的就是 堆 排序
冒泡排序 ( 两两相比 )
是相邻的两个数组元素进行比较
若当前元素大于后面的元素,交换两个元素的位置
若当前元素不大于后面的元素,就不交换
比较所有相邻的元素,最终的到一个有序的结果
冒泡最大的特点就是会先找出最大的值,然后放到数组的最后一位
升序(从小到大),降序(从大小) --> 默认排序都是升序
只要经过一轮排序,肯定会有一个数放到正确的位置上
3,7,4,6,9,1 --> 存储到数组中是无序,通过冒泡排序,数组升序排列
3,4,6,7,1,9 -- > 9
3,4,6,1,7,9 --> 7,9
3,4,1,6,7,9 --> 6,7,9
3,1,4,6,7,9 --> 4,6,7,9
1,3,4,6,7,9 --> 1,3,4,6,7,9
for(int i = 0 ; i < array.length - 1 ; i++){for(int j = 0 ; j < array.length -1 -i ; j++){if(array[j] > array[j + 1]){int tmp =array[j];
array[j]= array[j+1];
array[j+ 1] =tmp;
}
}
选择排序 ( 固定一位一次向后比 )
升序(从小到大),降序(从大小) --> 默认排序都是升序
固定一个元素,依次和后面的元素进行比较
若当前元素大于后面的元素,交换
若当前元素不大于后面的元素,不交换
每次比较完成们都会有一个数放到正确的位置上,小的那个数
3,7,4,6,9,1 --> 存储到数组中是无序,通过冒泡排序,数组升序排列
1,7,4,6,9,3 --> 1
1,3,7,6,9,4 --> 1,3
1,3,4,7,9,6 --> 1,3,4
1,3,4,6,9,7 --> 1,3,4,6
1,3,4,6,7,9 --> 1,3,4,6,7,9
for(int i = 0 ; i < array.length ; i++){for(int j = i+1 ; j < array.length ;j++){if(array[i] >array[j]){int tmp =array[i];
array[i]=array[j];
array[j]=tmp;
}
}
}
数组的复制
int[] a = {10,20,30,40,50};//数组的扩容(创建了新的数组并将源数组的数据复制过去了)
a = Arrays.copyOf(a,a.length+1); //for(int i=0;i
System.out.println(a[i]); //10 20 30 40 50 0
}
int[] a = {10,20,30,40,50};//a:源数组//a1:目标数组//6:目标数组的长度(多则补默认值,少则截取)
int[] a1 = Arrays.copyOf(a,6); //灵活性差
for(int i=0;i
System.out.println(a1[i]); //10 20 30 40 50 0
}
int[] a = {10,20,30,40,50};int[] a1 = new int[6]; //0,0,0,0,0,0//a:源数组//1:源数组的起始下标//a1:目标数组//0:目标数组的起始下标//4:要复制的元素个数
System.arraycopy(a,1,a1,0,4); //灵活性好
for(int i=0;i
System.out.println(a1[i]); //20 30 40 50 0 0
}
操作数组的工具类:Arrays
java.util.Arrays类包含了用来操作数组(比如排序和搜索)的各种方法,它提供的所有这些方法都是静态的。
Arrays拥有一组static方法:
public static int binarySearch(Object[] a, Object key)
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。
public static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
public static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
public static void sort(Object[] a)
对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
public classTest {public static voidmain(String[] args) {int array[] = { 2, 5, 8, 3, 1, 4, 9, 6, 7 }; //声明一个整型数组
System.out.println("Object的toString:"array.toString()); //Object的toString()方法
Arrays.sort(array); //数组排序
System.out.println("排序后的数组:" +Arrays.toString(array)) ;int point = Arrays.binarySearch(array, 3) ; //检索数据位置
System.out.println("元素‘3’的位置在:" +point) ;
Arrays.fill(array,6) ; //填充数组
System.out.print("数组填充:" +Arrays.toString(array)) ;
}
}
执行结果
Object的toString:[I@7852e922
排序后的数组: [1, 2, 3, 4, 5, 6, 7, 8, 9]
元素‘3’的位置在:2数组填充:[6, 6, 6, 6, 6, 6, 6, 6, 6]
数组的基本操作
线性查找(顺序查找)
从数组中的第一个元素开始,依次向后查找,直到找当前要查找的值
要么是找到了,要么就是没有找到
//顺序查找
for (int i = 0; i < array.length; i++) {if(n ==array[i]){return i; //需要范围找到的下标,系统API
}
}return -1; //返回一个负数
return i; //需要范围找到的下标,系统API
}
}return -1; //返回一个负数
折半查找(二分查找) 先排序
一定是一个有序的数组,通过待查找的数和数组中间索引值进行比较
大于: 待查找值大于中间索引值,就需要向数组的右半边进行查找
等于:待查找值等于中间索引值,就是找到了
小于:待查找值下于中间索引值,就需要向数组的左半边进行查找
//定义开始值
int beginIndex = 0;//定义结束值
int endIndex = array.length-1;//获取中间值
int middleIndex = (beginIndex+endIndex)/2;//进行比较 用中间值来比较要查找的值//第一种比较的次数应该是数组的长度//第二中死循环
while(true){//缩小范围
if(n >array[middleIndex]){//修改开始值
beginIndex = middleIndex+1;
}else if(n
endIndex = middleIndex -1;
}else{returnmiddleIndex;
}//无论是开始值还是结束中发生了改变//就要重新结算中间值
middleIndex = (beginIndex+endIndex)/2;//若出现了一种情况 开始 > 结束
if(beginIndex >endIndex){return -1;
}
}