有时在写一些程序时,我们要保存几百甚至几千个数据,这时候如果用定义变量的方式保存数据是很难的,为了解决这个问题,Java提供了数组的数据结构,可以当作一个容器来存储许多个数据。
1、数组的概念
数组是相同数据类型的数据按顺序组成的一种引用数据类型。
声明数组:String[] arr;
double[][] arr;
声明数组仅仅给出了数据类型和数组的名字,要真正的使用数组我们还要实例化数组,实例化数组就是申请了一段连续的内存空间用来存储数组的元素,实例化数组语法格式:数组名=new数组元素数据类型[数组元素个数];
穷举法实例化数组:数据类型 [] 数组名={数组元素,数组元素};
二维数组:实质是一维数组。
数组定义:数组类型 [][] 数组名 = new 数组类型[一维数组的个数][每一个一维数组中元素个数];
2、遍历数组元素
传统for循环遍历一维数组:
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);}
传统for循环遍历二维数组:
int [][] arr={{1,2,3,4,5},{1,2,3,3,3},{4,1,4,1,4}};
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[].length;j++){
System.out.println(arr[i][j]);
}
}
加强for循环遍历一维数组:
int [] arr={1,2,3,4,5};
for(int a:arr){
System.out.println(a);
}
加强for循环遍历二维数组:
int [][] arr={{1,2,3,4,5},{1,2,3,3,3},{4,1,4,1,4}};
for(int a[]:arr){
for(int b:a){
System.out.println(b);
}
}
3、数组的排序!
(1)选择排序:
选择排序就是先遍历数组找到最大或最小的数和第一个互换
int [] arr= {1211,234,234,4,2,3,23,42,345,2,345,234,5,34,5,3};
for(int i=0;i<arr.length;i++) {
int k=i;
for(int j=i;j<arr.length;j++) {//循环找出最大数
if(arr[j]>arr[k])
k=j;
}
int temp=arr[i];//交换
arr[i]=arr[k];
arr[k]=temp;
}
(2)冒泡排序:
冒泡排序法是最基本的排序法之一,冒泡排序法的运行机制是通过循环遍历元素并调整相邻元素顺序来实现的一种简单排序方法。
int [] arr= {1211,234,234,4,2,3,23,42,345,2,345,234,5,34,5,3};
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j]>arr[j+1]) {
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
(3)插入排序:
每循环一次都将一个待排序的元素所对应的数据按其顺序大小插入到前面已经排序的序列的合适位置,直到全部插入排序完为止,其难点在于如何在前面已经排好序的序列中找到合适的插入位置。
int [] arr= {1211,234,234,4,2,3,23,42,345,2,345,234,5,34,5,3};
for(int i=1;i<arr.length;i++){//i为待排序数据的下标,由于将第一个元素是有序的,所以i从1开始;i<array:这样才能遍历完后续数组,进而实现全部排序;
int willSortData=arr[i];//将待排序数据保存到变量willSortData中
int j=0;
for(;j<i;j++){//j<i:和待排序数据前面(i)的所有元素进行比较,以找到“应该”插入的下标位置。
if(willSortData<arr[j]){//如果条件成立意味着待插入数据小于其前面的某个元素值
break;//当if条件成立时就找到了该待插入数据“应该”插入的下标位置,所以这时必须终止循环
}
}//for循环执行结束意味着找到了待插入数据“应该”插入的下标位置
if(i==j){//i与j相等意味着不用排序,下面代码也不用执行
continue;//停止不用排序这次循环,进入下次循环
}
for(int k=i;k>j;k--){//int k=i:待插入数据所在位置就是元素后移开始的下标位置
arr[k]=arr[k-1];//元素后置
}
arr[j]=willSortData;
}//该循环体每循环完一次就代表着本次待插入数据已经和前面元素是有序的了
插入排序的实质:
将数组分为有序区和无序区,定义一个标记无序区第一个元素的定位变量,将该元素与前面的有序区内元素遍历比较,找到该元素应该插入位置,然后将应插入位置到待插入元素所在位置之间的元素后移一位,最后再将待插入元素插入到应插入的位置,有序区扩增一位,无序区减少一位,定位变量再次后移,锁定后面无序区第一位元素位置。
4、值传递与引用传递
值传递(pass by value)是指在调用函数时将实际参数 复制 一份传递到函数中,这样在函数中如果对 参数 进行修改,将不会影响到实际参数。
public class Test {
public static void main(String[] args) {
int x=10;
test(x);
System.out.println(x);//输出10
}
public static void test(int y) {
y=0;
}
}
引用传递(pass by reference)是指在调用函数时将实际参数的地址 直接 传递到函数中,那么在函数中对 参数 所进行的修改,将影响到实际参数。
public class Test {
public static void main(String[] args) {
int [] x= {10};
test(x);
System.out.println(x[0]);//输出0
}
public static void test(int [] y) {
y[0]=0;
}
}
5、数组元素查找
二分法查找:搜索数据与有序数组(比如升序)中间元素比较以确定在中间元素左边还是右边,如果在右边,则调整最小搜索索引值,然后进入下次循环;如果在左边,则调整最大搜索索引值,然后进入下次循环;如果相等则当前位置就是查找数据所在位置,停止循环;
代码:
int [] arr= {1,2,3,4,5,6,7,8,9,10};
int a=1,low=0,high=arr.length-1,middle=(low+high)/2;
while(low<=high) {
middle=(low+high)/2;
if(a==arr[middle]) {
System.out.println("yes");
break;
}else if(a>arr[middle]) {
low=middle+1;
}else {
high=middle-1;
}
}
if(a!=arr[middle]) {
System.out.println("no");
}
如果找到待查证数,打印yes,否则no。