数组:
特点:
1,是一个容器(可以存储数据(基本类型数据,引用类型数据))。
2,该容器是固定长度。通过length属性可以获取其长度。
3,存储的元素都是同一数据类型。
4,该容器中的元素都有角标,从0编号开始。
什么时候使用数组?
当元素较多,并同一类型。就需要先先想要对其进行存储。然后在进行操作。
格式:
int[] arr = new int[3];
int[] arr = {3,4,1};
数组在操作时,容易出现的问题?
1,当访问到数组中不存在的角标时,运行时期会发生 ArrayIndexOutOfBoundsException
2,当引用型变量没有任何实体指向,还在使用该变量操作实体,会在运行时发生 NullPointerException
注意:空指针异常,不仅仅发生在操作数组时,只要是引用数据类型,都有可能发生该异常。
数组的常见操作:
1,最值。
public static int getMax(int[] arr)
{
int max = 0;
for(int x=1; x<arr.length; x++)
{
if(arr[x]>arr[max])
max = x;
}
return arr[max];
}
2,排序。
选择排序:
特点:内循环第一次结束,最值就出现在数组的0角标位。
方式:从先指定一个角标位(比如0角标),然后用该角标位变化的元素和其他角标位进行比较。
for(int x=0; x<arr.length-1; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[x]>arr[y])
swap(arr,x,y);
}
}
优化:原理就是减少堆内存中位置置换的次数。用栈内存的变量记录需要换位的最值,
在内循环结束一次后,换位一次。
for(int x=0; x<arr.length; x++)
{
int index = x;
int num = arr[x];
for(int y=x+1; y<arr.length; y++)
{
if(num>arr[y])
{
num = arr[y];
index = y;
}
}
if(index!=x)
swap(arr,index,x);
}
冒泡排序:
特点:内循环第一次结束,最值出现在数组末角标位。
方式:从0角标位开始,相邻两个元素进行比较。
for(int x=0; x<arr.length-1; x++)//for(int x=arr.length-1; x>0; x--)
{
for(int y=0; y<arr.length-1-x; y++)//for(int y=0; y<x; y++)
{
if(arr[y]>arr[y+1])
swap(arr,y,y+1);
}
}
优化:
int tempIndex = arr.length-1;
//int tempNum = arr[tempIndex];
for(int x=0; x<arr.length-1; x++)
{
int index = tempIndex;
int num = arr[tempIndex];
for(int y=0; y<arr.length-1-x; y++)
{
if(arr[y]>arr[y+1])
{
if(arr[y]>num)
{
index = y;
num = arr[y];
}
}
}
if(index!=tempIndex)
swap(arr,index,tempIndex);
tempIndex--;
}
public static void swap(int[] arr,int x,int y)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
3,查找。
遍历查找。
二分查找,必须要有前提,数组是有序的。
public static int halfSearch(int[] arr,int key)
{
int min=0,max=arr.lenght-1,mid;
while(min<=max)
{
mid=(max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
二维数组:
int[][] arr = new int[3][];
sop(arr);//[[I@哈希值
sop(arr[0]);//null.
----------------------
进制转换:
查表法。
public static String trans(int num,int base,int offset)
{
if(num==0)
return "0";
char[] chs = {'0','1','2','3'
,'4','5','6','7'
,'8','9','A','B'
,'C','D','E','F'};
char[] arr = new char[32];
int pos = arr.length;
while(num!=0)
{
int temp = num & base;
arr[--pos] = chs[temp];
num = num >>> offset;
}
return new String(arr,pos,arr.length-pos);
}