黑马程序员 java基础之数组



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



 

一维数组

 

Java中有两种数据:primitive类型和objects.

 

数组属于object类型,所以必须用new来创建数组,同时数组具备一下特性:

 

1.数组创建之后就不能改变大小

 

2.数组创建之后,若没有指定初始值,则依据数组类型的不同,会预设不同的初始值

 

int[] myArray;                     //定义一个指向数据的refference

 

myArray = new int[100];    // 创建一个可容纳100个元素的数组,并且用myArray指向它,默认所有的元素值被初始化成0

 

也可以在创建数组的同时进行初始化,这种方式不用指定数组的长度:

 

int[] myArray = {0,3,6,9,12,15,18,21,24,27};

 

或者

 

int[] myArray = new int[] {0,3,6,9,12,15,18,21,24,27};

 

 

 

3.数组有一个length属性,可以取回数组中元素的个数

 

int arrayLength = myArray.length;

二维数组

 

二维数组用数组“名称”与“两个索引”来指定存取数组中的元素。

 

其定义方式与一维数组类似:

 

int[][] arr = {{1,2,3},

 

              {4,5,6}};

 

注意length所代表的长度,数组名后直接加上length(arr.length),所指的是数组有几行;指定索引后加上length(arr[0].length),指的是该行拥有的元素,也就是列的数目。

 

数组的复制

 

1.使用System.arraycopy()方法

 

  System.arraycopy(来源,起始索引,目的,起始索引,复制长度);

 

  例如:

 

  int[] arr1 = {1,2,3,4,5};

 

  int[] arr2 = new int[5];

 

  System.arraycopy(arr1, 0,arr2, 0, arr1.length);

 

2.Java SE 6中,Arrays类新增了copyOf()方法,可以直接返回一个新的数组对象,而其中包括复制的内容

 

  例如:

 

  import java.util.Arrays;

 

  int[] arr1 = {1,2,3,4,5};

 

  int[] arr2 =Arrays.copyOf(arr1,arr1.length);

 

  ArrayscopyOf()方法返回的数组是新的数组对象,所以改变返回数组中元素的值不会影响原来数组中元素的值。copyOf()方法中第二个变量指定新数组的长度,如果新数组的长度超过原来数组的长度,则多出来的元素会保留数组默认值。

 

  除了copyOf()方法外,还有copyOfRange()方法,可以指定来源数组以及要复制的索引范围:

 

  int arr1 = {1,2,3,4,5};

 

  int arr2 =Array.copyOfRange(arr1,1,4);  // 复制索引1开始到索引4(但不包括索引4)的元素,arr2的元素会是2,3,4

 

 

 

Array

 

Array类位于java.util包中,它提供了几个方法可以直接使用:

 

sort() -对指定数组排序,使用的是快速排序法

 

binarySearch() -让你对已排序的数组进行二分查找,如果找到指定的值就返回该值所在的索引,否则就返回负值

 

fill() - Arrays.fill()将已创建数组的默认值改为指定值

 

equals() -比较两个数组中的元素值是否全相等,如果相等返回true,否则返回false

排序

