最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于JAVA 數(shù)組的使用介紹

 更新時(shí)間:2013年04月15日 10:39:39   作者:  
本篇文章小編將為大家介紹,關(guān)于JAVA 數(shù)組的使用介紹,有需要的朋友可以參考一下

JAVA數(shù)組與容器類(lèi)主要有三方面的區(qū)別:效率、類(lèi)型和保存基本類(lèi)型的能力。在JAVA中,數(shù)組是一種效率最高的存儲(chǔ)和隨機(jī)訪問(wèn)對(duì)象引用序列的方式。數(shù)組就是一個(gè)簡(jiǎn)單的線性數(shù)列,這使得元素訪問(wèn)非常快速。但是為此付出的代價(jià)卻是數(shù)組的大小被固定,并且在其生命周期中不可改變。

由于范型和自動(dòng)包裝機(jī)制的出現(xiàn),容器已經(jīng)可以與數(shù)組幾乎一樣方便地用于基本類(lèi)型中了。數(shù)組和容器都可以一定程度上防止你濫用他們,如果越界,就會(huì)得到RuntimeException異常。數(shù)組碩果僅存的優(yōu)勢(shì)便是效率,然而,如果要解決更一般化的問(wèn)題,那數(shù)組可能會(huì)受到過(guò)多的限制,因此這種情況下大部分還是會(huì)選擇容器。

因此,如果使用最近的JAVA版本,應(yīng)該優(yōu)先選擇容器而不是數(shù)組。只有在已證明性能已成為問(wèn)題,并且切換到數(shù)組可以提高性能時(shí),才應(yīng)該重構(gòu)程序?yàn)閿?shù)組。

【初始化】
JAVA對(duì)數(shù)組初始化有很?chē)?yán)格的規(guī)定,這樣可以有效地防止濫用數(shù)組。如果初始化錯(cuò)誤,會(huì)直接得到CompileException而不是RuntimeException。在未對(duì)數(shù)組正確初始化之前,無(wú)法用此數(shù)組引用做任何事情。
數(shù)組定義有int[] array 和int array[],一般采用第一種風(fēng)格,可以將類(lèi)型與變量名分開(kāi)。
數(shù)組的初始化有兩種方式,靜態(tài)初始化和動(dòng)態(tài)初始化。初始化的時(shí)候必須指定長(zhǎng)度,多維數(shù)組第一維的長(zhǎng)度必須指出,同時(shí)必須由高維向低維定義。初始化動(dòng)作可以在代碼的任何地方,而用{}方式只能在創(chuàng)建數(shù)組的地方出現(xiàn)。具體初始化方式見(jiàn)程序:

復(fù)制代碼 代碼如下:

public class javaArrayInit{
    public static void main(String args[]){
        int[] arrayA; //未初始化
        int[] arrayB = new int[5]; //靜態(tài)初始化
        //System.out.println(arrayA.length);  //CompileException
        System.out.println("arrayB length: " + arrayB.length); //無(wú)法得到實(shí)際保存的元素個(gè)數(shù)

        arrayA = new int[10]; //動(dòng)態(tài)初始化
        System.out.println("arrayA length: " + arrayA.length);

        int[] arrayC = new int[]{1,2,3,4};
        System.out.println("arrayC length: " + arrayC.length);

        //int[] arrayD = new int[1]{1}; //錯(cuò)誤的初始化,不能同時(shí)定義維和初始化值

        int[][] arrayE = new int[1][];
        System.out.println("arrayE length: " + arrayE.length);

        //int[][] arrayF = new int[][2]; //應(yīng)先指定高維的長(zhǎng)度

        int[][] arrayG = new int[][]{{1,2,3,4},{5,6,7},{7,24,23,24}};
        System.out.println("arrayG length: " + arrayG.length);

        int[][][] arrayH = new int[][][]{{{1,2,3},{4,5,6},{7,8,9},{10,11,12}}};
        System.out.println("arrayH length: " + arrayH.length);

        dummyArray[] arrayI = {new dummyArray(),new dummyArray()}; //自定義數(shù)組類(lèi)型
        System.out.println("arrayI length: " + arrayI.length);
        System.out.println("arrayI[1]: " + arrayI[1].getValue());

        dummyArray[] arrayK = new dummyArray[5];
        System.out.println("arrayK[0]: " + arrayK[0]); //null
        for(int i = 0; i < arrayK.length; i++){
            arrayK[i] = new dummyArray();
        }
        System.out.println("arrayK[0]: " + arrayK[0].getValue()); //2
    }
}
class dummyArray{
    private static int temp;
    private final int arrayValue = temp++;
    public int getValue(){
        return arrayValue;
    }
}

輸出:

arrayB length: 5
arrayA length: 10
arrayC length: 4
arrayE length: 1
arrayG length: 3
arrayH length: 1
arrayI length: 2
arrayI[1]: 1
arrayK[0]: null
arrayK[0]: 2


【length】
只讀成員length是數(shù)組對(duì)象的一部分(雖然實(shí)際上API里面并沒(méi)有聲明這個(gè)變量,是運(yùn)行時(shí)動(dòng)態(tài)生成),這是唯一一個(gè)可以訪問(wèn)的字段或方法。而[]語(yǔ)法是訪問(wèn)數(shù)組對(duì)象的唯一方式,容器是通過(guò)get()方法訪問(wèn)。可以使用Array.length來(lái)得到數(shù)組的大小,注意與String類(lèi)型的String.length()區(qū)分。Array使用的是成員變量的方式,而String使用的是成員方法的方式。同時(shí),Array.length只能得到數(shù)組的大小,而無(wú)法得到數(shù)組實(shí)際有多少元素。多維數(shù)組的length只計(jì)算第一維的長(zhǎng)度。
復(fù)制代碼 代碼如下:

public class javaArrayLength{
    public static void main(String args[]){
        int[] arrayA = new int[15];
        arrayA[1] = 1;
        arrayA[2] = 2;
        arrayA[3] = 3;
        System.out.println("arrayA length: " + arrayA.length);

        int[][] arrayB = new int[10][];
        System.out.println("arrayB length: " + arrayB.length);

        int[][] arrayC = new int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7},};//注意后面的逗號(hào)
        System.out.println("arrayC length: " + arrayC.length);

        int[][] arrayD = new int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7},{}};
        System.out.println("arrayD length: " + arrayD.length);
    }
}
輸出:

arrayA length: 15
arrayB length: 10
arrayC length: 3
arrayD length: 4


【Arrays.fill】
Arrays.fill是一個(gè)作用十分有限的方法,因?yàn)樗荒苡猛粋€(gè)值填充各個(gè)位置(如果是對(duì)象,則復(fù)制同一個(gè)引用進(jìn)行填充)。使用Arrays.fill可以填充整個(gè)數(shù)組或者數(shù)組的某一個(gè)區(qū)域,但是由于只能用單一的數(shù)值來(lái)調(diào)用Arrays.fill,因此作用并不是很大。

【賦值與引用】
JAVA數(shù)組初始化的時(shí)候擁有的只是對(duì)數(shù)組的引用,并沒(méi)有給數(shù)組分配存儲(chǔ)空間。因此,數(shù)組之間的復(fù)制不能簡(jiǎn)單地用“=”賦值,因?yàn)椴僮鞯氖峭粚?duì)象。如下程序:
復(fù)制代碼 代碼如下:

public class javaArrayQuote{
    public static void main(String args[]){
        String testA = "testA";
        String testB = "testB";
        String[] arrayA = new String[]{"arrayA"};
        String[] arrayB = new String[]{"arrayB"};
        testB = testA;
        testB = "testB change";
        System.out.println("I'm testA,I have no changed: " + testA);
        arrayB = arrayA;
        arrayB[0] = "arrayB have changed";
        System.out.println("I'm arrayA, I have no changed: " + arrayA[0]);

    }
}
輸出:

I'm testA,I have no changed:testA
I'm arrayA, I have no changed:arrayB have changed


可以看出,我們改變arrayB[0]的值,改變的是引用的數(shù)組,因此我們輸出arrayA[0],其實(shí)和arrayB[0]一樣。

