黑马程序员_java数组
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、数组
同一种类型数据的集合,数组就是一个容器。
数组可以自动给数组中的元素开始编号,方便操作这些元素。
格式1:元素类型[ ] 数组名 = new 元素类型[元素个数或者数组长度];
格式2:元素类型[ ] 数组名 = new 元素类型[ ]{元素,元素,... };
new会在容器中产生一个可以存储数据的实体。数组类型数据引用数据类型。
表示数组中每个元素的具体位置格式为:数组名[位置数 ] 位置数是从零开始的
数组建立在内存中的流程:
int [ ] x = new int[ ];
int [ ] x 先会在栈内存中建立一个x,使用数组的时候,次值存在,数组使用完成后就是释放栈内存,就是说栈内存是一个临时性的内存空间。
小知识:所有局部变量,都定义在栈内存中
new 就是建立一个实体,实体包括数组和对象。只要运行new 就会在堆内存中分配空间。并且在其中每个元素都建立对应的角标,是从0开始的,一定要注意是从0开始的。
每个内存都有一个地址值,是二进制的,此时就把数组在内存中的地址值赋给x ,此时是一个赋值动作。
当数组建立的是,就会在内存中给默认初始化值,整型类0 ,布尔型为false。
null 空 ,只有引用类数据类型可以用这个关键字。如 x = null 就是把数组的地址值变为空,如果这样在程序里,就是得原数组没有地址值指向,所以,此时为垃圾,无效数据。
堆内存中的特点:1)地址值 2)默认初始化值 3)垃圾回收机制
其中垃圾回收机制,就是java里,本身会定期清理垃圾数据。
一个数组固定长度,比如3,当程序打印角标为3的时候,就会出错,但是程序编译的时候不会出错,语法上也没有错误。但程序一旦运行,就会显示角标出错。说明在编译程序的时候,数组并没有建立,程序开始运行的是数组才会建立起来。这个要注意。
二、数组的操作
一般的数组操作都会用到遍历。数组中有一个属性可以直接获取到数组元素的个数,length,使用方法为 数组名.length 。
1、常见操作以:遍历
一下为一个遍历数组的函数:
public static void printarr(int[] arr) 这是要获取一个元素为int型的数组
{
for (int x=0;x<arr.length ;x++ ) arr.length 为数组元素个数,牢记,数组部分常用
{
if(x!=arr.length-1)
System.out.print(arr[x]+",");
else
System.out.print(arr[x]);
}
}
2、常见操作二:获取数组元素最大值
思路:1)获取最值需要进行比较,每一次比较都会有一个比较大的值,因为该值不确定,通过一个变量进行临时存储。
2)让数组中每一元素都与这个变量中的值进行比较,如果大于变量中的值,就用该变量记录较大的值。
3)当所有元素比较完,那么该变量中的存储的就是数组中的最大值了
public static int arr(int[] arr) 返回值类型是int型
{
int max=arr[0];
for (int x=1;x<arr.length ;x++ ) 遍历数组
{
if (arr[x]>max) 相比较,记录最大值
{
max=arr[x];
}
}
return max; 返回最大值,这个一定要注意,出去void型不需要返回值,其他都需
} 要
这个只是int类型的数组,对其他类型的数组,获取最值的方法是一样的,只是数组元素数据类型不一样,所以可以建立重载函数。
3、选择排序
思路:
1、以角标为0的元素开始,与角标为1的数组进行比较,如果1的较小,则两者互换,再以角标为的0的元素与2角标的比较,如果小,则两者互换,依次类推。
2、进行比较,要遍历数组
public static void paiXuArr(int[] arr)
{
for (int x=0;x<arr.length-1 ;x++ ) 从0角标开始,到倒数第二个元素即可,最后一个自己不需要
{ 比较
for (int y =x+1;y<arr.length ;y++ ) 从x+1角标开始到最后一个角标元素,每个角标与x角标比较
{
if (arr[y]<arr[x])
{
int temp =arr[x]; 如果小,两者换位置(此处用第三方变量换位)
arr[x]=arr[y];
arr[y]=temp;
}
}
}
printarr(arr); 调用打印数组的函数
}
4、冒泡排序
思路:相邻两个元素进行比较 ,具体来说,就是角标0与角标1的相比,小的排在前、大的排在后,然后角标1的和角标2的比较,也是小的排在前,大的排在后,依次排序。到数组的最后一定是最大的在最后面。当第二次比较开始时,最后的元素不参与比较,照上比较后,第二大的元素就会排出来,以此类推。程序为
public static void maoPaoArr(int[] arr)
{
for (int x=0;x<arr.length-1 ;x++ ) ............................. 遍历数组元素,只需比较arr.length-1次
{
for (int y =0;y<arr.length-x-1 ;y++ ) ............................此处应注意y<arr.length-x-1 每次比较后比较的
{ 次数就会减少一次,就是减少x,所以-x是让每一次元素比较减
if (arr[y]<arr[y+1]) 少。如果元素个数为5,当y取到arr.length-1,即5-1=4时,y+
{ 1就是5,超出最大角标数4了,所以y最大只能取到3,所以
int temp =arr[y]; y<arr.length-x-1。
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
printarr(arr);
}
排序最快的为,希尔排序。
在以上程序中,要注意到共性的部分,比如位置置换,相对应的可以把这个功能单独写成一个函数,以待调用。
5、数组查找 折半查找
折半查找就是从中劈开,然后比较大小。所以,数组必须是有序的数组,注意是有序的数组。这种方法可以调高效率。具体程序例子:
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(arr[mid]==key)
{
if (key>arr[mid])
min=mid+1;
else
max=mid-1;
if(min>max)
return -1;
mid=(min+max)/2;
}
return mid;
}
这个程序也可以用于把一个数插入到这个有序的数组,还保证数组有序,获取的位置就是返回最小角标min为数值。
6、二维数组
格式 int[ ][ ] arr = new int [3 ] [2 ]; 此处定义了一个名为arr的二维数组,二维数组中有有3个一维数组,每个一维数组里有两个元素。两个一维数组角标为0和1,每个一维数组里的元素角标按一维数组来排。所以,要是想赋值给第二个二维数组中最后一个元素,写成: arr[1][1] = 90
要是想初始化一个一维数组,写成 arr[1]=new int[1];
注意:在二维数组中
System.out.println(arr); 此时打印的是二维数组的地址值
System.out.println(arr[0]); 此时打印的是二维数组中第一个一维数组的地址值
int[ ][ ] arr = new int [3 ] [ ]; 此处第二个括号里不写值 此时在System.out.println(arr[0]); 结果是:null 。
因为每个数组是引用数据类型,所以默认初始化值为null。在这之后如果初始化一维数组,那么就在内存中开辟空间存放一维数组,并把这个一维数组的地址值付给相对应arr[0]、arr[1]、arr[2],实质指向一维数组七、进制转换的联系
class ArrayTest7
{
public static void main(String[] args)
{
toBin(-6);
System.out.println();
toBin(6);
System.out.println();
toHex(-60);
System.out.println();
toHex(60);
System.out.println();
}
public static void toBin(int num) ............//二进制转换
{
trans(num,1,1);
}
public static void toHex(int num)...............//十六进制转换
{
trans(num ,15,4);
}
public static void trans(int num,int base,int offset)..........................转换进制的基本调用函数
{
//建表
char[] chs = new char[]{'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;
}
for(int x=pos;x<arr.length;x++)..........................................打印容器里的元素
{
System.out.print(arr[x]);
}
}
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------