Java基礎之集合框架系列(五)

1.集合工具類概述

2.Collections類

專門對集合進行操作的工具類,裏面全都是靜態方法,可以直接調用。

1.排序

使用場景:List系列集合可以存儲相同的元素,但是無法進行排序,這時就可以使用Collelctions的靜態方法進行排序操作

static <T extends Comparable<? super T>> void sort(List<T>list)
根據元素的自然順序,對指定列表按升序進行排序。

說明:使用以上排序方法時,要求被比較的元素必須實現comparable接口

static <T> void sort(List<T> list, Comparator<? super T> c)
根據指定比較器產生的順序對指定列表進行排序。

說明:使用以上排序方法時,不要求被比較的元素實現comparable接口,因爲排序方式可以在比較器Comparator中進行規定。

示例代碼:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

//自定義比較器-根據字符串長度進行排序
class StrLenComp implements Comparator<String>{

    @Override
    public int compare(String o1, String o2) {
        if(o1.length()>o2.length())
            return 1;
        if(o1.length()==o2.length())
            return o1.compareTo(o2);//當字符串長度相等時將自然順序作爲排序依據
        else
            return -1;
    }

}

//測試用類
public class CollectionsDemo {

    public static void main(String[] args) {
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);

        //使用工具類中的方法對List進行自然排序
        Collections.sort(al);
        System.out.println("自然排序後的集合:"+al);

        //使用工具類中的方法對List進行排序-按照字符串的長度
        Collections.sort(al, new StrLenComp());
        System.out.println("傳入自定義比較器排序後的集合"+al);
    }

}

程序運行結果:

原始集合:[python, R, java, js, ruby]
自然排序後的集合:[R, java, js, python, ruby]
傳入自定義比較器排序後的集合[R, js, java, ruby, python]

2.最值

static <T extends Object & Comparable<? super T>>
T max(Collection<? extends T> coll)
根據元素的自然順序,返回給定 collection 的最大元素。

static <T extends Object & Comparable<? super T>>
T min(Collection<? extends T> coll)
根據元素的自然順序 返回給定 collection 的最小元素。

說明:使用以上方法時,要求集合中的元素必須實現Comparable接口

static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
根據指定比較器產生的順序,返回給定 collection 的最大元素。
static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
根據指定比較器產生的順序,返回給定 collection 的最小元素。

說明:使用以上排序方法時,不要求被比較的元素實現comparable接口。因爲排序方式可以在比較器中進行規定。

示例代碼:

        //部分代碼-本例中的自定義比較器與排序中的比較器類一致,此處省略
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);
        //根據元素的自然順序,返回給定List的最大、最小元素。
        String maxStr=Collections.max(al);
        String minStr=Collections.min(al);

        System.out.println("自然順序下的最大元素:"+maxStr);
        System.out.println("自然順序下的最小元素:"+minStr);

        //根據指定比較器的排序依據,返回List中的最大、最小元素
        String maxStrByComp=Collections.max(al, new StrLenComp());
        String minStrByComp=Collections.min(al,new StrLenComp());

        System.out.println("按照比較器順序獲得的最大元素:"+maxStrByComp);
        System.out.println("按照比較器順序獲得的最小元素:"+minStrByComp);

程序運行結果:

原始集合:[python, R, java, js, ruby]
自然順序下的最大元素:ruby
自然順序下的最小元素:R
按照比較器順序獲得的最大元素:python
按照比較器順序獲得的最小元素:R

3.二分查找

static<T> int binarySearch(List<? extends Comparable<? super T>>list, T key)
使用二分搜索法搜索指定列表,以獲得指定對象。被操作的List對象需要實現Comparable接口,即自身具備比較性。

static <T> int binarySearch(List<? extends T> list,
T key,Comparator<? super T> c)
使用二分搜索法搜索指定列表,以獲得指定對象。被操作的List對象不必實現Comparable接口,但該方法需要傳入一個比較器對象,即通過比較器對List集合中的元素進行排序。

方法說明:如果搜索的元素包含在List中,則返回搜索值的索引;否則返回 (-(插入點) - 1)。插入點被定義爲將鍵插入列表的那一點,即第一個大於此鍵的元素索引。如果列表中的所有元素都小於指定的鍵,則爲 list.size(),即插入點位於List尾部。注意,這保證了當且僅當此鍵被找到時,返回的值將 >= 0。