//使用选择排序方式对指定的数组进行排序  
02.  
03.class  Demo  
04.{  
05.    public static void main(String[] args)   
06.    {  
07.        int[] arr= {1,11,5,3,9,55,23,67,18};  
08.        //输出原数组  
09.        printArray(arr);  
10.        //调用排序方法  
11.        selectSort(arr);  
12.        //输出排序后的数组  
13.        printArray(arr);  
14.    }  
15.      
16./* 
17.选择排序 
18.1、先用0角标上的元素依次与其他元素进行比较,将较小值元素存放到0角标。 
19.2、然后再拿1角标上的元素依次进行比较,以此类推。 
20.*/  
21.    public static void selectSort(int[] arr)  
22.    {  
23.        //外循环遍历数组  
24.        for (int x=0;xarr[y])  
31.                {  
32.                    //arr[x]=arr[y];  
33.                    //arr[y]=temp;  
34.                    swap(arr,x,y);  
35.                }     
36.            }  
37.        }  
38.    }  
39.  
40.    //遍历数组  
41.    public static void printArray(int[] arr)  
42.    {  
43.        System.out.print("[");  
44.        for (int x=0;x

//使用冒泡排序方式对指定程序进行排序  
02.  
03.class Demo1   
04.{  
05.    public static void main(String[] args)   
06.    {  
07.        int arr[]={22,63,89,13,6};  
08.        //打印原数组  
09.        printArray(arr);  
10.        //调用排序方法  
11.        bubbleSort(arr);  
12.        //打印排序后的数组  
13.        printArray(arr);  
14.    }  
15.  
16.    /* 
17.    冒泡排序 
18.    1、先从头角标相邻两个元素之间进行比较,将较大值存放在后一个元素中,然后再与后一个元素的进行比较,直至最大值存放到最后一个元素中。 
19.    2、再重复1操作,每次计较次数减一,一圈比完后存放的较大元素不再参与比较。 
20.    */  
21.  
22.    public static void bubbleSort(int[] arr)  
23.    {  
24.        for (int x=0;xarr[y+1])  
29.                    swap(arr,y,y+1);  
30.            }  
31.        }  
32.    }  
33.    //遍历数组  
34.    public static void printArray(int[] arr)  
35.    {  
36.        System.out.print("[");  
37.        for (int x=0;x
折半查找
需求:将一个已知元素插入到一个有序数组中,要求不改变数组顺序,打印元素应该插入数组位置的角标。 
03.思路:1、可以利用折半查找的方式,先定义两个变量,一个初始化0角标,作为最小值,一个初始化为最后一个角标,作为最大值, 
04.        再定义一个变量,存储最小值与最大值的一半,也就是中间位置,然后将已知元素与中间值位元素进行比较。 
05.      2、如果比中间值元素大,则将最小值变为中间值加1,继续取最小值与最大值的中间值元素与已经元素进行比较,以此反复 
06.      3、如果比中间值元素小,则将最大值变为中间值减1,继续取最小值与最大值的中间值元素与已经元素进行比较,以此反复 
07.*/  
08.class  HalfSearch  
09.{  
10.    public static void main(String[] args)   
11.    {  
12.        int[] arr={2,6,9,11,15,19,22,30};  
13.        //打印数组  
14.        printArray(arr);  
15.        int key=20;  
16.        //用第一种折半方式输出插入的角标值  
17.        System.out.println("当key=20在数组arr中插入的角标位置是:"+halfSearch1(arr,key));  
18.        key=1;  
19.        //用第二种折半方式输出插入的角标值  
20.        System.out.println("当key=1在数组arr中插入的角标位置是:"+halfSearch2(arr,key));  
21.    }  
22.  
23.    //折半查找<一>  
24.    public static int halfSearch1(int[] arr,int key)  
25.    {  
26.        int min=0,max=arr.length-1,mid=(max+min)/2;  
27.        while(key!=arr[mid])  
28.        {  
29.            if(min>max)  
30.                return min;  
31.            else if(key>arr[mid])  
32.                min=mid+1;  
33.            else   
34.                max=mid-1;  
35.            mid=(max+min)>>>1;//折半操作             
36.        }  
37.        return mid;   
38.    }  
39.  
40.    //折半查找<二>  
41.    public static int halfSearch2(int[] arr,int key)  
42.    {  
43.        int min=0,max=arr.length-1,mid;  
44.  
45.        while(min>>1;//折半操作  
48.            if(key>arr[mid])  
49.                min=mid+1;  
50.            else if(key
进制转换
/* 
02.使用查表法将十进制转换为二进制、八进制、十六进制 
03.*/  
04.class  Conversion  
05.{  
06.    public static void main(String[] args)   
07.    {  
08.        int num=60;  
09.  
10.        toBin(num);  
11.  
12.        toOct(0);  
13.  
14.        toHex(-num);  
15.    }  
16.  
17.    //转换为二进制  
18.    public static void toBin(int num)  
19.    {  
20.        conversion(num,1,1);  
21.    }  
22.  
23.    //转换为八进制  
24.    public static void toOct(int num)  
25.    {  
26.        conversion(num,7,3);  
27.    }  
28.  
29.    //转换为十六进制  
30.    public static void toHex(int num)  
31.    {  
32.        conversion(num,15,4);  
33.    }  
34.    //转换  
35.    public static void conversion(int num,int diwei,int yiwei)  
36.    {  
37.        //如果num等于0,结果输出为0  
38.        if(num==0)  
39.        {  
40.            System.out.println("num="+0);  
41.            return;  
42.        }  
43.        //定义一个包含二进制、八进制、十六进制的表  
44.        char[] chs={'0','1','2','3','4','5','6','7',  
45.                    '8','9','A','B','C','D','E','F',};  
46.  
47.        //定义一个临时容器  
48.        char[] arr=new char[32];  
49.  
50.        //定义一个操作数组的指针  
51.        int pos=arr.length;  
52.  
53.        //利用与低位最大值的方式取出低位,存到临时数组中  
54.        while(num!=0)  
55.        {  
56.            arr[--pos]=chs[num&diwei];//--pos倒着往临时容器里存  
57.            num >>>=yiwei; //无条件右移相应位数  
58.        }  
59.          
60.        //打印转换后的结果  
61.        for(int x=pos;x




你可能感兴趣的:(黑马程序员 java基础之数组)