一、数组的概念
数组就是同一种类型数据的集合。简单的来说就是一个容器,用来装东西的。
使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
常见的数组有一维数组、二维数组。在java中,数组使用一种特殊的符号来表示:[]。
二、一维数组
定义格式:(1)数组中存储数据的类型 数组名[] = new 存储数据的类型[数组容器的大小];
例:int n = new int[10];
(2)数组中存储数据的类型 数组名[] = new 元素类型 [ ]{元素1,元素2,…};
例:int n = new int[]{1,2,3,4};
(3)数组中存储数据的类型 数组名[] = {元素1,元素2,…};--------第二种的简化方式
例:int n = {1,2,3,4};
定义数组时,要注意:(1)数组容器要使用关键字new来创建
(2)数组容器必须有一个固定的大小
数组的使用:java是利用角标(索引、下标、编号)来操作数组中的所存储的数据的。角标是从0开始,逐渐递增的(+1)。
数组内存图解:
在java中,对于内存区域的划分为5块:
1、 寄存器
和CPU有关。
2、 本地方法
和操作系统有关,可以通过操作调用底层的东西。
3、 栈
存放临时数据(局部变量) 局部变量:就是定义在函数内的变量或参数
栈中是可以运行函数的
栈的特点:先进后出。
栈中存放的数据都不会长久存储,会随着函数的出栈,局部变量也就消失了。
4、 堆
堆中存放都是实体(在java中,只要是使用new关键字创建的都是实体)
堆的特点:(1)堆中的实体都具有一个默认的地址(内存分配的地址)
(2) 实体中存放的数据,都具有默认值
int、short、byte、long类型的默认值: 0
float、double类型的默认值:0.0
char 类型的默认值:’\u0000’
boolean类型的默认值:false
String类型的默认值:null
5、方法区 也称为静态区。用来存放class和static
三、数组的常见问题
1、角标越界(ArrayIndexOutOfBoundsException)
在通过角标来操作数组时,角标不存在的情况,就属于角标越界。
例:int[] arr = new int[2];
System.out.println(arr[3]);
访问到了数组中的不存在的脚标时发生。
2、空指针异常(NullPointerException)
当数组没有任何指向时(数组=null),又继续去操作数组,就产生空指针异常。
例:int[]arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
四、二维数组
格式1: int[][] a= new int[3][2];
解释:以上格式表示定义了名称为a的二维数组。有3个一维数组,每一个一维数组中有2个元素。一维数组的名称分别为a[0],a[1],a[2]。 给第一个一维数组1脚标位赋值为23写法是:a[0][1] = 23。
格式2: int[][] a= new int[3][];
注:此种格式中每个一维数组都是默认初始化值null。
格式3:int[][] arr = {{1,2,3},{4,5,6},{7,8,9,10}}; 每一个一维数组中具体元素都初始化了。
注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。
五、数组常见操作
1、数组的二分查找(折半查找)
//通过二分查找在数组中找到给定的数
class TwoSearch
{
public static void main(String[] args)
{
int a[]={1,4,12,45,67,48};//有序数组
int n=67;//需查找的元素
int i=twoSearchKey(a,n);
if(i!=-1)//判断返回值
System.out.println(n+"在数组中的下标为:"+i);
else
System.out.println("查无此数!");
}
/*
将一个有序数组(升序)从中间分为两个区间,判断给定的数在哪个区间
再将找到的区间从中间一分为二,继续查找,以此类推。
*/
public static int twoSearchKey(int a[],int n){
//定义三个整型变量,分别记录头角标、中间角标、尾角标
int start=0;
int mid=a.length/2;
int end=a.length-1;
while(n!=a[mid]){
if(n<a[mid]){
end=mid-1;//修改尾角标
mid=(start+end)/2;
}else if(n>a[mid]){
start=mid+1;//修改头角标
mid=(start+end)/2;
}else
return -1;
}
return mid;
}
}
输出结果为:
2、数组的冒泡排序
//对一个无序数组进行冒泡排序
class ArraySortDemo
{
public static void main(String[] args)
{
int num[]={32,4,12,432,523,1,2,45};
//for循环对数组进行遍历
for(int i=0;i<num.length;i++){
//将最小的数放到数组的最后一位
for(int j=0;j<num.length-1-i;j++){
//互换方法
if(num[j]<num[j+1]){
int temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
}
}
//通过循环输出排序后的数组
for(int i=0;i<num.length;i++){
System.out.print(num[i]+"\t");
}
}
}
输出结果为: