一、数组的概念
若想要存放一连串相关的数据,使用数组是个相当好用的选择。
数组是由一组相同类型的变量所组成的数据类型,它们以一个共同的名称表示,数组中的个别元素则以标注来表示其存放的位置。
数组依照存放元素的复杂程度分为一维数组、二维和多维数组。
二、一维数组
1、一维数组的声明与内存的分配
格式1:元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ;
//声明一维数组并分配内存给数组,new是用来在堆内存中产生一个容器实体
如: int [] score = new int [3]; 也可以写成: int score[] = new int[3];
格式2:元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…};
如: int [] score = new int []{1,2,3};
还有一种简写的静态初始化格式:如: int [] arr={1,2,3};
内存分配:
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:①、数组和对象,通过new建立的实例都存放在堆内存中。
②、每一个实体都有内存地址值。
③、实体中的变量都有默认初始化值。
④、实体不在被使用,会在不确定的时间内被垃圾回收器回收。
注:1)、System.out.println(arr);得到的结果是一个哈希值,也叫地址值。
2)、数组在堆内存开辟空间后,就有默认的初始化值。如:int默认0;boolean默认false。
2、常见操作数组的问题
①数组角标越界异常(ArrayIndexOutOfBoundsException):操作数组时,访问到了数组中不存在的角标。
②空指针异常(NullPointerException):当引用没有任何指向值为null的情况,该引用还在用于操作实体。
三、二维数组
二维数组声明的方式和一维数组类似,内存的分配也一样是用 new 这个关键字。其声明与分配内存的格式如下所示:
{第 1 行初值},
…
{第 n 行初值},
};
{23,45,21,45}, //二维数组的初值赋值
{45,23,46,23}
}
public class zuizhi {
public static void main(String[] args)
{
// TODO Auto-generated method stub
int i,min,max;
int A[]={47,21,23,24,8,61}; // 声明整数数组 A,并赋初值
min=max=A[0];
System.out.print("数组 A 的元素包括: ");
for(i=0;i<A.length;i++)
{
System.out.print(A[i]+" ");
if(A[i]>max) // 判断最大值
max=A[i];
if(A[i]<min) // 判断最小值
min=A[i];
}
System.out.println("\n 数组的最大值是: "+max); // 输出最大值
System.out.println("数组的最小值是: "+min); // 输出最小值
}
}
2、排序
//选择排序法:一次用一个数与其他数挨着比较,符合条件就换位
public static void selectSort(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=i+1;j<arr.length ;j++)
{
if(arr[i]>arr[j])
{
int temp =arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}
}
}
//冒泡排序法:相邻两个数进行比较,符合条件就换位
public static void bubbleSort(int [] arr)
{
for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-i-1;j++)//-x:让每一次比较的数减少;-1:避免角标越界
{
if(arr[j]>arr[j+1])
{
int temp =arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
}
}
}
3、查找
class HalfSearch
{
//定义功能:获取key第一次出现在数组中的位置,如果返回是-1,代表该key在数组中不存在
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;
}
public static void main(String[] args)
{
int[] arr = {1,3,5,7,8,23,54,12};//数组有序
int Index1 = HalfSearch(arr,54);//折半查找出54
System.out.println("index1="+Index1);//打印结果:index1=6
}
}