注意:以上方法只能查找List系列集合中的指定元素,因爲使用二分法查找元素要求操作索引。並且操作的對象必須是先進行相應排序後的有序集合。

示例代碼:

        //部分代碼-本例中的自定義比較器與排序中的比較器類一致,此處省略
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);

        //對集合進行自然排序
        Collections.sort(al);
        System.out.println("自然排序後的集合:"+al);
        //使用二分查找法按照自然順序查找List集合中的特定元素
        int existIndex=Collections.binarySearch(al,"js");
        int notExistindex=Collections.binarySearch(al,"javas");

        System.out.println("按自然順序查找存在的特定元素:"+existIndex);
        System.out.println("按自然順序查找不存在的特定元素:"+notExistindex);

        //對集合進行自定義比較器排序
        Collections.sort(al, new StrLenComp());
        System.out.println("傳入自定義比較器排序後的集合"+al);
        //使用二分查找法按照自定義比較器順序查找List集合的特定元素
        int existIndexByComp=Collections.binarySearch(al, "js", new StrLenComp());

        System.out.println("按照自定義比較器的順序查找存在的元素:"+existIndexByComp);

程序運行結果:

原始集合:[python, R, java, js, ruby]
自然排序後的集合:[R, java, js, python, ruby]
按自然順序查找存在的特定元素:2
按自然順序查找不存在的特定元素:-3
傳入自定義比較器排序後的集合[R, js, java, ruby, python]
按照自定義比較器的順序查找存在的元素:1

4.元素互換

static void swap(List<?> list, int i, int j)
在指定列表的指定位置處交換元素。

示例代碼:

        //部分代碼
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);
        //交換集合中索引爲1和3的兩個元素
        Collections.swap(al, 1, 3);
        System.out.println("交換元素後的集合:"+al);

程序運行結果:

原始集合:[python, R, java, js, ruby]
交換元素後的集合:[python, js, java, R, ruby]

5.批量填充

static <T> void fill(List<? super T> list, T obj)
使用指定元素替換指定列表中的所有元素。

示例代碼:

        //部分代碼
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al); 
        //使用demo填充集合中的所有元素
        Collections.fill(al,"demo");
        System.out.println("經過填充後的集合:"+al);

程序運行結果:

原始集合:[python, R, java, js, ruby]
經過填充後的集合:[demo, demo, demo, demo, demo]

6.批量代替

static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
使用另一個值替換列表中出現的所有某一指定值。

示例代碼:

        //部分代碼
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al); 

        //將集合中的java替換爲demo
        Collections.replaceAll(al, "java", "demo");
        System.out.println("經過代替後的集合:"+al);

程序運行結果:

原始集合:[python, R, java, js, ruby]
經過代替後的集合:[python, R, demo, js, ruby]

7.反轉集合

static void reverse(List<?> list)
反轉指定列表中元素的順序。

示例代碼:

        //部分代碼
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);         
        //對集合進行反轉
        Collections.reverse(al);
        System.out.println("反轉後的集合:"+al);   

程序運行結果:

原始集合:[python, R, java, js, ruby]
反轉後的集合:[ruby, js, java, R, python]

8.反轉比較器

static <T> Comparator<T> reverseOrder()
返回一個比較器,它強行逆轉實現了 Comparable 接口的對象 collection 的自然順序。
static<T> Comparator<T> reverseOrder(Comparator<T>cmp)
返回一個比較器,它強行逆轉指定比較器的順序。

示例代碼:

        //部分代碼
        //新建裝載String對象的TreeSet數組
        TreeSet<String> ts=new TreeSet<String>();
        ts.add("python");
        ts.add("java");
        ts.add("js");
        ts.add("R");
        ts.add("ruby");
        System.out.println("原始集合:"+ts);

        //新建傳入逆向自然順序比較器的TreeSet
        TreeSet<String> reTs=new TreeSet<String>(Collections.reverseOrder());
        reTs.add("python");
        reTs.add("java");
        reTs.add("js");
        reTs.add("R");
        reTs.add("ruby");
        System.out.println("傳入逆向比較器的集合:"+reTs); 

