数组
所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
下面从几个方面来介绍数组:
1、数组的定义;
2、数组的内存分配及特点;
3、数组常见的操作;
4、数组中的数组。
数组的定义:数组就是同一种数据的集合,可以简单的看做一个容器。我们知道容器有很多种,存放不同的物体。那么顾名思义,数组中存放的数据类型因数组名的不同而不同,而存放在同一个数组中的数据必定是同一个类型的。数组能自动给数组中的元素从0开始标号,以便操作这些元素。
- 1、数组的定义:同一个数据类型的集合,可以看做一个容器。
数组的好处:自动编号,从0开始。方便操作。
格式一 数组的定义:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
//需求:定义一个可以存储三个数据的容器。
int [] x= new int[3];//“[]”:数组标识;“new”:用来在内存中产生一个容器实体;“x”:数据类型为数组类型。
Java一共在内存中划分了5片空间:栈内存;堆内存;方法区;本地方法区;寄存器。
- 栈内存:数据使用完毕,自动释放空间。
- 堆内存:
特点:1、堆内存中的每个实体都有一个内放位置(地址值从0开始,也就是下标)。地址值存放到栈内存中,数据实体存放在堆内存中。
2、堆内存中的实体都有默认初始化值,依数据类型而定:int,0; double,0.0; float,0.0f; boolean,false;……
如x[0]=59:“0”表下标,“59”表对应于0这个小标地址空间中的实体数据。
格式二 数组的定义:元素类型[] 数组名 = new 元素类型 [] {元素,元素,……};//直接确定数组里的值。
定义数组的格式:格式一:元素类型 [ ] 数组名=new 元素类型 [元素个数或者数组长度];
示例:int [ ] arr=new int [ 8 ];
格式二:元素类型 [ ] 数组名=new 元素类型 [ ] {元素,元素, …};
示例:int [ ] arr=new int [ ] {5,68,9,4,12};
- 2、数组的内存分配:数组在内存中,栈内存存放地址,堆内存存放数据对象。
例如:int [ ] arr=new int[ 8 ];通过new产生的实体都存放于堆内存中,而实体所对应的地址值就存放于栈内存中。
- 3、数组的常见操作:获取最值,排序,查找。
(1)、获取最值:即获取最大值和最小值。
获取数组中的最值
方法一://函数功能实现 public static int getMax(int [] arr) { int max=arr[0]; for (int x=1;x<arr.length;x++) { if (arr[x]>max) max=arr[x]; } return max; } //主函数 public static void main(String[] rgs) { int[] arr={1,2,3,3,1,5,56,-8}; int max=getMax(arr); System.out.plintln("max="+max) } //注解:还可以通过数组中元素所对应的下标来进行比较。
方法二://函数功能实现 public static int getMax_2(int [] arr) { int max=0; for (int x=1;x<arr.length;x++) { if (arr[x]>[max]) max=x; } return arr[max]; } //主函数 public static void main(String[] rgs) { int[] arr={1,2,3,3,1,5,56,-8}; int max=getMax_2(arr); System.out.plintln("max="+max) }
(2)、 排序(两种):选择排序,冒泡排序。
选择排序:class ArrayTest2 { //功能实现: public static void selectSort(int [] arr) { for(int x=0;x<arr.length-1;x++) { for(int y=x+1;y<arr.length;y++) { if(arr[x]>arr[y]) { int temp=arr[x]; arr[x]=arr[y]; arr[y]=temp; } } } } public static void main(String[] args) { int [] arr={1,2,3,5,6,4,79,5,7}; //排序前打印: printArray(arr); //排序: selectSort(arr); 排序后打印: printArray(arr); } //打印程序: public static void printArray(int [] arr) { System.out.print("["); for(int x=0;x<arr.length;x++) { if(x!=arr.length-1) System.out.print(arr[x]","); else System.out.println(arr[x]+"]"); } } }
选择排序特点:最值出现在头角标上。
冒泡排序:相邻的两个元素进行比较,如果符合条件进行换位。最值出现在最后一位。
冒泡排序功能代码段:public static void main(int [] arr) { for(int x=0;x<arr.length-1;x++) { for(int y=0;y<arr.length-x-1;y++)//-x:让每次比较的元素较少,-1:避免交表越界。 { if(arr[y]<arr[y+1]) { int temp=arr[y]; arr[y]=arr[y+1]; arr[y+1]=temp; } } } }
(3)、查找:折半查找(二分查找)。数组的查找操作:也就是在遍历的时候找到第一次出现目标元素并返回。
功能实现:
class ArrayTest4 { public static void main(String[] args) { int[] arr={3,4,6,7,8,7,5,4,1,2}; int index=getIndex(arr,2);//查找2第一次在数组中出现的角标。 System.ou.println("index="index); } } public static int getIndex(int [] arr;int key) { for(int x=0;x<arr.length;x++) { if(arr[x]==key) return x; } return -1;//表示数组中没有找到目标元素。 }
折半查找(可以提高查找效率):数组必须是有序数组。
功能函数实现:public static int halfSearch(int[] arr,int key) { int min,max,mid; min=0; max=arr.length-1; mid=(min+max)/2; while(arr[mid]!=key) { if(key>arr[]mid) min=mid+1; else if(key<arr[mid]) max=mid-1; if(min>max) return -1; mid=(max+min)/2; } return mid; }
折半查找方式二:class ArrayTest4 { public static void main(String[] args) { int[] arr={3,4,6,7,8,11,52,79}; int index=getIndex(arr,11);//查找11第一次在数组中出现的角标。 System.ou.println("index="index); } } public static inthalfSearch_2(int[] arr,int key) { int min=0,max=array.length-1,mid; while(min<max) { mid=(min+max)>>1;//“>>”表示右移,一个数右移n次就等于该数/(2的n次方)。 if(key>arr[mid]) min=mid+1; else if(key<arr[mid]) max=mid-1; else return mid; } return -1; }
- 4、数组中的数组(二维数组):
定义二维数组格式一:int [ ] [ ] arr =new int [ 5 ] [ 2 ]; 给定了二维数组的行列数。
定义二维数组格式二:int [ ] [ ] arr =new int [ 4 ] [ ]; 三个一维数组,每个一维数组默认初始化为null。
定义二维数组格式三:int [ ] [ ] arr ={ {7,6,8},{25,13,78},{4,15,63} };数组直接给出数据。
综上所述对于数组我们首先要了解数组的定义,以及它存在的意义,然后就是使用它,掌握数组常见的操作。