数组
---------------------- android培训、 java培训、期待与您交流! ----------------------一.定义
具有相同类型数据的集合。
注:在特殊情况下,可以不同的数据的集合,如下:
int[] iArr=new int[]{3,4,5,6,'a',7,'k'}
为什么会这样呢?
因为在ascll码中,每个字符都对应一个数值,所以也只有这种情况
二.定义数组的形式
1.元素类型[]数组名= new 元素类型[n];
2.元素类型[]数组名;
数组名=new元素类型[]{元素1,元素2,......};
3.元素类型[]数组名={元素1,元素2,......};
三.栈内存
在栈内存中,一般都是存储局部变量的,这里局部变量都是定义在方法中,而且局部变量可以是基本数据类型和引用类型,所以局部变量要存入栈中的时候,要先给方法分配人口地址才能给变量分配存储空间。
四.堆内存
堆内存都是用来存储数组和对象的,用new关键字新建出来的数组或者对象都是放在堆内存中。堆内存中的实体都有一个对应的首地址值,而且会给实体中的变量赋一个初始值,例如:int 0 ,char '\u0000',double 0.0 ,float 0.0f等。
五.数组在内存中的存储结构
例如:定义一个数组,int[] iArr=new int[]{3,4,5,6};
在内存的结构是:
六.数组中的常见问题
1.数组角标越界,访问不到数组中不存在的角标。
2.空指针异常,如果引用变量没有任何实体指向是,还对其操作实体。
七.数组的操作
class Arr
{
public static void main(String[] args)
{
//int[] iArr=new int[]{3,1,55,8};
//getElement(iArr);
//System.out.println(getMax_Value(iArr));
//selectSort(iArr);
//System.out.println(halfSearch(iArr,55));
//System.out.println(getHex(124));
System.out.println(getWeek(6));
}
/*
需求:
打印出数组中的每一个元素
思想:
1.定义一个独立运行的类
2.定义打印数组元素的功能的方法
3.使用遍历可以实现此功能
4.在主函数中调用该功能
步骤:
1.定义类
2.定义main方法
3.定义得到元素的接收一个数组的方法
4.使用for循环得到数组中的元素
5.将得到的元素打印出来
*/
/*
在数组中,每一个元素都会有一个角标与之对应,如果要对这个元素操作,
那就直接操作这个角标,所以在下面的方法中,因为要得到数组中的元素,角标是依次递增的,
使用for循环不断从数组中去得元素。
*/
public static void getElement(int[] iArr)
{
//遍历出数组中的元素
for(int i=0;i<iArr.length;i++)
{
//不断的打印出数组中的元素
System.out.print(iArr[i]+" ");
}
}
/*
需求:
获取最大值
思想:
1.定义一个获取最大值接收一个数组的方法
2.因为要得到最大值,所以需要数组中的元素逐个进行比较,
3.使用遍历得到数组中的每一个元素
4。定义一个变量,用于存储每轮比较后得到的元素。
5.返回最大值
步骤:
1.定义得到最大值接收数组的方法
2.定义一个变量
3.使用for语句遍历出数值中的元素
4.使用判断表达式来求出最大值。
5.返回最大值
*/
//得到最大值的方法1:
public static int getMaxValue(int [] iArr)
{
//定义变量用来存储比较后的最大值
int maxValue=iArr[0];
for(int i=1;i<iArr.length;i++)
{
//判断遍历数组中的元素是否大于最大值,最终得到最大值
if(iArr[i]>maxValue)
{
maxValue=iArr[i];
}
}
return maxValue;
}
//得到最大值的方法1:
public static int getMax_Value(int [] iArr)
{
//定义一个索引变量
int index=0;
for(int i=1;i<iArr.length;i++)
{
//判断遍历数组中的元素是否大于最大值,最终得到最大值
if(iArr[i]>iArr[index])
{
iArr[index]=iArr[i];
}
}
return iArr[index];
}
/*
排序
选择排序:
需求:
对数组进行排序
思想:
1.定义一个排序的方法
2.因为数组中有角标对应一个值,所以可以直接对角标操作
3.首先把角标0对应的值和后面的值逐一进行比较,不断取出最小的值房贷角标0中
4.角标0就不参与比较,从第二个开始又逐个比较,直到比较完。
5.这里使用for循环完成此功能。
步骤:
a.定义完成此功能的方法
b。使用for语句的嵌套对该数组逐个比较
c.打印排序后的结果
d。在主函数中调用该方法
*/
//方式1
public static void selectSort1(int [] iArr)
{
for(int i=0;i<iArr.length-1;i++)
{
for(int y=i+1;y<iArr.length;y++)
{
if(iArr[i]>iArr[y])
{
int temp=iArr[i];
iArr[i]=iArr[y];
iArr[y]=temp;
}
}
System.out.println(iArr[i]+" ");
}
}
/*
二分查找法
需求:
在数组中是否存在某个值
思想:
1.定义查找方法
2.定义三个变量,用于分别表示第一个,中间,最后一个角标。
3.首先是将要比较的数值与中间角标对应的值进行比较,
4.如果大于中间的值,则把移动第一个角标中间角标加1的位置。
5.如果小于中间的值,则把最后一个角标移动到中间角标减1的位置。
6.以此这样不断判断,直到第一个或者最后一个移动到中间对应值。否则这个数在数组中不存在。
步骤:
1.定义方法
2.定义三个变量,并给与赋初始值。
3.使用循环语句不断判断是否存在,如果存在,则返回对应的值
4.如果不存在则返回-1。
*/
public static int halfSearch(int [] iArr,int key)
{
int min=0;
int max=iArr.length;
int mid=(max+min)/2;
while(key!=iArr[mid])
{
if(key>iArr[mid])
{
min=mid+1;
}
else if(key<iArr[mid])
{
max=mid-1;
}
if(max<min)
return -1;
mid=(max+min)/2;
}
return mid;
}
/*
进制的转换
需求:
分别把十进制转换成二进制、八进制、十六进制
十进制转换成十六进制
思想:
1.定义两个数组,数组1是用来存储十六进制对应的字符的,数组2是用来存储转换后对应的数据
2.判断如果这个数为0是,跳出语句。
3.不断的判断这个数不为0时,把这个数与15相与
4.把相与后的结果作为第一个数组角标,并把这个角标对应的值赋给第二个数组
5.再把这个数右移4位
6.不断从数组2中得到数据
*/
public static String getHex(int num)
{
char[] arr={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] arr1=new char[8];
int pos=arr1.length;
String str="";
if(num==0)
{
System.out.println("0");
return "";
}
while(num!=0)
{
int temp=num&15;
arr1[--pos]=arr[temp];
num=num>>>4;
}
for(int i=pos;i<arr1.length;i++)
{
str=str+arr1[i];
}
//System.out.println(str);
return str;
}
/*
查表法
1.打印出星期
2.定义打印星期的方法
3.根据循环可以得到对应的值
4.定义数组用于存储星期
5遍历出星期
*/
public static String getWeek(int index)
{
String str1=" ";
if(0<=index&&index<=6)
{
String [] str={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
for(int i=0;i<str.length;i++)
{
str1=str[index];
}
}
else
System.out.println("请输入0到6的整数");
return str1;
}
}
八.二维数组
就是一维数组中的数组,也就是一维数组中的元素存的也是数组。
定义格式:
元素类型[][] 数组名=new 元素类型[][];
Int[][ ] arr=new int[][];
元素类型 [ ][ ] 数组名=new 元素类型[ ][ ]{{},{},{}};
Int[] arr=new int[3][2]{{34,66},{34,,77},{87,23}}
九.二维数组的内存图
Int [][] arr=new [3][]{{3,4,5},{1,3},{1}}
这句话的含义是定义一个名为arr的二维数组类型,数组中的元素是int类型的,使用new关键字创建内存空间,这里是创建了三个一维数组,每个数组中不确定元素的个数。使用大括号括起来的元素指定了初始值。
图的表示
二维数组的存储过程:
1. 在堆内存中存储二维数组,首先会产生三个一维数组,用角标对应每个数组指向的值为null,因为还没有找到对应的地址,根据括号里的元素可以确定有三个一维数组,而且第一个一维数组中有三个元素,第二个有二个元素,第三个有1个元素,把这三个数组的首地址赋给对应数组变量,这时把null覆盖了。最后得到完整的二维数组后,又把这个二维数组的首地址赋给栈内存中的数组变量。
二维数组的操作
如果要找到Int [][] arr=new [3][]{{3,4,5},{1,3},{1}}中的5,那就是arr[0][2];
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima