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


目录
相关文章
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
14 1
|
1月前
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
|
3月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
27 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
3月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
3月前
|
存储 设计模式 安全
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
52 0
|
4月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
62 1
|
4月前
|
安全 Java 开发者
Java中的并发工具类与线程安全实现
Java中的并发工具类与线程安全实现
|
4月前
|
设计模式 缓存 算法
编写高效的Java工具类:实用技巧与设计模式
编写高效的Java工具类:实用技巧与设计模式
|
4月前
|
并行计算 Java API
Java中的并发工具类详解
Java中的并发工具类详解