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);
}
结果:
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 List 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与指定的数组作为源的指定范围
注:郑州人流医院 http://www.120zzzzyy.com/
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()+" ");
}
从而得出结果。