【數(shù)組復(fù)制】
        JAVA中復(fù)制數(shù)組的方法:

        1.使用FOR循環(huán)復(fù)制全部或指定元素,效率較低
        2.使用clone方法,得到數(shù)組的值,而不是引用。然而clone不能復(fù)制指定元素,靈活性較低
        3.使用System.arraycopy(src, srcPos, dest, destPos, length)方法,java標(biāo)準(zhǔn)類(lèi)庫(kù)提供有static方法 System.arraycopy(),用它復(fù)制數(shù)組要比f(wàn)or循環(huán)快很多,System.arraycopy()針對(duì)所有類(lèi)型做了重載,基本類(lèi)型數(shù)組和對(duì)象數(shù)組都可以用System.arraycopy()復(fù)制,但是對(duì)象數(shù)組只是復(fù)制引用,不會(huì)出現(xiàn)兩份對(duì)象的拷貝。這被稱(chēng)作淺復(fù)制(shallowcopy)。
               src:源數(shù)組;
                srcPos:源數(shù)組要復(fù)制的起始位置;
                dest:目的數(shù)組;
                destPos:目的數(shù)組放置的起始位置;
                length:復(fù)制的長(zhǎng)度.
        注意:System.arraycopy()不會(huì)進(jìn)行自動(dòng)包裝和自動(dòng)拆包,因此兩個(gè)數(shù)組必須是同類(lèi)型或者可以轉(zhuǎn)換為同類(lèi)型的數(shù)組。同時(shí),這個(gè)方法也可以用于復(fù)制數(shù)組本身。
        int[] test ={0,1,2,3,4,5,6};
        System.arraycopy(test,0,test,3,3);
        則結(jié)果為:{0,1,2,0,1,2,6};
        測(cè)試程序如下:
復(fù)制代碼 代碼如下:

public class javaArrayCopy{
    public static void main(String args[]){
        int[] array = {1,2,3,4,5,6,7,8,9};
        //for循環(huán)方法
        int[] arrayA = new int[9];
        for(int i = 0; i < arrayA.length; i++){
            arrayA[i] = array[i];
            System.out.print(arrayA[i] + ",");
        }
        //測(cè)試
        System.out.println("");
        arrayA[1] = 19;
        for(int i = 0; i < arrayA.length; i++){
            System.out.print(arrayA[i] + ",");
        }
        System.out.println("");
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + ",");
        }
        System.out.println("");

        //clone方法
        int[] arrayB = new int[9];
        arrayB = array.clone();
        //測(cè)試
        arrayB[1] = 19;
        for(int i = 0; i < arrayB.length; i++){
            System.out.print(arrayB[i] + ",");
        }
        System.out.println("");
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + ",");
        }
        System.out.println("");

        //System.arrayCopy 方法
        int[] arrayC = new int[9];
        System.arraycopy(array, 0, arrayC, 0, arrayC.length);
        //測(cè)試
        arrayC[1] = 19;
        for(int i = 0; i < arrayC.length; i++){
            System.out.print(arrayC[i] + ",");
        }
        System.out.println("");
        for(int i = 0; i < array.length; i++){
            System.out.print(array[i] + ",");
        }
    }
}

【數(shù)組比較】
Arrays提供了重載后的equals()方法,針對(duì)所有類(lèi)型和Object類(lèi)型都做了重載,用來(lái)比較整個(gè)數(shù)組。數(shù)組相等的條件是元素個(gè)數(shù)必須相等,并且對(duì)應(yīng)位置的元素也相等。而多維數(shù)組的比較用deepEquals()方法。Array.equals()方法比較的兩個(gè)數(shù)組必須是同類(lèi)型的數(shù)組。
復(fù)制代碼 代碼如下:

import java.util.Arrays;
public class javaArrayEquals{
    public static void main(String args[]){
        int[] arrayA = {1,2,3};
        int[] arrayB = {1,2,3,};
        int[] arrayC = new int[4]; //if int[] arrayC = new int[3],return true
        arrayC[0] = 1;
        arrayC[1] = 2;
        arrayC[2] = 3;
        System.out.println(Arrays.equals(arrayA, arrayB));
        System.out.println(Arrays.equals(arrayA, arrayC));

        String[][] arrayD = {{"a","b"},{"c","d"}};
        String[][] arrayE = {{"a","b"},{"c","d"}};
        System.out.println(Arrays.deepEquals(arrayD, arrayE));
    }
}

【數(shù)組排序與查找】
數(shù)組提供了內(nèi)置的排序方法sort(),可以對(duì)任意基本類(lèi)型數(shù)組或者對(duì)象數(shù)組進(jìn)行排序(該對(duì)象必須實(shí)現(xiàn)Comparable接口或者具有相關(guān)聯(lián)的Comparator)。JAVA對(duì)不同的類(lèi)型提供了不同的排序方法----針對(duì)基本類(lèi)型設(shè)計(jì)的快速排序,以及針對(duì)對(duì)象設(shè)計(jì)的“穩(wěn)定歸并排序”,所以無(wú)需擔(dān)心數(shù)組排序的效率問(wèn)題。
 binarySearch()用于在以排好序的數(shù)組中快速查找元素,如果對(duì)未排序的數(shù)組使用binarySearch(),那么將產(chǎn)生難以預(yù)料的結(jié)果。

