Arrays 类
1. 导入包:import java.util.Arrays
2. 常用方法一览表
方法 描述 Arrays.toString()
返回数组的字符串形式 Arrays.sort()
排序(自然排序 和定制排序 ) Arrays.binarySearch()
通过二分搜索法进行查找(前提:数组是有序的 ) Arrays.copyOf()
数组元素的复制 Arrays.fill()
数组元素的填充 Arrays.equals()
比较两个数组内容是否完全一致 Arrays.asList()
将一维数组,转换成 List 集合
一、Arrays.toString()
优点:方便查看数组内容 ,避免了通过遍历来输出内容的繁琐
代码示例
import java. util. Arrays ;
public class main { public static void main ( String [ ] args) { int [ ] arr = { 1 , 2 , 3 , 4 , 5 , 6 } ; System . out. println ( Arrays . toString ( arr) ) ; }
}
[ 1 , 2 , 3 , 4 , 5 , 6 ]
二、Arrays.sort()
(重点! )
1. 自然排序(底层:快速排序 )
import java. util. Arrays ;
public class main { public static void main ( String [ ] args) { int [ ] arr = { 6 , 5 , 9 , 8 , 32 , 1 , 4 } ; Arrays . sort ( arr) ; System . out. println ( Arrays . toString ( arr) ) ; }
}
[ 1 , 4 , 5 , 6 , 8 , 9 , 32 ]
2. 定制排序
(1)引入接口:Comprator
(2)实现接口方法compare
(3)代码示例
1. 原先代码
Arrays . sort ( integer_arr, new Comparator < Integer > ( ) { @Override public int compare ( Integer o1, Integer o2) { return 0 ; }
} ) ;
说明:当前还没有学习泛型 ,代码修改为如下形式
2. 修改后的代码
import java. util. Arrays ;
import java. util. Comparator ; public class main { public static void main ( String [ ] args) { Integer [ ] integer_arr = { 6 , 5 , 9 , 8 , 32 , 1 , 4 } ; Arrays . sort ( integer_arr, new Comparator ( ) { @Override public int compare ( Object o1, Object o2) { Integer n1 = ( Integer ) o1; Integer n2 = ( Integer ) o2; return n1 - n2; } } ) ; System . out. println ( Arrays . toString ( integer_arr) ) ; }
}
[ 1 , 4 , 5 , 6 , 8 , 9 , 32 ]
代码说明
(1)使用自定义排序 1. 传入的参数 为实现了 Comparator
接口 的匿名内部类
三、实现定制排序的底层探究
1. 进入 sort 方法的底层源码
public static < T > void sort ( T [ ] a, Comparator < ? super T > c) { if ( c == null ) { sort ( a) ; } else { if ( LegacyMergeSort . userRequested) legacyMergeSort ( a, c) ; else TimSort . sort ( a, 0 , a. length, c, null , 0 , 0 ) ; }
}
2. 进入 TimeSort 类的 sort 方法
static < T > void sort ( T [ ] a, int lo, int hi, Comparator < ? super T > c, T [ ] work, int workBase, int workLen) { assert c != null && a != null && lo >= 0 && lo <= hi && hi <= a. length; int nRemaining = hi - lo; if ( nRemaining < 2 ) return ; if ( nRemaining < MIN_MERGE ) { int initRunLen = countRunAndMakeAscending ( a, lo, hi, c) ; binarySort ( a, lo, hi, lo + initRunLen, c) ; return ; }
3. 进入binarrySort
方法
private static < T > void binarySort ( T [ ] a, int lo, int hi, int start, Comparator < ? super T > c) { assert lo <= start && start <= hi; if ( start == lo) start++ ; for ( ; start < hi; start++ ) { T pivot = a[ start] ; int left = lo; int right = start; assert left <= right; while ( left < right) { int mid = ( left + right) >>> 1 ; if ( c. compare ( pivot, a[ mid] ) < 0 ) right = mid; else left = mid + 1 ; } assert left == right;
4. 本质:通过c.compare(pivot, a[mid])
的结果来影响排序结果
核心部分代码
while ( left < right) { int mid = ( left + right) >>> 1 ; if ( c. compare ( pivot, a[ mid] ) < 0 ) right = mid; else left = mid + 1 ;
}
总结
(1)public int compare(Object o1, Object o2)
返回的值 > 0
还是 < 0
会影响整个排序的结果 (3)大于 0:从大到小 排序
四、Arrays.binarySearch()
二分查找方法(返回查找元素下标索引 )
注意点
底层源码
private static int binarySearch0 ( int [ ] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1 ; while ( low <= high) { int mid = ( low + high) >>> 1 ; int midVal = a[ mid] ; if ( midVal < key) low = mid + 1 ; else if ( midVal > key) high = mid - 1 ; else return mid; } return - ( low + 1 ) ;
}
代码示例
import java. util. Arrays ; public class main { public static void main ( String [ ] args) { int [ ] arr = { 1 , 2 , 3 } ; System . out. println ( Arrays . binarySearch ( arr, 2 ) ) ; System . out. println ( Arrays . binarySearch ( arr, 10 ) ) ; }
}
1
- 4
代码说明
查找的元素10
不存在 ,应该插入的位置为3
(下标索引 ),返回- (low + 1)
,即- (3 + 1)
,所以返回-4
五、Arrays.copyOf()
数组的拷贝
1. 使用方法:Arrays.copyOf(原数组 ,拷贝长度 ) (1)如果拷贝的长度大于原数组,会在新数组的后面增加null
代码示例
import java. util. Arrays ; public class main { public static void main ( String [ ] args) { int [ ] arr = { 1 , 2 , 3 } ; int [ ] new_arr = Arrays . copyOf ( arr, arr. length) ; System . out. println ( "arr: " + Arrays . toString ( arr) ) ; System . out. println ( "new_arr:" + Arrays . toString ( new_arr) ) ; }
}
arr: [ 1 , 2 , 3 ]
new_arr:[ 1 , 2 , 3 ]
六、Arrays.fill()
使用方法:Arrays.fill(目标数组 ,填充值 )
理解:把原数组中的所有数替换成填充数
代码示例
import java. util. Arrays ; public class main { public static void main ( String [ ] args) { int [ ] arr = { 1 , 2 , 3 } ; Arrays . fill ( arr, 1 ) ; System . out. println ( "after_fill:" + Arrays . toString ( arr) ) ; }
}
after_fill:[ 1 , 1 , 1 ]
七、Arrays.equals()
比较 两个数组的内容是否一致
使用方法:Arrays.equals(数组一 ,数组二 )
代码示例
import java. util. Arrays ; public class main { public static void main ( String [ ] args) { int [ ] arr = { 1 , 2 , 3 } ; int [ ] arr1 = { 4 , 5 , 6 } ; System . out. println ( "arr.equals(arr1)? " + Arrays . equals ( arr, arr1) ) ; }
}
arr. equals ( arr1) ? false
八、Arrays.asList()
1. 将一维数组转成 List 集合
2. 编译类型:List(接口)
3. 运行类型:java.util.Arrays#ArrayList
,是 Arrays 类的静态内部类
private static class ArrayList < E > extends AbstractList < E > implements RandomAccess , java. io. Serializable
代码示例
import java. util. Arrays ;
import java. util. List ; public class main { public static void main ( String [ ] args) { List aslist = Arrays . asList ( 1 , 2 , 3 ) ; System . out. println ( "aslist:" + aslist) ; System . out. println ( "getclass():" + aslist. getClass ( ) ) ; }
}
aslist:[ 1 , 2 , 3 ]
getclass ( ) :class java. util. Arrays $ArrayList