1. 程式人生 > 其它 >low-level——java基礎 陣列(5)

low-level——java基礎 陣列(5)

技術標籤:java程式設計java程式語言

陣列

  1. 陣列是最常用的資料型別之一,所有的高階語言都支援這種資料型別。
  2. 在java中,陣列屬於引用型別,它的處理機理和使用方式與基本型別的資料有較大的不同。
  3. 在java中, 對陣列有著嚴格的規範,首先,陣列的元素必須是同一型別,其次陣列一旦建立,它的長度是不可變的(固定長度),陣列在記憶體中按序連續的存放。
  4. 陣列可以存放多個元素,因此可以把陣列當做一個容器來看待。集合型別中有List集合,它的內部其實就是一個數組。
  5. 陣列的使用
    • 1、陣列變數的宣告,語法:資料型別 [ ] 陣列變數
    • 2、陣列的建立,就是在記憶體中為陣列開闢一塊區域。 java中有三種方式。
    • 3、陣列元素的賦值,用陣列變數[索引] = 值;的語法。
    • 4、引和陣列元素,陣列變數[索引]就表示對應元素的值.
    • 5、陣列的遍歷,就是按照索引的順序,逐一取同陣列元素並使用。因為陣列有確定的長度,適合於使用for迴圈。
    • 6、陣列可以作為方法的引數。傳參時傳遞的是陣列的地址,因此方法內所使用的陣列與方法外建立的陣列是同一份資料,那麼在方法內對陣列的修改,也就是對方法外的陣列的修改。
    • 7、陣列作為返回值。
    • 8、陣列的常見異常:①索引越界;②空指標異常。
  • 陣列的缺點:
    • 它的長度在建立後就不能改變,它具有固定的長度。
    • 在實際的程式設計中,經常會遇到把一組資料存放到陣列中進行管理,可是設計時不知道執行時該陣列中會存放多少個元素,因此無法確定陣列的長度。java中提供一種稱為可變長度的陣列型別,他就是ArrayList型別。

一、ArrayList類

  • ArrayList屬於java集合型別中的一種,因為它實現了List介面,所以可稱為列表集合。
  • ArrayList內部有一個成員變數為 elementData,該變數是一個數組,存放到ArrayList中的元素其實都按順序放置在 elementData 的陣列中。
  • ArrayList 號稱大小可變的陣列,可是java中的陣列大小是不能改變的,這不是相互矛盾嗎?
  • 可變大小陣列的實現原理
    1. 當 elementData 在建立時會留有一定的餘量(空出來的位置),如果有新的元素進入,只要有空位置就放在空位置上。
    2. 如果 elementData 被元素佔滿了,陣列中將不能新增新的元素,此時,會建立一個新的陣列(長度在老的陣列長度之上又增加了一定的餘量),把老陣列的資料複製到新陣列,此時新陣列的長度就大於老陣列的長度。
    3. 把新的陣列賦值給 elementData,此時 elementData 引用的是新陣列,新陣列的長度大於老陣列,又有空間可以存放新的元素。
    4. 如果陣列中的元素被刪除,當刪除的個數達到一定的閥值,此時又會建立新的陣列,把老陣列的資料複製到新陣列。那麼新陣列的長度要小於老陣列的長度。
    5. 其實現的根本動作就在於不斷地建立新陣列,然後從老陣列複製資料到新陣列。最終新陣列都在 elementData 進行引用。

二、ArrayList的用法

  • ArrayList 的基本操作包括增刪改查(迭代)。它與陣列除了長度可變還可以在其中插入元素( add(index,object) )。它不能存放基本型別的資料,但通過 add() 方法新增的基本型別的資料會被轉換為對應的包裝型別的物件。
package test;

import java.util.ArrayList;

public class ArrayDemo {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        //向集合中新增元素,元素新增後會有一個對應的索引,也就是陣列的下標。
        list.add("abc");
        list.add("123");
        list.add("xyz");
        list.add(1,"tyu");//指定插入位置
        System.out.println("list的大小(元素的個數):"+list.size());
        //修改其中的某個元素
        list.set(0,"xxx");
        System.out.println("list的大小(元素的個數):"+list.size());
        System.out.println(list.get(0));
        //刪除元素
        list.remove(3);
        System.out.println("list的大小(元素的個數):"+list.size());
        //迭代集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        //如何儲存基本資料型別
        //如果存入的是基本型別,該集合也會把它轉換為對應的包裝型別的物件
        list.add(100);
        list.add(200);
        list.add(300);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i) instanceof Integer);
        }

    }

}

三、String類

  • 又稱為字串型別,它是最常用的型別之一。因此,詳細的瞭解字串的常用操作及內部實現原理是java程式設計師的基本功之一。
  1. String類在java lang包中,因此在類中使用時不需要引包,直接用就可以了。
  2. C語言中表達字串只能字元陣列,java在C語言的基礎,基於字元陣列建立了String型別。那麼String類中有很多操作字元陣列的方法,所以採用String來使用字元陣列功能會更強大,操作會更方便。
  3. 通過原始碼可見,Str ing類的宣告中(public final class Str ing)有一個final關鍵字,說明String 不能被擴充套件(因為它太基礎了,不能做任何改變。)
    private final char value[ ];說明了在類的外部不能直接使用存放字串資料的字元陣列value[ ],只能使用String提供的方法來操作字串。value[ ]被final修飾,說明String型別的物件是不可變的,也就是value[ ]一旦被賦值,就不能改變了。
  4. 如何建立字串物件。
    • 方法1,String str = “abc”;
    • 方法2,String str = new String(“abc”);
    • 注意:字串的使用頻率非常高,所有為了簡化設計,一般都採用直接賦值的方式,較少採用建立物件的方式。
    • 採用賦值方式的字串存在於常量池中,以後再有相同的字串進行賦值,都使用的是這一份字串。
    • 採用構造方法建立的字串存在於堆區中,哪怕兩個串的值相同,也是不同的物件。
    • 因此對字串的等於比較是比較地址而不是值。第一種情況比較的是常量池中的地址,第二種比較的是堆中的地址。
    • 擴充套件:所有引用型別資料的比較都是比較地址而不是值。所有基本型別資料的比較才是值的比較。
  5. 字串之間的比較
    • 所謂字串的值比較,比較的是字串中字元陣列的元素是否完全相同。這種比較要使用字串提供的一個 equals() 來實現。
  6. 關於字串的連線操作
    • 字串的連線最簡單的方式是通過 + 來實現,同時也提供了通過方法的呼叫來實現的方法。
    • 字串的連線操作在程式設計時也是經常使用的,但是,如果要對同一字串變數頻繁的進行連線運算,這是一件非常消耗效能的操作,要儘量避免。如果必須這樣做,應該使用可變字串。原因在於,字串做連線操作後,會在堆中分配一塊新的空間存放這個新的字串,就相當於反覆地多次的建立物件。String str1 = “abc”; str1 = “123”; 這種操作發生後,str1的地址已經發生變化,會指向“123”這個字串所在的位置。因為“123”是新建立的物件,這種特點與字串不可變的特點是相符的。