【返回?cái)?shù)組】
C和C++不能返回一個(gè)數(shù)組,只能返回指向數(shù)組的指針,因?yàn)榉祷財(cái)?shù)組使得控制數(shù)組的生命周期變得困難,并且容易造成內(nèi)存泄漏。java允許直接返回一個(gè)數(shù)組,并且可以由垃圾回收機(jī)制回收。

【數(shù)組與容器轉(zhuǎn)換】【無(wú)法轉(zhuǎn)換基本類(lèi)型數(shù)組】

數(shù)組轉(zhuǎn)為L(zhǎng)ist:
復(fù)制代碼 代碼如下:

import java.util.*;
public class arrayToList{
    public static void main(String args[]){
        String[] arrayA = {"a","b","c"};
        List listA = java.util.Arrays.asList(arrayA);
        System.out.println("listA: " + listA);

        int[] arrayB = {1,2,3};
        List listB = java.util.Arrays.asList(arrayB);
        System.out.println("listB: " + listB);

        Integer[] arrayC = {1,2,3};
        List listC = java.util.Arrays.asList(arrayC);
        System.out.println("listC: " + listC);
    }
}
輸出:


listA: [a, b, c]
listB: [[I@de6ced]
listC: [1, 2, 3]


為什么int和Integer輸出會(huì)不同呢?

List轉(zhuǎn)為數(shù)組
復(fù)制代碼 代碼如下:

import java.util.*;
public class listToArray{
    public static void main(String args[]){
        List<String> list = new ArrayList<String>();
        String[] array;
        list.add("testA");
        list.add("testB");
        list.add("testC");
        System.out.println("list: " + list);

        String[] strings = new String[list.size()];
        array = list.toArray(strings);
        for(int i = 0, j = array.length; i < j; i++){
            System.out.print(array[i] + ",");
        }
    }
}
輸出為:

list: [testA, testB, testC]
testA,testB,testC


【去除重復(fù)數(shù)據(jù)】
利用數(shù)組和容器轉(zhuǎn)換可以方便地去除數(shù)組重復(fù)數(shù)據(jù),不過(guò)如果數(shù)組過(guò)大,效率是一個(gè)問(wèn)題。
復(fù)制代碼 代碼如下:

import java.util.*;
public class javaArrayUnique{
    public static void main(String args[]){
        String[] array = {"a","b","a","a","c","b"};
        arrayUnique(array);
        //test
        for(int i = 0, j = arrayUnique(array).length; i < j; i++){
            System.out.print(arrayUnique(array)[i] + ",");
        }
    }

    public static String[] arrayUnique(String[] array){
        List<String> list = new ArrayList<String>();
        for(int i = 0, j = array.length; i < j; i++){
            if(!list.contains(array[i])){
                list.add(array[i]);
            }
        }
        String[] strings = new String[list.size()];
        String[] arrayUnique = list.toArray(strings);
        return arrayUnique;
    }
}

 關(guān)于效率問(wèn)題,我做了一個(gè)對(duì)比,在我電腦上運(yùn)行十萬(wàn)數(shù)據(jù)的數(shù)組大概是577ms,而運(yùn)行一百萬(wàn)數(shù)據(jù)的數(shù)據(jù)大約要5663ms。這還跟計(jì)算機(jī)的運(yùn)行能力有關(guān),但是明顯是隨著數(shù)組大小遞增的。
復(fù)制代碼 代碼如下:

import java.util.*;
public class javaArrayUnique{
    public static void main(String args[]){
        Double[] array = new Double[100000];
        for(int i = 0, j = array.length; i < j; i++){
            array[i] = Math.ceil(Math.random()*1000);
        }

        Double[] arrayB = new Double[1000000];
        for(int i = 0, j = arrayB.length; i < j; i++){
            arrayB[i] = Math.ceil(Math.random()*1000);
        }

        System.out.println("start");
        long startTime = System.currentTimeMillis();
        arrayUnique(array);
        long endTime = System.currentTimeMillis();
        System.out.println("array unique run time: " +(endTime - startTime) +"ms");

        long startTimeB = System.currentTimeMillis();
        arrayUnique(arrayB);
        long endTimeB = System.currentTimeMillis();
        System.out.println("arrayB unique run time: " +(endTimeB - startTimeB) +"ms");
    }

    public static Double[] arrayUnique(Double[] array){
        List<Double> list = new ArrayList<Double>();
        for(int i = 0, j = array.length; i < j; i++){
            if(!list.contains(array[i])){
                list.add(array[i]);
            }
        }
        Double[] doubles = new Double[list.size()];
        Double[] arrayUnique = list.toArray(doubles);
        return arrayUnique;
    }
}
輸出:

start
array unique run time: 577ms
arrayB unique run time: 5663ms


相關(guān)文章

  • java獲取文件編碼,jsoup獲取html純文本操作

    java獲取文件編碼,jsoup獲取html純文本操作

    這篇文章主要介紹了java獲取文件編碼,jsoup獲取html純文本操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java中ArrayList和LinkedList的區(qū)別詳解

    java中ArrayList和LinkedList的區(qū)別詳解

    這篇文章主要介紹了java中ArrayList和LinkedList的區(qū)別詳解,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • 聊聊Controller中RequestMapping的作用

    聊聊Controller中RequestMapping的作用

    這篇文章主要介紹了Controller中RequestMapping的作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring自動(dòng)裝配之方法、構(gòu)造器位置的自動(dòng)注入操作

    Spring自動(dòng)裝配之方法、構(gòu)造器位置的自動(dòng)注入操作

    這篇文章主要介紹了Spring自動(dòng)裝配之方法、構(gòu)造器位置的自動(dòng)注入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java 入門(mén)圖形用戶(hù)界面設(shè)計(jì)之單選按鈕

    Java 入門(mén)圖形用戶(hù)界面設(shè)計(jì)之單選按鈕

    圖形界面(簡(jiǎn)稱(chēng)GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶(hù)界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶(hù)來(lái)說(shuō)在視覺(jué)上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶(hù)界面的單選按鈕
    2022-02-02
  • java軟引用在瀏覽器使用實(shí)例講解

    java軟引用在瀏覽器使用實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于java軟引用在瀏覽器使用實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • MySQL主鍵約束和外鍵約束的實(shí)現(xiàn)

    MySQL主鍵約束和外鍵約束的實(shí)現(xiàn)

    在MySQL中,主鍵和外鍵約束是通過(guò)約束來(lái)實(shí)現(xiàn)的,本文主要介紹了MySQL主鍵約束和外鍵約束的實(shí)現(xiàn), 具有一定的參考價(jià)值,感興趣的可以了解下
    2023-11-11
  • Java利用遺傳算法求解最短路徑問(wèn)題

    Java利用遺傳算法求解最短路徑問(wèn)題

    遺傳算法(Genetic Algorithm,GA)最早是由美國(guó)的John holland于20世紀(jì)70年代提出,該算法是根據(jù)大自然中生物體進(jìn)化規(guī)律而設(shè)計(jì)提出的。本文將利用遺傳算法求解最短路徑問(wèn)題,需要的可以參考一下
    2022-06-06
  • SpringBoot整合InfluxDB的詳細(xì)過(guò)程

    SpringBoot整合InfluxDB的詳細(xì)過(guò)程

    InfluxDB是一個(gè)開(kāi)源的時(shí)間序列數(shù)據(jù)庫(kù),由Go語(yǔ)言編寫(xiě),適用于存儲(chǔ)和查詢(xún)按時(shí)間順序產(chǎn)生的數(shù)據(jù),它具有高效的數(shù)據(jù)存儲(chǔ)和查詢(xún)機(jī)制,支持高并發(fā)寫(xiě)入和查詢(xún),靈活的數(shù)據(jù)模型和強(qiáng)大的查詢(xún)語(yǔ)言,本文介紹SpringBoot整合InfluxDB的詳細(xì)過(guò)程,感興趣的朋友一起看看吧
    2024-12-12
  • IDEA插件FindBugs的使用詳解

    IDEA插件FindBugs的使用詳解

    這篇文章主要介紹了IDEA插件FindBugs的使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

南丹县| 滨海县| 保山市| 佛教| 南康市| 罗山县| 澄迈县| 鲁甸县| 奎屯市| 吉隆县| 濮阳市| 松江区| 维西| 青铜峡市| 台南市| 兴海县| 偃师市| 游戏| 易门县| 平阳县| 洪雅县| 青冈县| 汽车| 图们市| 陆良县| 衡水市| 桃江县| 耿马| 黄山市| 峨山| 无棣县| 平凉市| 大连市| 邹城市| 嫩江县| 湘阴县| 永平县| 平安县| 屯留县| 安远县| 东平县|