程序運行結果:

原始集合:[R, java, js, python, ruby]
傳入逆向比較器的集合:[ruby, python, js, java, R]

9.隨機置換

即隨機打亂集合的順序:

static void shuffle(List<?> list)
使用默認隨機源對指定列表進行置換。
static void shuffle(List<?> list, Random rnd)
使用指定的隨機源對指定列表進行置換。

示例代碼:

        //部分代碼
        //新建ArrayList集合
        ArrayList<String> al=new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");

        System.out.println("原始集合:"+al);                 
        //對集合進行隨機置換
        Collections.shuffle(al);
        System.out.println("隨機置換後的集合:"+al); 
        //再次對集合進行隨機置換
        Collections.shuffle(al);
        System.out.println("再次隨機置換後的集合:"+al);       

程序運行結果:

原始集合:[python, R, java, js, ruby]
隨機置換後的集合:[ruby, java, js, R, python]
再次隨機置換後的集合:[java, python, ruby, js, R]

10.集合線程安全性

static <T> Collection<T>
synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步collection(線程安全的)。

static <T> List<T>
synchronizedList(List<T> list)
返回指定List支持的同步List(線程安全的)。

static <K,V> Map<K,V>
synchronizedMap(Map<K,V> m)
返回由指定Map支持的同步Map(線程安全的)。

static <T> Set<T> synchronizedSet(Set<T> s)
返回指定 Set 支持的同步Set(線程安全的)。

說明:將非線程同步的集合對象轉換爲線程同步的集合返回,使得集合的線程安全性問題得到解決。

3.Arrays類

用於操作數組的工具類,裏面全是靜態方法,可以直接調用。

1.相關方法

static <T> List<T> asList(T… a)
返回一個受指定數組支持的固定大小的列表。


二分查找:

static int binarySearch(byte[] a, byte key)
使用二分搜索法來搜索指定的 byte 型數組,以獲得指定的值。
static int binarySearch(byte[] a, int fromIndex, int toIndex, byte key)
使用二分搜索法來搜索指定的 byte 型數組的範圍,以獲得指定的值。
static int binarySearch(char[] a, char key)
使用二分搜索法來搜索指定的 char 型數組,以獲得指定的值。
static int binarySearch(char[] a, int fromIndex, int toIndex, char key)
使用二分搜索法來搜索指定的 char 型數組的範圍,以獲得指定的值。
static int binarySearch(double[] a, double key)
使用二分搜索法來搜索指定的 double 型數組,以獲得指定的值。
static int binarySearch(double[] a, int fromIndex, int toIndex, double key)
使用二分搜索法來搜索指定的 double 型數組的範圍,以獲得指定的值。
static int binarySearch(float[] a, float key)
使用二分搜索法來搜索指定的 float 型數組,以獲得指定的值。
static int binarySearch(float[] a, int fromIndex, int toIndex, float key)
使用二分搜索法來搜索指定的 float 型數組的範圍,以獲得指定的值。
static int binarySearch(int[] a, int key)
使用二分搜索法來搜索指定的 int 型數組,以獲得指定的值。
static int binarySearch(int[] a, int fromIndex, int toIndex, int key)
使用二分搜索法來搜索指定的 int 型數組的範圍,以獲得指定的值。
static int binarySearch(long[] a, int fromIndex, int toIndex, long key)
使用二分搜索法來搜索指定的 long 型數組的範圍,以獲得指定的值。
static int binarySearch(long[] a, long key)
使用二分搜索法來搜索指定的 long 型數組,以獲得指定的值。
static int binarySearch(Object[] a, int fromIndex, int toIndex, Object key)
使用二分搜索法來搜索指定數組的範圍,以獲得指定對象。
static int binarySearch(Object[] a, Object key)
使用二分搜索法來搜索指定數組,以獲得指定對象。
static int binarySearch(short[] a, int fromIndex, int toIndex, short key)
使用二分搜索法來搜索指定的 short 型數組的範圍,以獲得指定的值。
static int binarySearch(short[] a, short key)
使用二分搜索法來搜索指定的 short 型數組,以獲得指定的值。
static<T> int
binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c)
使用二分搜索法來搜索指定數組的範圍,以獲得指定對象。
static <T> int
binarySearch(T[] a, T key, Comparator<? super T> c)
使用二分搜索法來搜索指定數組,以獲得指定對象。


數組複製:

static boolean[] copyOf(boolean[] original, int newLength)
複製指定的數組,截取或用 false 填充(如有必要),以使副本具有指定的長度。
static byte[] copyOf(byte[] original, int newLength)
複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
static char[] copyOf(char[] original, int newLength)
複製指定的數組,截取或用 null 字符填充(如有必要),以使副本具有指定的長度。
static double[] copyOf(double[] original, int newLength)
複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
static float[] copyOf(float[] original, int newLength)
複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
static int[] copyOf(int[] original, int newLength)
複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
static long[] copyOf(long[] original, int newLength)
複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
static short[] copyOf(short[] original, int newLength)
複製指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。
static <T> T[]
copyOf(T[] original, int newLength)
複製指定的數組,截取或用 null 填充(如有必要),以使副本具有指定的長度。
static <T,U> T[]
copyOf(U[] original, int newLength, Class<? extends T[]> newType)
複製指定的數組,截取或用 null 填充(如有必要),以使副本具有指定的長度。


數組範圍複製:

static boolean[] copyOfRange(boolean[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static byte[] copyOfRange(byte[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static char[] copyOfRange(char[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static double[] copyOfRange(double[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static float[] copyOfRange(float[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static int[] copyOfRange(int[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static long[] copyOfRange(long[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static short[] copyOfRange(short[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static<T> T[]
copyOfRange(T[] original, int from, int to)
將指定數組的指定範圍複製到一個新數組。
static<T,U> T[]
copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)
將指定數組的指定範圍複製到一個新數組。


數組比較:

static boolean deepEquals(Object[] a1, Object[] a2)
如果兩個指定數組彼此是深層相等 的,則返回 true。
static int deepHashCode(Object[] a)
基於指定數組的“深層內容”返回哈希碼。
static String deepToString(Object[] a)
返回指定數組“深層內容”的字符串表示形式。
static boolean equals(boolean[] a, boolean[] a2)
如果兩個指定的 boolean 型數組彼此相等,則返回 true。
static boolean equals(byte[] a, byte[] a2)
如果兩個指定的 byte 型數組彼此相等,則返回 true。
static boolean equals(char[] a, char[] a2)
如果兩個指定的 char 型數組彼此相等,則返回 true。
static boolean equals(double[] a, double[] a2)
如果兩個指定的 double 型數組彼此相等,則返回 true。
static boolean equals(float[] a, float[] a2)
如果兩個指定的 float 型數組彼此相等,則返回 true。
static boolean equals(int[] a, int[] a2)
如果兩個指定的 int 型數組彼此相等,則返回 true。
static boolean equals(long[] a, long[] a2)
如果兩個指定的 long 型數組彼此相等,則返回 true。
static boolean equals(Object[] a, Object[] a2)
如果兩個指定的 Objects 數組彼此相等,則返回 true。
static boolean equals(short[] a, short[] a2)
如果兩個指定的 short 型數組彼此相等,則返回 true。


填充數組:

static void fill(boolean[] a, boolean val)
將指定的 boolean 值分配給指定 boolean 型數組的每個元素。
static void fill(boolean[] a, int fromIndex, int toIndex, boolean val)
將指定的 boolean 值分配給指定 boolean 型數組指定範圍中的每個元素。
static void fill(byte[] a, byte val)
將指定的 byte 值分配給指定 byte 節型數組的每個元素。
static void fill(byte[] a, int fromIndex, int toIndex, byte val)
將指定的 byte 值分配給指定 byte 型數組指定範圍中的每個元素。
static void fill(char[] a, char val)
將指定的 char 值分配給指定 char 型數組的每個元素。
static void fill(char[] a, int fromIndex, int toIndex, char val)
將指定的 char 值分配給指定 char 型數組指定範圍中的每個元素。
static void fill(double[] a, double val)
將指定的 double 值分配給指定 double 型數組的每個元素。
static void fill(double[] a, int fromIndex, int toIndex, double val)
將指定的 double 值分配給指定 double 型數組指定範圍中的每個元素。
static void fill(float[] a, float val)
將指定的 float 值分配給指定 float 型數組的每個元素。
static void fill(float[] a, int fromIndex, int toIndex, float val)
將指定的 float 值分配給指定 float 型數組指定範圍中的每個元素。
static void fill(int[] a, int val)
將指定的 int 值分配給指定 int 型數組的每個元素。
static void fill(int[] a, int fromIndex, int toIndex, int val)
將指定的 int 值分配給指定 int 型數組指定範圍中的每個元素。
static void fill(long[] a, int fromIndex, int toIndex, long val)
將指定的 long 值分配給指定 long 型數組指定範圍中的每個元素。
static void fill(long[] a, long val)
將指定的 long 值分配給指定 long 型數組的每個元素。
static void fill(Object[] a, int fromIndex, int toIndex, Object val)
將指定的 Object 引用分配給指定 Object 數組指定範圍中的每個元素。
static void fill(Object[] a, Object val)
將指定的 Object 引用分配給指定 Object 數組的每個元素。
static void fill(short[] a, int fromIndex, int toIndex, short val)
將指定的 short 值分配給指定 short 型數組指定範圍中的每個元素。
static void fill(short[] a, short val)
將指定的 short 值分配給指定 short 型數組的每個元素。


獲取哈希碼:

static int hashCode(boolean[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(byte[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(char[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(double[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(float[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(int[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(long[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(Object[] a)
基於指定數組的內容返回哈希碼。
static int hashCode(short[] a)
基於指定數組的內容返回哈希碼。


數組排序:
static void sort(byte[] a)
對指定的 byte 型數組按數字升序進行排序。
static void sort(byte[] a, int fromIndex, int toIndex)
對指定 byte 型數組的指定範圍按數字升序進行排序。
static void sort(char[] a)
對指定的 char 型數組按數字升序進行排序。
static void sort(char[] a, int fromIndex, int toIndex)
對指定 char 型數組的指定範圍按數字升序進行排序。
static void sort(double[] a)
對指定的 double 型數組按數字升序進行排序。
static void sort(double[] a, int fromIndex, int toIndex)
對指定 double 型數組的指定範圍按數字升序進行排序。
static void sort(float[] a)
對指定的 float 型數組按數字升序進行排序。
static void sort(float[] a, int fromIndex, int toIndex)
對指定 float 型數組的指定範圍按數字升序進行排序。
static void sort(int[] a)
對指定的 int 型數組按數字升序進行排序。
static void sort(int[] a, int fromIndex, int toIndex)
對指定 int 型數組的指定範圍按數字升序進行排序。
static void sort(long[] a)
對指定的 long 型數組按數字升序進行排序。
static void sort(long[] a, int fromIndex, int toIndex)
對指定 long 型數組的指定範圍按數字升序進行排序。
static void sort(Object[] a)
根據元素的自然順序對指定對象數組按升序進行排序。
static void sort(Object[] a, int fromIndex, int toIndex)
根據元素的自然順序對指定對象數組的指定範圍按升序進行排序。
static void sort(short[] a)
對指定的 short 型數組按數字升序進行排序。
static void sort(short[] a, int fromIndex, int toIndex)
對指定 short 型數組的指定範圍按數字升序進行排序。
static <T> void
sort(T[] a, Comparator<? super T> c)
根據指定比較器產生的順序對指定對象數組進行排序。
static <T> void
sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
根據指定比較器產生的順序對指定對象數組的指定範圍進行排序。


數組轉化爲字符串:

static String toString(boolean[] a)
返回指定數組內容的字符串表示形式。
static String toString(byte[] a)
返回指定數組內容的字符串表示形式。
static String toString(char[] a)
返回指定數組內容的字符串表示形式。
static String toString(double[] a)
返回指定數組內容的字符串表示形式。
static String toString(float[] a)
返回指定數組內容的字符串表示形式。
static String toString(int[] a)
返回指定數組內容的字符串表示形式。
static String toString(long[] a)
返回指定數組內容的字符串表示形式。
static String toString(Object[] a)
返回指定數組內容的字符串表示形式。
static String toString(short[] a)
返回指定數組內容的字符串表示形式。

2.數組變爲字符串

static String toString(int[] a)
返回指定數組內容的字符串表示形式。

示例代碼:

        //部分代碼
        int[] numStr={2,15,48,95};
        //通過Arrays中的靜態方法將數組轉化爲字符串
        String strNum=Arrays.toString(numStr);
        System.out.println(numStr);
        System.out.println(strNum);

程序運行結果:

[I@139a55
[2, 15, 48, 95]

說明:以上代碼演示了將int型數組轉化爲String字符串的操作。其他的類型的數組轉化與之類似。

3.數組變爲集合

static <T> List<T> asList(T… a)
返回一個受指定數組支持的固定大小的List。

注意:通過這個方法轉化後的集合不可以使用增刪方法,因爲數組的長度是固定的,獲取到的List也是固定大小的。

這樣做的好處:可以使用操作集合的方法來對數組進行操作,可以避免手動封裝相關操作造成的麻煩。

示例代碼:

        //部分代碼
        String[] strArr={"python","ruby","java","js"};
        //通過Arrays中的靜態方法將數組轉化爲集合
        List<String> strList=Arrays.asList(strArr);
        System.out.println("集合的元素個數爲:"+strList.size());
        //通過迭代器對集合中的元素進行取出
        Iterator<String> it=strList.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }

程序運行結果:

集合的元素個數爲:4
python
ruby
java
js

特殊情況:

        //部分代碼
        int[] numStr={2,15,48,95};
        List<int[]> numList=Arrays.asList(numStr);
        System.out.println("集合中的元素個數:"+numList.size());
        System.out.println(numList);

程序運行結果:

集合中的元素個數:1
[[I@139a55]

說明:如果數組中的元素都是基本數據類型,那麼會將該數組作爲集合中的一個元素存在(如上例中的int數組)。如果數組中的元素都是對象,那麼轉化爲集合時,數組中的元素就直接轉化爲集合中的元素。

如果想要將數組中的基本數據分別作爲一個元素存入List集合中,則需要使用基本數據類型的包裝類。

改進的方法:將基本類型數組改爲其包裝類對象數組

改進後的代碼:

        //部分代碼
        Integer[] numArr={2,15,48,95};//自動裝箱
        List<Integer> numList=Arrays.asList(numArr);
        System.out.println("集合中的元素個數:"+numList.size());
        System.out.println(numList);

程序運行結果:

集合中的元素個數:4
[2, 15, 48, 95]

4.集合轉成數組

使用Collection接口中的toArray方法

Object[] toArray()
返回包含此 collection 中所有元素的數組。

<T> T[] toArray(T[] a)
返回包含此 collection 中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。

說明:當指定類型的數組長度小於集合長度時,該方法內部會創建一個新的數組,其長度等於集合的長度;當指定類型的數組長度大於集合長度時,就不會創建新的數組了,而是使用傳遞進來的數組,且對多餘的部分使用null進行填充。因此,建議將傳入的數組長度設置爲集合的長度。

示例代碼:

        //部分代碼
        //新建ArrayList集合
        ArrayList<String> al = new ArrayList<String>();
        al.add("python");
        al.add("R");
        al.add("java");
        al.add("js");
        al.add("ruby");
        System.out.println("原始集合:" + al);               

        //通過List集合的toArray()方法將集合轉化爲數組
        String[] strArr=al.toArray(new String[al.size()]);
        System.out.println(strArr.length);
        //對集合進行循環輸出
        for(int i=0;i<strArr.length;i++)
            System.out.println(strArr[i]);

程序運行結果:

原始集合:[python, R, java, js, ruby]
5
python
R
java
js
ruby

爲什麼要將集合轉化爲數組?
這樣做實際上是爲了限定集合使用者對元素的操作,一般這就代表着不需要或不建議使用者對集合進行增刪操作。


相關閱讀:
菜鳥猿大戰Java之集合框架系列(一)
菜鳥猿大戰Java之集合框架系列(二)
菜鳥猿大戰Java之集合框架系列(三)
菜鳥猿大戰Java之集合框架系列(四)

發佈了49 篇原創文章 · 獲贊 77 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章