这两个类都包含了很多用来操作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);
}
结果:
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:
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()+" ");
}
结果: