面试初级Java开发问到Arrays
目录
- 一、基本定义
- 二、常用方法
- 总结
一、基本定义 Arrays类,全路径java.util.Arrays,主要功能为操作数组,Arrays类的所有方法均为静态方法,所以
调用方式全部为Arrays.方法名
【面试初级Java开发问到Arrays】
二、常用方法
1.List asList(T... a)
可以将数组转化为相应的list集合,但是也只能转化为list,asList方法内部构建了一个内部静态类ArrayList,
这个ArrayList也继承自AbstractList,但并不是我们集合中常用的ArrayList,这两者是有区别的,需注意,
内部静态类AbstractList也实现了contains,forEach,replaceAll,sort,toArray等方法,但add,remove等方法则没有
Integer[] array = new Integer[]{1,2,3}; int[] array2 = new int[]{1,2,3}; Listlist1 = Arrays.asList(1,2,3); List list2 = Arrays.asList(array); //加入Java开发交流君样:593142328一起吹水聊天List list3 = Arrays.asList(array2);
2.
void fill(int[] a, int val)、void fill(int[] a, int fromIndex, int toIndex, int val)、void fill(Object[] a, Object val)、void fill(Object[] a, int fromIndex, int toIndex, Object val)
fill方法有多个重载,分别对应几种基本数据类型以及引用类型(Object),
fill(int[] a, int val)
会将整个数组的值全部覆盖为valfill(int[] a, int fromIndex, int toIndex, int val)
则提供了可选的开头和结尾(不包括)int[] array = new int[]{1,2,3}; Arrays.fill(array, 1); Arrays.fill(array, 0, 2, 1); // {1,1,3}String[] str = {"123"}; Arrays.fill(str, "1");
源码如下:
我们可以看到可选开头结尾的重载方法会先做数组越界的校验,防止非法输入
/** * Assigns the specified double value to each element of the specified* range of the specified array of doubles.The range to be filled* extends from index fromIndex, inclusive, to index* toIndex, exclusive.(If fromIndex==toIndex, the* range to be filled is empty.)** @param a the array to be filled* @param fromIndex the index of the first element (inclusive) to be*filled with the specified value* @param toIndex the index of the last element (exclusive) to be*filled with the specified value//加入Java开发交流君样:593142328一起吹水聊天* @param val the value to be stored in all elements of the array* @throws IllegalArgumentException if fromIndex > toIndex* @throws ArrayIndexOutOfBoundsException if fromIndex < 0 or*toIndex > a.length */public static void fill(double[] a, int fromIndex, int toIndex,double val){rangeCheck(a.length, fromIndex, toIndex); for (int i = fromIndex; i < toIndex; i++)a[i] = val; } /** * Assigns the specified float value to each element of the specified array* of floats.** @param a the array to be filled* @param val the value to be stored in all elements of the array */public static void fill(float[] a, float val) {for (int i = 0, len = a.length; i < len; i++)a[i] = val; } /** * Checks that {@code fromIndex} and {@code toIndex} are in* the range and throws an exception if they aren't. */private static void rangeCheck(int arrayLength, int fromIndex, int toIndex) { if (fromIndex > toIndex) { throw new IllegalArgumentException( "fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); } if (fromIndex < 0) { throw new ArrayIndexOutOfBoundsException(fromIndex); } if (toIndex > arrayLength) {//加入Java开发交流君样:593142328一起吹水聊天throw new ArrayIndexOutOfBoundsException(toIndex); }}
3.
int[] copyOf(int[] original, int newLength)、int[] copyOfRange(int[] original, int from, int to)
存在多个重载方式,此处以int举例
从样例中我i们看到,copyOf复制后的数组长度可以大于复制前的数组,根据源码发现,超出的元素被填充为0,引用类型则填充为null
int[] array = new int[]{1,2,3}; int[] array2 = Arrays.copyOf(array, 4);
public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength)); return copy; }
对于copyOfRange,可以选择复制的开头和结尾(不包括),且结尾下标可以大于原数组长度,超出的下标会被填充
int[] array = new int[]{1,2,3,4,5,6,7,8,9}; int[] array2 = Arrays.copyOfRange(array, 3, 6); int[] array3 = Arrays.copyOfRange(array, 3, 10);
/** * Copies the specified range of the specified array into a new array.* The initial index of the range (from) must lie between zero* and original.length, inclusive.The value at* original[from] is placed into the initial element of the copy* (unless from == original.length or from == to).* Values from subsequent elements in the original array are placed into* subsequent elements in the copy.The final index of the range* (to), which must be greater than or equal to from,* may be greater than original.length, in which case* 0 is placed in all elements of the copy whose index is* greater than or equal to original.length - from.The length* of the returned array will be to - from.** @param original the array from which a range is to be copied* @param from the initial index of the range to be copied, inclusive* @param to the final index of the range to be copied, exclusive.*(This index may lie outside the array.)* @return a new array containing the specified range from the original array,*truncated or padded with zeros to obtain the required length* @throws ArrayIndexOutOfBoundsException if {@code from < 0}*or {@code from > original.length}* @throws IllegalArgumentException if from > to* @throws NullPointerException if original is null* @since 1.6 *///加入Java开发交流君样:593142328一起吹水聊天public static int[] copyOfRange(int[] original, int from, int to) { int newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); int[] copy = new int[newLength]; System.arraycopy(original, from, copy, 0,Math.min(original.length - from, newLength)); return copy; }
4.
boolean equals(int[] a, int[] a2)、boolean equals(Object[] a, Object[] a2)
比较2个数组是否相等,基本类型的元素会依次进行==判断,引用类型则会在判空后使用equals【白嫖资料】
public static boolean equals(int[] a, int[] a2) { if (a==a2) return true; if (a==null || a2==null) return false; int length = a.length; if (a2.length != length) return false; for (int i=0; i
5.String toString(int[] a)
假设我们想输出一个数组的全部元素,一种方法是利用循环遍历所有元素后挨个输出
但Arrays提供了一个方案可以直接调用,toString内部实现其实也是通过遍历来实现,
利用可变字符串StringBuilder来构建
public static String toString(int[] a) { if (a == null) return "null"; int iMax = a.length - 1; if (iMax == -1) return "[]"; StringBuilder b = new StringBuilder(); b.append('['); for (int i = 0; ; i++) {b.append(a[i]); if (i == iMax) return b.append(']').toString(); b.append(", "); }}
6.int binarySearch(int[] a, int key)
Arrays内置的二分查找方法,使用条件为参数数组a是有序的,如无序
会导致返回结果错误
1public static int binarySearch(int[] a, int fromIndex, int toIndex, 2int key) { 3rangeCheck(a.length, fromIndex, toIndex); 4return binarySearch0(a, fromIndex, toIndex, key); 5} 6 7// Like public version, but without range checks. 8private static int binarySearch0(int[] a, int fromIndex, int toIndex, 9int key) { 10int low = fromIndex; 11int high = toIndex - 1; 12 13while (low <= high) { 14int mid = (low + high) >>> 1; 15int midVal = a[mid]; 16 17if (midVal < key) 18low = mid + 1; 19else if (midVal > key) 20high = mid - 1; 21else22return mid; // key found23 } 24return -(low + 1); // key not found.25}
总结 本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 2018.03.18
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用