介绍
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}]