Skip to content

数组类型

  • Java 的数组总是会被自动初始化,并且无法越界访问和(会进行检查),比如对于一个对象的(引用)数组会被全部初始化为 null

  • 初始化:为数组开辟空间

  • 静态初始化 new int[]{ 1,2,3 }; 简化 int[] array= { 1,2,3 };
  • 动态初始化 new int[n]
  • Integer[]a={1,2,3} 完整的写法 Integer[]a=new Integer[]{1,2,3}
  • int[][] ranks = new int[totalElements][];

  • 非基本类型引用数组

  • 创建的数组每一项引用 null
  • 还需要对每一项进行初始化

    //引用全部初始化为 null(基本数据类型为 0)
    Object [] b = new Object [5];
    //对数组的每一项及逆行初始化
    Object [] c = {new Object(), new Object()};
    

  • 不能实例化参数化类型数组 ^1f44a2

  • 只能先创建Object数组再进行强制类型转换
  • 注意强制转型要使用@SuppressWarnings("unchecked")
  • 也可以使用Class创建出具有精确数据类型的数组,这样最终转化为T类型的数组更为安全

      private T [] array;
      @SuppressWarnings("unchecked")
      public
      GenericArrayWithTypeToken(Class <T> type, int sz) {
        array = (T [])Array.newInstance(type, sz);
      }
    

  • 集合类型支持这个功能

    • List<Peel<Banana>> peels = new ArrayList<Peel<Banana>>(10);
  • 可以先创建无参数list再强制转型
    Peel<?>[] peels = new Peel<?>[10]; // 创建一个通配符类型的数组
    Peel<Banana>[] bananaPeels = (Peel<Banana>[]) peels; // 转型
    

Arrays工具类

  • sort:对数组进行排序。
  • 要求被排序对现象实现Comparable接口(含compareTo)
    @Override public int compareTo(CompType rv) {
        return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
      }
    
  • 颠倒排序Arrays.sort(arr,Collections.reverseOrder())
  • 也可以传入自定义的Comparator

    class CompTypeComparator
    implements Comparator <CompType> {
      public int compare(CompType o1, CompType o2) {
        return (o1.j < o2.j ? -1 : (o1.j == o2.j ? 0 : 1));
      }
    }
    Arrays.sort(a, new CompTypeComparator());
    

  • binarySearch:在已排序的数组中进行二分搜索。

  • 如果没有找到会返回负数,表示-(insertion point -1)即应该插入的位置(比目标值大的第一个元素的索引值)
  • 可以传入Comparator
  • Arrays.binarySearch(arr,n)
  • toString:生成数组内容的字符串表示。
  • deepToString生成多维数组的表示
  • asList:将数组转换为List
  • copyOf(arr,len,[target.class])按新的长度创建已有数组的副本(深拷贝)
  • copyOfRange(arr,from,to,[target.class])对指定范围创建副本
  • equals(a,b)用于比较两个对象是否在概念上相等。其默认行为是比较对象引用,但通常被重写以比较对象的内部状态。
  • deepEquals用于深度(递归)比较两个对象。它特别适用于比较数组或复杂的嵌套对象,可以递归地比较对象的内部元素。(可以用与多维数组)
  • Arrays.deepToString(list)用于对数组打印输出
  • Arrays.fill(arr,[from,to],content)对数组进行填充
  • Arrays.setAll(arr,lambda)可以通过下标填充数组生成元素
    Arrays.setAll(ia, n -> n); 
    Arrays.setAll(ca, SimpleSetAll:: getChar);
    
  • 除了初始化也可以用于对数组的每个元素进行一定的操作和修改
  • 并行版本parallelSetAll在多个线程上并行执行,适用于大型数组或计算密集型的赋值操作。