一、Arrays工具类
Arrays是针对数组操作的工具类。
Arrays不能实例化。内置了私有的默认构造函数,保证其不能被实例化。
位于java.util包
private Arrays() {}
1、成员方法
(1)排序sort方法:对不同类型进行排序。
A、对基本类型的排序
支持以下基本类型:char,byte,short,int,long,float,double进行排序。以下以int为例。
①对数组a进行排序:public static void sort(int[] a)
②对数组a进行指定范围的排序:public static void sort(int[] a, int fromIndex, int toIndex)
对数组a的下标从fromIndex到toIndex-1的元素排序,toIndex位置的元素不参与排序。
例子:
public class ArraysDemo {
public static void main(String[] args) {
int[] a = {1,4,2,10,6,9};
Arrays.sort(a);
for(int i : a){
System.out.print(i+" ");
}
//结果:1 2 4 6 9 10
}
}
public class ArraysDemo {
public static void main(String[] args) {
int[] a = {1,4,2,10,6,9};
Arrays.sort(a,1,4);
for(int i : a){
System.out.print(i+" ");
}
//结果:1 2 4 10 6 9
}
}
B、对Object类型进行排序
它要求传进来的数组对象必须实现Comparable接口。
①对Object数组进行排序:public static void sort(Object[] a)
②对Object数组进行指定范围的排序:public static void sort(Object[] a, int fromIndex, int toIndex)
③带泛型参数的接口,它需要指定一个比较器:public static void sort(T[] a, Comparator c)
例子:
以自定义User类为例子,实现Comeparable< T >接口,重写compareTo接口
public class User implements Comparable<User> {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(User user) {
return age - user.getAge();
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
public class ArraysDemo {
public static void main(String[] args) {
User[] users = new User[5];
users[0] = new User("A",15);
users[1] = new User("B",25);
users[2] = new User("C",18);
users[3] = new User("D",37);
users[4] = new User("E",28);
Arrays.sort(users);
for(User u : users){
System.out.println(u);
}
}
}
结果:
User [name=A, age=15]
User [name=C, age=18]
User [name=B, age=25]
User [name=E, age=28]
User [name=D, age=37]
在Arrays工具类中,内部还使用了多种排序方法进行排序,例如mergeSort(归并排序),快速排序等等。
(2)二分查找方法:public static int binarySearch(int[] arr,int value)
使用二分查找的算法进行查找。
例子:
public class ArraysDemo {
public static void main(String[] args) {
int[] a = { 12, 23, 34, 45, 56, 67 };
System.out.println(Arrays.binarySearch(a, 23));
System.out.println(Arrays.binarySearch(a, 27));
}
}
(3)把数组变成字符串:仍然以int为例子。
public static String toString(int[] a)
(4)将一组对象转换成列表:public static < T > List< T > asList(T… a)
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
将一组对象转换成列表,这里返回的ArrayList并非平常用的java.util.ArrayList ,而是Arrays.java中定义的一个简单的静态内部类–ArrayList。它不支持添加和移除元素,不支持扩容。
静态内部类——ArrayList
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
public int size() {
return a.length;
}
public Object[] toArray() {
return a.clone();
}
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
public E get(int index) {
return a[index];
}
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
public int indexOf(Object o) {
if (o==null) {
for (int i=0; i<a.length; i++)
if (a[i]==null)
return i;
} else {
for (int i=0; i<a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
public boolean contains(Object o) {
return indexOf(o) != -1;
}
}
(5) 获得哈希值:(依然以int为例)
public static int hashCode(int a[])
例子
public class ArraysDemo {
public static void main(String[] args) {
int[] a = {1,3,54,74,22};
System.out.println(Arrays.toString(a));
System.out.println(Arrays.hashCode(a));
System.out.println(Arrays.asList(a));
}
}
(6)填充:以int为例
①public static void fill(int[] a, int val):将数组中的数据替换成val
②public static void fill(int[] a, int fromIndex, int toIndex, int val):将数组中的数据,从fromIndex到toIndex-1全部替换成val
还有对Object对象的填充,此处省略。
public class ArraysDemo {
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,8,9,10};
Arrays.fill(a, 1);
for(int i : a){
System.out.print(i+" ");
}
Arrays.fill(a,1,4,2);
for(int i : a){
System.out.print(i+" ");
}
}
}
(7)比较两个数组的数据是否相同
public static boolean equals(int[] a, int[] a2)
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<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
public static boolean equals(Object[] a, Object[] a2)
具体需要实现什么逻辑的比较,需要重写对象中的equals方法。
public static boolean equals(Object[] a, Object[] 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<length; i++) {
Object o1 = a[i];
Object o2 = a2[i];
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return true;
}
今天大致看了一下Arrays的部分源码跟其他人对于Arrays的讲解与看法,Arrays工具类具有很多方便的功能,例如sort方法,但是里面部分是属于不稳定排序,所以也存在一点的风险吧。然后到Arrays内的hashCode,equals方法,到对object对象的排序需要实现Comparable< T >接口,重写compareTo方法。Arrays工具类也可以适用于很多方面。