您的位置:首页 > 职场人生

黑马程序员——Java基础 数组 (复习)

2015-08-25 11:15 344 查看
                     -----------android培训java培训、java学习型技术博客、期待与您交流!------------

一、数组的概念

数组:同一种类型数据的集合,其实数组就是一个容器。

好处:可以给数组中的元素进行自动编号,从0开始,方便操作这些元素。

二、定义数组

1.定义数组的常见格式

格式1:元素类型[ ]  数组名 = new  元素类型 [ 元素个数或数组长度];

例:int[ ] arr = new int [3];    //定义名称为arr一个长度为3的数组

注:格式1的另一种写法: 元素类型  数组名[ ]= new  元素类型 [ 元素个数或数组长度];

格式2:元素类型 [ ] 数组名 = new 元素类型 { 元素1,元素2,元素3,........};

例: int [ ] arr = new int{1,2,3,4,5};  // 定义了名称为arr的数组,并且通过{}的形式,表示出了数组的元素的内容。

        注:格式2也被称为静态初始化方式,它还有一种简化写法

元素类型[ ] 数组名 = {元素1,元素2,元素3,.........};

三、数组操作容易发生的异常

异常1:ArrayIndexOutOfBoundsException  角标越界异常。操作数组时,访问到了数组中不存在的角标。

异常2:NullPointerException  空指针异常。 当引用没有任何指向值为null的情况,该引用还在用于操作实体。

四、数组的常见操作汇总

1.获取数组中的元素:遍历

通过for循环,对数组进行遍历操作。

在数组中有一个属性,可以直接获取到数组中元素的个数。使用方式: 数组名
.
length 

例:int [ ] arr = {1,2,4,5,6,7};

for(int x = 0 ;x<arr.length;x++){

System.out.println(arr[x]);

}    // 通过遍历操作将数组中的元素打印出来

2.获取最值(获取最大值、最小值)

思路:获取最值需要进行比较,每一次比较都会有一个较大(小)的,该值不确定,用一个临时变量进行存储。

    让数组中的每一个元素和这个值进行比较,若果大(小)于该值,就将该变量记录较大(小)的值。

    当所有的元素都比较过后,就完成了获取最值得操作。

3.数组的排序

数组的排序操作常用的有:选择排序、冒泡排序等。

3.1 选择排序

思路:将数组中的第一个元素与第二个元素进行比较,如果大于后面的值,就调换位置。

    这样就将较小的元素放在了第一个位置上了,这是再继续用第一个位置的值与后面的比较。

    这样第一次循环过后,我们就将整个数组中最小的值放到了数组的第一位也就是0角标位。

    再通过上述操作对1角标位置的元素进行操作。如此循环,就可以给数组排序。

/*
选择排序。
内循环结束一次,最值出现头角标位置上。
*/
public static void selectSort(int[] arr)
{
for (int x=0; x<arr.length-1 ; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[x]>arr[y])
{

int temp = arr[x];
arr[x] = arr[y];
arr[y]= temp;

}
}
}
}
3.2 冒泡排序

思路:相邻的两个元素进行比较,如果前一个值大于后一个值,就交换位置。

    这时我们可以发现,经过循环后,值较大的都在往后移动,值较小的都在往前移动。

    这样就可以实现排序。

/*
冒泡排序
*/

public static void bubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-x-1; y++)//-x:让每一次比较的元素减少,-1:避免角标越界。
{
if(arr[y]<arr[y+1])
{

int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;

}
}
}
}


4.数组的常见操作:查找

数组的查找:一般的思想是在给数组遍历的过程中,如果数组中的元素与目标元素相等,直接返回该元素的角标即可。

数组的查找还有另一种方式:折半查找。 但是折半查找有个前提:数组必须是有序的。

折半查找:

思路:1.先定义两个变量(int  min ,int  max ),一个初始化0角标,作为最小值,一个初始化为最后一个角标,作为最大值

    然后还要定义个变量(int  mid= (min+max)/2 ),作为中间值的位置。

   2.用目标值与中间值进行比较,如果比中间值大,就将最小值变为中间值+1的位置,继续重复第一步操作,在进行比较,循环。

   3.用目标值与中间值进行比较,如果比中间值小,就将最大值变为中间值-1的位置,继续重复第一步操作,在进行比较,循环。

<span style="white-space:pre">	</span>/*
折半查找。提高效率,但是必须要保证该数组是有序的数组。
*/
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min = 0;
max = arr.length-1;
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;
}


五、二维数组
1.二维数组的概念

二维数组可以理解为数组中的数组。也就是把数组作为元素存到数组当中。

2.二维数组的定义

格式1:元素类型[ ] [ ] 数组名 = new 元素类型 [一维数组的个数 ] [每个一位数组的长度 ] ;

例: int [ ] [ ] arr = new int [2 ] [3 ];  //定义了一个二维数组,里面有2个一维数组,每个一维数组长度是3.

        格式2: 例: int [ ] [ ] arr = { {1,2,3},{4,2,1},{2,3,4}}; 

六、Arrays 类

Arrays类是专门用于操作数组的工具类。里面封装了可以操作数组的一系列静态方法。

常用部分方法例:

binarySearch(arr , temp);  二分查找。   

copy of (); 复制数组

copyOfRange( arr, from, end);  复制数组的一部分(包含头不包含尾)

equals(); 比较两个数组的内容是否一样
asList();  将数组变成List集合

sort();  对数组进行升序排序

toString(); 将数组变成字符串

由于Arrays中的方法都是static的,所以可以用类名直接调用。格式: Arrays . 方法名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: