天天看點

Arrays及Array

這兩個類都包含了很多用來操作Java數組的靜态函數,分别定義如下:

  • public final class Array
    extends Object
               
  • public class Arrays
    extends Object
               

 二者差別:

Array Arrays

Array類提供靜态方法來動态建立和通路Java數組。

Array允許在擷取或設定操作期間擴大轉換(方法為使用現有的數組建立一個更大的數組),但如果發生縮小轉換,則抛出IllegalArgumentException 。

該類包含用于操作數組的各種方法(如排序和搜尋)。 該類還包含一個靜态工廠,可以将數組視為清單。 

如果指定的數組引用為空,則該類中的方法都抛出一個NullPointerException 

先複習一下數組的基本知識:

int[] ints=new int[5]   //此時虛拟機在在記憶體上申請了一段機關大小四個位元組,長度為5的連續記憶體,并将元素初始化為0;

(數組可以先聲明再初始化,一旦初始化後,數組的長度便不可更改)常用數組的預設值如下:

public static void main(String[] args) {
        int[] ints = new int[1];
        for (int i : ints) System.out.println(i);
        float[] floats = new float[1];
        for (float f : floats) System.out.println(f);
        char[] chars=new char[1];
        chars[0]=72;
        for(char c:chars) System.out.println(c);
        boolean[] booleans=new boolean[1];
        for(boolean b:booleans) System.out.println(b);
        String[] strings=new String[1];
        for(String s:strings) System.out.println(s);
    }
           

結果:

Arrays及Array

Array:

static Object newInstance(Class<?> componentType, int length)  建立具有指定元件類型和長度的新數組
static Object get(Object array, int index)  傳回指定數組對象中的索引元件的值。
static int getInt(Object array, int index) 傳回指定數組對象中的索引元件的值,如 int 
static void set(Object array, int index, Object value) 将指定數組對象的索引元件的值設定為指定的新值。  
static void setBoolean(Object array, int index, boolean z)  将指定數組對象的索引元件的值設定為指定的 boolean值。

代碼示例:(其中用到反射知識,參考我的博文:https://blog.csdn.net/qq_42013035/article/details/103362162)

public static void main(String[] args) {
        int[] ints=new int[5];
        Arrays.fill(ints,3);//初始填充3
        System.out.println("length:"+ints.length);
        for(int i:ints) System.out.print(i+" ");
        int[] ints1= (int[]) Array.newInstance(ints.getClass().getComponentType(),10);//建立一個元素類型為int,長度為10的數組
        System.arraycopy(ints,0,ints1,0,ints.length);
        System.out.println("\nlength:"+ints1.length);
        for(int i:ints1) System.out.print(i+" ");
        System.out.println("\n"+Array.get(ints,3));
    }
           

結果:

Arrays及Array

Arrays:

Arrays是操作數組的工具類,它的功能相比Array更加強大(也可以說是對Array功能的豐富,二者皆有用武之地),在jdk1.2版本釋出。

static <T> List<T> asList(T... a)  傳回由指定數組支援的固定大小的清單。
static boolean deepEquals(Object[] a1, Object[] a2)  如果兩個指定的數組彼此 深度相等 ,則傳回 true
static int deepHashCode(Object[] a)  根據指定數組的“深度内容”傳回哈希碼
static void fill(int[] a, int val)  将指定的int值配置設定給指定的int數組的每個元素。
static void fill(int[] a, int fromIndex, int toIndex, int val)  将指定的int值配置設定給指定的int數組的指定範圍的每個元素
static int hashCode(int[] a)  根據指定數組的内容傳回哈希碼
static int binarySearch(int[] a, int key) (加一個範圍參數) 使用二叉搜尋算法搜尋指定值的位置,沒有則傳回負
static int[] copyOfRange(int[] original, int from, int to)  将指定數組的指定範圍複制到新數組中。 
static void sort(int[] a) 按照數字順序排列指定的數組
static void sort(Object[] a)  對指定對象升序排列的陣列,根據natural ordering的元素
static void sort(int[] a, int fromIndex, int toIndex)  按升序排列數組的指定範圍
static String toString(int[] a) 傳回指定數組的内容的字元串表示形式
static IntStream stream(int[] array, int startInclusive, int endExclusive) 傳回順序IntStream與指定的數組作為源的指定範圍

注:

1.sort()預設使用的是MergeSort(歸并排序),可以自定義其他的算法,但它必須是穩定的

2.當時用binarySearch時,數組一定要是有序的,因為二叉樹搜尋算法用到了二分法

3.sort(Object[] a) 按照的是字元的自然順序排列的

代碼示例:

public static void main(String[] args) {
        int[] ints={2,4,3,1,9,6,5,4};
        System.out.println("inst length:"+ints.length);
        System.out.println(Arrays.toString(ints));
        int[] ints1=Arrays.copyOf(ints,10);//莫名感覺它比Array裡的newInstance厲害哈哈哈
        System.out.println("ints1 length"+ints1.length);
        System.out.println(Arrays.toString(ints1));
        System.out.println("ints1's hashcode:"+Arrays.hashCode(ints1));
        Arrays.sort(ints);
        System.out.println("after sort by Arrays:");
        System.out.println(Arrays.toString(ints));
        System.out.println("binarySearch result is "+Arrays.binarySearch(ints,9));
        System.out.println(Arrays.toString(ints));
        /*
        引用類型資料數組
         */;
        String[] strings={"hello","world","who","are","you"};
        System.out.println(Arrays.toString(strings));
        System.out.println("deep hashcode:"+Arrays.deepHashCode(strings));
        Arrays.sort(strings);
        System.out.println(Arrays.toString(strings));

        List list=Arrays.asList(1,1,2,2,3);//使用将數量較少的元素快速轉換成對應的集合
        System.out.println(list.size());
        Iterator iterator=list.iterator();
        while (iterator.hasNext()) System.out.print(iterator.next().toString()+" ");

    }
           

結果:

Arrays及Array
Arrays及Array