介绍
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种算法。
下面我用代码给大家演示一下主要的几个方法:
具体注释已经在代码中给出
第一部分代码
@Test
public void test1(){
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = new int[]{1,3,2,4};
//判断两个数组是否相等
boolean equals = Arrays.equals(arr1, arr2);
System.out.println(equals); //false
//输出数组信息
System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4]
System.out.println(Arrays.toString(arr2));//[1, 3, 2, 4]
//将数组从小到大进行排序
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4]
//将指定值填充到数组中
//使用10,去填充arr1数组,可以理解成是替换原来的元素
Arrays.fill(arr1,10);
System.out.println(Arrays.toString(arr1));//[10, 10, 10, 10]
//该数组是从小到大进行排序
int[] arr3 = new int[]{1,2,4,10,30,50};
//使用binarySearch进行二叉查找
//要求该数组是有序的,如果该数组是无序的,不能使用binarySearch
//如果数组中不存在该元素,则返回return -(low + 1); // key not found.
//low是代表要查找的值,应该存在的位置
int binarySearch = Arrays.binarySearch(arr3, 10);
if (binarySearch>0){
System.out.println(binarySearch);//3
}else {
System.out.println("未找到!");
}
//比如查找52 在数组arr3 中的位置,因为不存在则返回
//return -(low + 1)
//52,在数组中应该存在的位置为6
//所以返回的值为-(6+1) ->-7
int binarySearch = Arrays.binarySearch(arr3, 52);
System.out.println(binarySearch); //输出-7
}
其中Arrays.sort()方法的详解如下:
public class ArraysMethods {
public static void main(String[] args) {
Integer arr[] = {1, -1, 7, 0, 89};
//1.可以直接使用冒泡排序,也可以直接使用Arrays提供的sort方法排序
//2.因为数组是引用类型,所以通过sort排序后,会直接影响到 实现arr
//3.sort()
//4.调用定制排序时,传入两个参数(1) 排序的数组 arr
//(2) 实现了Comparator接口的匿名内部类,要求实现compare方法
//5.先演示效果,再解释
//6.体现了接口编程的方式。看源码
//(1)Arrays.sort(arr, new Comparator)
//(2)最终到了类TimeSort private static <T> void binarySort(T[] a, int lo, int hi, int start,
// Comparator<? super T> c)
//(3)执行到binarySort()方法的代码,会根据动态绑定机制c.compare()执行我们传入的匿名内部类compare()
// while (left < right) {
// int mid = (left + right) >>> 1;
// if (c.compare(pivot, a[mid]) < 0)
// right = mid;
// else
// left = mid + 1;
// }
//(5)public int compare(Integer o1, Integer o2) 返回的值>0 还是<0 会影响整个排序结果
//这就充分体现了接口编程+动态绑定+匿名内部类的综合使用,将来的底层框架和源码的使用方式,会非常常见。
//Arrays.sort(arr); //默认排序方法 升序
//定制排序
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;//降序
}
});
System.out.println("排序后");
System.out.println(Arrays.toString(arr));
}
}
输出结果:
排序后
[89, 7, 1, 0, -1]
第二部分代码
public class Arrays_ {
public static void main(String[] args) {
Integer[] arr = {1, 2, 4, 10, 30, 50};
//copyOf 数组元素的复制
//1.从arr数组中,拷贝arr.length个元素到newArr数组中
//该方法的底层使用的是: System.arraycopy();
Integer[] newArr = Arrays.copyOf(arr, arr.length);
System.out.println("==拷贝执行完毕后==");
System.out.println(Arrays.toString(newArr));
//如果拷贝的长度 > arr.length 就在新数组的后面 增加null
Integer[] newArr1 = Arrays.copyOf(arr, arr.length + 1);
System.out.println(Arrays.toString(newArr1));
//数组少一个
Integer[] newArr2 = Arrays.copyOf(arr, arr.length - 1);
System.out.println(Arrays.toString(newArr2));
//如果拷贝的长度<0 就抛出异常NegativeArraySizeException
// Integer[] newArr3= Arrays.copyOf(arr, - 1);
// System.out.println(Arrays.toString(newArr3));
//asList 将一组值,转换成list
//1.asList方法,会将(2,3,4,5,6,1)数据转换成一个List集合
//2.返回asList编译类型 List(接口)
//3.asList运行类型:java.util.Arrays$ArrayList ,即Arrays类的
//静态内部类 private static class ArrayList<E> extends AbstractList<E>
// implements RandomAccess, java.io.Serializable
List asList = Arrays.asList(2, 3, 4, 5, 6, 1);
System.out.println("asList=" + asList);
System.out.println("asList的运行类型为:"+asList.getClass());
}
}
输出结果如下:
==拷贝执行完毕后==
[1, 2, 4, 10, 30, 50]
[1, 2, 4, 10, 30, 50, null]
[1, 2, 4, 10, 30]
asList=[2, 3, 4, 5, 6, 1]
asList的运行类型为:class java.util.Arrays$ArrayList
Arrays的练习
代码如下
public class ArrayExercise {
public static void main(String[] args) {
Book[] books = new Book[4];
books[0] = new Book("红楼梦", 100);
books[1] = new Book("金瓶梅新", 90);
books[2] = new Book("青年文摘20年", 5);
books[3] = new Book("java从入门到放弃", 300);
//按照price 从小到大排序
// Arrays.sort(books, new Comparator() {
// @Override
// public int compare(Object o1, Object o2) {
// Book book1 = (Book) o1;
// Book book2 = (Book) o2;
// double priceVal = book1.getPrice() - book2.getPrice();
// if (priceVal > 0) {
// return 1;
// } else if (priceVal < 0) {
// return -1;
// } else {
// return 0;
// }
// }
// });
//按照price 从小到大排序
// Arrays.sort(books, new Comparator() {
// @Override
// public int compare(Object o1, Object o2) {
// Book book1 = (Book) o1;
// Book book2 = (Book) o2;
// double priceVal = book2.getPrice() - book1.getPrice();
// if (priceVal > 0) {
// return 1;
// } else if (priceVal < 0) {
// return -1;
// } else {
// return 0;
// }
// }
// });
Arrays.sort(books, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Book book1 = (Book) o1;
Book book2 = (Book) o2;
return book2.getName().length() - book1.getName().length();
}
});
System.out.println(Arrays.toString(books));
}
}
class Book {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
public Book(String name, double price) {
this.name = name;
this.price = price;
}
}
输出结果如下
[Book{name='java从入门到放弃', price=300.0}, Book{name='青年文摘20年', price=5.0}, Book{name='金瓶梅新', price=90.0}, Book{name='红楼梦', price=100.0}]