数组:
#######
本身就是一个容器,用来存储数据。
特点:是固定长度的。
好处:给元素进行编号,从零开始。同时也可以通过length属性获取数组长度。
什么时候使用数组呢?
当数据较多时,通常为了方便操作这些数据都需要进行临时存储。
习惯:通常操作数组都需要进行遍历。获取数组中的元素需要一个指针。
通过对指针的值的改变就可以对数组中的数据进行操作。
常出现的问题:
1,数组角标越界异常。ArrayIndexOutOfBoundsException
什么时候会发生呢?当使用到了数组中不存在的角标时就会发生该异常。
2,空指针异常。NullPointerException
当引用型变量没有任何指向时,还在使用该引用变量操作实体内容,会发生该异常。
########
-------------------
int[] arr = new int[3];
该句代码在内存中的分配情况。
堆内存:开辟一个空间,建立一个数组实体,并对数组中的元素进行了默认初始化。
栈内存:定一个局部变量,存放了该实体在对内存中的首地址值。
栈内存特点:存放局部变量,当该变量使用完毕(生命周期结束),自动被释放。
堆内存特点:存放数组和对象,每一个实体都有内存地址值,堆内存中的变量都有默认初始化值,通过垃圾回收机制对堆内存中 的不在被使用的实体进行回收。
--------------------
数组的常见操作:
1,遍历。
public static void printArr(int[] arr)
{
for(int x=0; x<arr.length; x++)
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.println(arr[x]);
}
}
2,获取最值。int[] arr = new int[3];
arr = null;
System.out.println(arr.length);
getMax(null);
public static int getMax(int[] arr)
{
if(arr==null)
throw new RuntimeException();
int max = arr[0];
for(int x=1; x<arr.length;x++)
{
if(arr[x]>max)
max = arr[x];
}
return max;
}
public static int getMin(int[] arr)
{
int min = 0;
for(int x=1; x<arr.length; x++)
{
if(arr[x]<arr[min])
min = x;
}
return arr[min];
}
3,排序。
选择排序
特点:选择一个位置,通过该位置上变化的元素和其他元素进行比较,走完一圈,该位置出现最值。
内循环结束一次,在0角标位出现最值。
代码体现形式:
public static void selectSort(int[] arr)
{
for(int x=0; x<arr.length; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[x]>arr[y])
{
swap(arr,x,y);
}
}
}
}
public static void bubbleSort(int[] arr)
{
for(int x=0; x<arr.length; x++)//for(int x=arr.length-1; x>=0; x--)
{
for(int y=0; y<arr.length-x-1; y++)//for(int y=0; y<x; y++)
{
if(arr[y]>arr[y+1])
{
swap(arr,y,y+1);
}
}
}
}
y<arr.length-x-1:
-x : 通过不断循环,减少每一次参与比较元素的个数。
-1 :防止y+1的角标越界。
private static void swap(int[] arr,int x,int y)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
4,查找。
public static int getIndex(int[] arr,int key)
{
for(int x=0; x<arr.length; x++)
{
if(arr[x]==key)
return x;
}
return -1;//为什么返回-1呢?因为数组中没有-1这个角标,所以可以通过-1来表示元素不存在的情况。
}
折半查找,二分查找。
这种方式有一个必要的前提:被查找的数组一定要是有序的。
public static int halfSearch(int[] arr,int key)
{
int max,min,mid;
max = arr.length-1;
min = 0;
mid = (max+min)/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 int halfSearch(int[] arr,int key)
{
int max,min,mid;
max = arr.length-1;
min = 0;
while(min<=max)
{
mid = (max+min)/2;
if(key>arr[mid])
min = mid +1 ;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}