Java基礎(chǔ)篇——數(shù)組

作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。

 數(shù)組也是一種數(shù)據(jù)結(jié)構(gòu),是一種引用類型的數(shù)組類型,它是用來存放同一類數(shù)據(jù)類型的集合,通過下標(biāo)可以訪問數(shù)組中每一個元素。

1、數(shù)組的聲明:(必須要指明其類型)

        int[] ary;
    int ary[];  //不推薦的寫法,(繼承了C++ 的聲明方式)
這只是聲明了整型數(shù)組變量ary(即:一個引用變量),而沒有把a(bǔ)ry初始化為一個真正的數(shù)組。

2、初始化

    1>、動態(tài)初始化:必須指明數(shù)組長度

        int[] arry = new int[10];//自動初始化全為0
        int[] arry = new int[]{1,2,3,4,5};
     2>、靜態(tài)初始化:只能在聲明數(shù)組時候使用

            int[] arry = {1,2,3,4,5};
       //arry = {1,2,3,4,5}; //編譯錯誤
       arry = new int[]{1,2,3,4,5};
     3>、數(shù)組成員自動初始化為“零”值      ‘零’值:0,0.0,u\0000,false,null

3、數(shù)組的其他 :

   1>、ary.length可以度量數(shù)組的長度

   2>、數(shù)組的大小一旦確定,就不可以改變

   3>、數(shù)組的長度可以允許是0

     int[] ary = new int[0];


實(shí)例1:

         等本金還款

借款本金:18萬

利息:5.6% (年利息)

還款期數(shù)(月):60個月(5年)

每月歸還本金:180000/60=3000

第1個月還利息:180000*(5.6%/12)=840

第2個月還利息:(180000-3000*1)*(5.6%/12)=826

……

第1月   3000 840  3840

第2月   3000 826  3826

……

提示:利用數(shù)組來存放每個月的利息值

代碼示例:

/**
 * 等本金還款
 * @author xcbeyond
 *
 */
public class Demo {
    public static void main(String[] args) {
        int benjin = 180000;
        double ret = 5.6/100;
        int months = 60;
        double[] lixi = new double[months];
        double monthPay = (double)benjin/months;
        //利息計(jì)算
        for(int i = 0;i<months;i++){
            lixi[i] = (benjin-monthPay*i)*(ret/12);
        }
        double sumBenJin = 0;
        double sumLixi = 0;
        double sumPay = 0;
        
        System.out.println("月份\t 本金\t\t利息\t\t本息和");
        for(int i = 0;i<months;i++){
            System.out.print("第"+(i+1)+"月\t");
            System.out.print(monthPay+"\t");
            System.out.print(lixi[i]+"\t");
            System.out.println(lixi[i]+monthPay);
            sumBenJin+=monthPay;
            sumLixi+=lixi[i];
            sumPay+=lixi[i]+monthPay;
        }
        System.out.println("合計(jì)\t"+sumBenJin+"\t"+sumLixi+"\t"+sumPay);
        
    }
}






4、數(shù)組的擴(kuò)展問題

   1〉Java 數(shù)組的大小是固定的

  2〉利用數(shù)組復(fù)制的方法可以變通的實(shí)現(xiàn)數(shù)組擴(kuò)展

      數(shù)組賦值:修改了數(shù)組的引用變量,而沒有進(jìn)行新的內(nèi)存空間的分配,他們共同使用了一個相同的數(shù)組空間,如:

    int[] ary = new int[]{1,2,4,5};
        int[] ary2 = ary;//數(shù)組賦值
     數(shù)組的復(fù)制:重新申請一個新的內(nèi)存空間來存放新的數(shù)組,只是將原數(shù)組元素值分別賦給新開辟的內(nèi)存空間中。如:

        int[] ary3 = new int[ary.length];//重新開辟一個內(nèi)存空間來存儲ary3數(shù)組
    for(int i = 0;i<ary.length;i++) {
            ary3[i] = ary[i];
    }
    數(shù)組的動態(tài)擴(kuò)展:變向的增加了數(shù)組的長度

                int[] ary5 = new int[ary.length+1];
        System.arraycopy(ary,0,ary5,0,ary.length);
        ary = ary5;

   3〉System.arraycopy()可以復(fù)制數(shù)組

     //用方法arraycopy復(fù)制數(shù)組,效率更高  如:

        int[] ary4 = new int[ary.length];
        System.arraycopy(ary,0,ary4,0,ary.length);
    4〉A(chǔ)rrays.copyOf()可以簡便復(fù)制數(shù)組,如:

    int[] ary5 = new int[ary.length+1];
    System.arraycopy(ary,0,ary5,0,ary.length);
    ary = ary5;

實(shí)例2:

   身份證第18位驗(yàn)證計(jì)算法

1>、將前面的身份證號碼17位數(shù)分別乘以不同的系數(shù)

從第一位到第十七位的系數(shù)分別為:

7—9—10—5—8—4—2—1—6—3—7—9—10—5—8—4--2

2>、將這17位數(shù)字和系數(shù)相乘的結(jié)果相加

3>、用加出來和除以11,看余數(shù)是多少?

4>、余數(shù)只可能有0—1—3……10這11個數(shù)字

其分別對應(yīng)的最后一位身份證的號碼為

1—0—x—9—8—7—6—5—4—3—2

5>、通過上面得知,如果余數(shù)是2,就會在身份證的第18位數(shù)字上

例如:3405241980010101x


/**
 * 身份證最后一位數(shù)的驗(yàn)證
 * @author xcbeyond
 *
 */
public class IdCardDemo {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String id = "3405241980010101x";
        if(verify(id)){
            System.out.println("你的身份證"+id+"是合法的");
        }
        else{
            System.out.println("你的身份證"+id+"是非法的!");
        }
        
    }
    //驗(yàn)證是否合法
    public static boolean verify(String id){
        if(id.length()!=18)
            return false;
        //17位各系數(shù)值
        int[] w = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        int sum = 0;
        for(int i = 0;i<w.length;i++){
            sum += (id.charAt(i)-'0')*w[i];
        }
        int c = sum%11;//余數(shù)
        char[] ch = {'1','0','x','9','8','7','6','5','4','3','2'};
        char code = ch[c];
        char last = id.charAt(17);
        last = last == 'x'?'X':last;//驗(yàn)證不管x或X即可
        return last==code;
    }
}

4、數(shù)組排序

Java中,數(shù)組是一種引用型數(shù)據(jù)類型,要想對數(shù)值型數(shù)組進(jìn)行排序,可以直接使用現(xiàn)有Arrays類中sort方法。不過也可以自己編寫相應(yīng)的排序算法,如《排序算法(冒泡排序、選擇排序、插入排序)》 。Arrays類中的sort方法是采用了優(yōu)化的快速排序算法,它的返回類型為void。(Arrays類在JDK1.6后才出現(xiàn),JDK版本低于1.6的無法實(shí)現(xiàn))


import java.util.Arrays;
/**
 * 使用Arrays.sort()排序數(shù)組元素
 * @author xcbeyond
 *
 */
public class ArraysSort {
    public static void main(String[] args) {
        int ary[] ={13,15,37,89,60,39,12,109,56,72} ;
        Arrays.sort(ary);//排序方法
        String s = Arrays.toString(ary);//將數(shù)組元素轉(zhuǎn)化為特殊的字符串樣式
        System.out.println(s);
    }
}

輸出結(jié)果:

        [12, 13, 15, 37, 39, 56, 60, 72, 89, 109]