Java 中Arrays工具类的使用

简介: Java 中Arrays工具类的使用

介绍

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


目录
相关文章
|
2天前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号
8 2
|
2天前
|
算法 Java
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
10 3
|
3天前
|
Java easyexcel
java开发excel导入导出工具类基于EasyExcel
java开发excel导入导出工具类基于EasyExcel
13 1
|
4天前
|
Java
java工具类调用service层,mapper层
java工具类调用service层,mapper层
8 1
|
8天前
|
Java 数据库连接
Java的数据库连接工具类的编写
Java的数据库连接工具类的编写
11 1
|
16天前
|
Java 数据安全/隐私保护
JAVA中MD5加密(MD5工具类)
JAVA中MD5加密(MD5工具类)
16 1
|
23天前
|
存储 并行计算 Java
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
18 2
|
1天前
|
XML 安全 Java
一篇文章讲明白JAVA常用的工具类
一篇文章讲明白JAVA常用的工具类
|
2天前
|
Java
技术经验分享:Java中Arrays详解
技术经验分享:Java中Arrays详解
|
3天前
|
Java 数据安全/隐私保护
随机密码生成工具类(java)
随机密码生成工具类(java)
5 0