数组的定义:同一种类型数据的集合。其实数组就是一个容器。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:元素类型[ ] 数组名 = new 元素类型 [元素个数或数组长度];
示例:int[ ] arr =new int[5];
格式2:元素类型[ ] 数组名 = new 元素类型[ ]{元素,元素,......};
示例:int[ ] arr =new int[ ]{3,1,5,7};
int[ ] arr = {3,1,5,7};
内存空间的划分:
1,寄存器:
2,本地方法区:
3,方法区:
4,栈内存:存储的都是局部变量。而且变量所属的作用域一旦结束,该变量就自动释放。
5,堆内存:存储的都是数组和对象(其实数组就是对象)。凡是new建立的都在堆中。
特点:1,每一个实体都有首地址。
2,堆内存中的每一个变量都有默认初始化值。根据类型的不同而不同,整数是0,
小数是0.0或者0.0f,boolean是false,char是'\u0000'。
3,垃圾回收机制。
数组常见问题:
1,当访问到数组中不存在的角标时,就会发生ArrayIndexOutOfBoundsException。
2,当引用型变量没有任何实体指向时,还在用其操作实体,就会发生NullPointerException。
3,当按格式1定义好一个数组,直接打印数组时返回的结果是包含数组类型的哈希值。
4,需要一个容器,但是不明确容器的具体数据时,就用格式1。当需要一个容器,要存储已知的
具体数据时,就用格式2。
数组常见操作:对数组操作最基本的动作就是存和取。核心思想:就是对角标的操作。
获取整个数组中的全部元素,可以用for循环进行遍历。
获取数组中的最大值。思路:
1,需要进行比较,并定义变量记录住每次比较后的较大的值。
2,对数组中的元素进行遍历取出,和变量中记录的元素进行比较。如果遍历到的元素大于
变量中记录的元素,就用变量记录住该大的值。
3,遍历结束,该变量记录就是最大值。
定义一个功能来实现。
明确一,结果。是数组中的元素,int。
明确二,未知内容。是数组。
public static int getMax(int[ ]arr){
//定义一个变量记录较大的值。
int maxElement = arr[0];
for(intx=1;x
if(arr[x] >maxElement)
maxElement = arr[x];
}
return maxElement;
}
public static int getMax2(int[] arr){
//定义一个变量记录较大的值。
int maxIndex = 0;
for(intx=1;x
if(arr[x] >arr[maxIndex])
maxIndex = x;
}
return arr[maxIndex];
}
选择排序:
public static void selectSort(int[] arr){
for(int x=0;x
for(int y=x+1;y
if(arr[x] >arr[y]){
int temp =arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
遍历数组的功能:
public static voidprintArray(int[ ] arr){
System.out.println("[");
for(intx=0;x
if(x!=arr.length-1)
System.out.println(arr[x]+",");
else
System.out.println(arr[x]+"]");
}
}
冒泡排序:
public static voidbubbleSort(int[ ] arr){
for(int x=0;x
for(inty=0;y
if(arr[y] >arr[y+1]){ //循环增加一次,内循环参数与比较的元素
int temp =arr[y]; //个数递减。
arr[y] =arr[y+1];
arr[y+1] = temp;
}
}
}
}
排序位置转换代码提取:
public static void swap(int[ ]arr,int a,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
数组排序的性能问题:
public static voidselectSort2(int[ ] arr){
for(intx=0;x
int num = arr[x];
int index = x;
for(int y=x+1;y
if(num>arr[y]){
num = arr[y];
index = y;
}
}
if(index !=x)
swap(arr,x,index);
}
}
数组常见功能:查找
public static int getIndex(int[]arr,int key){
for(intx=0;x
if(arr[x] == key)
return x;
}
return -1;
}
二分查找法:必须是从小到大,或者是从大到小顺序的数组才有效。
public static inthalfSearch(int[ ]arr,int key){
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (min + max)/2;
while(mid != key){
if(key>arr[mid])
min = mid + 1;
else if(key
max = mid - 1;
if(max
return -1;
mid = (min + max)/2;
}
return mid;
}
public static inthalfSearch2(int[ ]arr,int key){
int min,max,mid;
min = 0;
max = arr.length-1;
while(min <= max){
mid =(max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key
max = mid - 1;
else
return mid;
}
return -1;
}
面试题:给定一个有序的数组,如果往该数组中存储一个元素后,并保证这个数组还是有序的,那么
这个元素的存储的角标位如何获取。
public static int halfSearch2(int[ ]arr,int key){
int min,max,mid;
min = 0;
max = arr.length-1;
while(min <= max){
mid =(max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key
max = mid - 1;
else
return mid;
}
return min;
}
java本身的二分查找法:Array.binarySearch(arr,key)如果存在,返回具体的角标位置,
如果不存在,返回的是:-插入点-1。
什么时候使用数组呢?
如果数据出现了对应关系,而且对应关系的一方是有序的数字编号,并作为角标使用。这时就必须
要想到数组的使用。就可以将这些数据存储到数组中。根据运算的结果作为角标直接去查数组中对
应的元素即可。这种方式称为查表法。
public static void toHex(int num){
if(num == 0){
System.out.println("0");
return;
}
//定义一个对应关系表
char[ ] chs ={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
一会查找会出现比较多的数据,数据一多,就先存储起来,再进行操作。所以定义一个临时
容器,数组。
char[] arr = new char[8];
intpos = arr.length;
while(num!= 0){
inttemp = num & 15;
arr[--pos]= chs[temp];
num= num >>> 4;
}
System.out.println("pos="+pos);
for(int x=pos;x
System.out.print(arr[x]);
}
}
进制转换整合:
public static void trans(intnum,int base,int offset){
if(num == 0){
System.out.println("0");
return;
}
//定义一个对应关系表
char[ ] chs ={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}
char[] arr = new char[32];
intpos = arr.length;
while(num!= 0){
inttemp = num & base;
arr[--pos]= chs[temp];
num= num >>> offset;
}
System.out.println("pos="+pos);
for(intx=pos;x
System.out.print(arr[x]);
}
}
public static void toHex(int num){
trans(num,15,4);
}
public static void toOctal(intnum){
trans(num,7,3);
}
public static void toBinary(intnum){
trans(num,1,1);
}
使用查表法获取星期。
public static String getWeek(intnum){
if(num>7 || num<1){
return "错误的星期";
}
String[ ] weeks ={"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
return weeks[num];
}
数组中的数组:二维数组。
格式1:int[ ][ ] arr = new int[3][2];
定义了名称为arr的二维数组。二维数组中有3个一维数组。每个一维数组中有2个元素。一维数组
的名称分别为arr[0],arr[1],arr[2]。给第一个一维数组1脚标位赋值为78写法是:arr[0][1]=78;
格式2:int[ ][ ] arr = new int[3][];
二维数组中有3个一维数组。每个一维数组都是默认初始化值null。可以对这三个一维数组分别进行
初始化。
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];