JavaSE——Arrays类、System类

目录

一、Arrays类

1.Arrays.toString()

2.Arrays.sort()

3.Arrays实现冒泡排序的定制排序

4.Arrays.binarySearch()------二叉查找

5.Arrays.copyOf()------数组元素的复制

6.Arrays.fill()------数组的填充

7.Arrays.equals(arr1,arr2)------比较2个数组元素内容是否完全一致

8.Arrays.asList()------将一组值,转换成list

9.Arrays类练习题

二、System类

1.System.exit()

2.System.arrCopy()------数组拷贝

3.System.currentTimeMillis()------返回当前时间距离1970-1-1的毫秒数


一、Arrays类

1.Arrays.toString()

java 复制代码
Integer[] integers = {1, 20, 90};
System.out.println(Arrays.toString(integers)); // [1,20,90]

2.Arrays.sort()

  1. 可以直接使用冒泡排序 , 也可以直接使用Arrays.sort()方法排序

  2. 因为数组是引用类型,所以通过sort排序后,会直接影响到实参

  3. sort方法是重载的,也可以通过传入一个接口Comparator实现定制排序

  1. 调用 定制排序 时,传入两个参数:
  • 排序的数组
  • 实现了Comparator接口的匿名内部类,要求实现compare方法
  1. 这里体现了接口编程的方式,源码分析:

(1)

java 复制代码
Arrays.sort(arr, new Comparator() {
      @Override
      public int compare(Object o1, Object o2) {
          Integer i1 = (Integer) o1;
          Integer i2 = (Integer) o2;
          return i2 - i1;
      }
 });

(2)最终到TimSort类

(3)执行到binarySort方法的代码,会通过匿名内部类的compare方法来决定排序的顺序

会根据动态绑定机制c.compare()执行我们传入的匿名内部类的compare()

(4) public int compare(Object o1, Object o2) 返回的值>0 还是 <0,会影响整个排序结果,这就充分体现了 接口编程+动态绑定+匿名内部类的综合使用。

3.Arrays实现冒泡排序的定制排序

java 复制代码
public static void main(String[] args) {
        int[] arr = {1, -9, 5, 40, 6};
        bubble02(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Integer i1 = (Integer) o1;
                Integer i2 = (Integer) o2;
                return i2 - i1;
            }
        });
    }

    public static void bubble02(int[] arr, Comparator c) {
        int temp = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                // 数组的排序由c.compare(arr[j], arr[j + 1]) > 0 的返回值决定排序的顺序
                if (c.compare(arr[j], arr[j + 1]) > 0) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

4.Arrays.binarySearch()------二叉查找

  1. 使用binarySearch通过二分搜索法进行查找
  2. 要求该数组必须有序,如果数组无序,不能使用binarySearch
  3. 如果数组中不存在该元素,则return -(low + 1);
java 复制代码
int[] arr = {-9, 1, 5, 16, 40};
// 返回1的索引  1
System.out.println(Arrays.binarySearch(arr, 1)); 

// 当元素不在数组中,返回 - (该元素应该存在的索引 + 1)   -6
System.out.println(Arrays.binarySearch(arr, 100));

5.Arrays.copyOf()------数组元素的复制

java 复制代码
public static void main(String[] args) {
    Integer[] arr = {-9, 1, 5, 16, 40};

    // 从arr数组中,拷贝arr.length个元素到newArr数组中
    Integer[] newArr = Arrays.copyOf(arr, arr.length);
    System.out.println(Arrays.toString(newArr)); // [-9, 1, 5, 16, 40]

    // 从arr数组中,拷贝arr.length-1个元素到newArr数组中
    Integer[] newArr1 = Arrays.copyOf(arr, arr.length - 1);
    System.out.println(Arrays.toString(newArr1)); // [-9, 1, 5, 16]

    // 如果拷贝的长度超过原数组,那么多余的位置会给出[默认值]
    // int类型给0,Integer类型给null
    Integer[] newArr2 = Arrays.copyOf(arr, arr.length + 1);
    System.out.println(Arrays.toString(newArr2)); // [-9, 1, 5, 16, 40, null]

    // 如果拷贝的长度<0,会抛出NegativeArraySizeException
    // 该方法的底层使用的是 System.arraycopy()
    Integer[] newArr3 = Arrays.copyOf(arr, -2);
    System.out.println(newArr3);
}

6.Arrays.fill()------数组的填充

java 复制代码
public static void main(String[] args) {
      Integer[] arr = {-9, 1, 5, 16, 40};
      Arrays.fill(arr, 100);
      System.out.println(Arrays.toString(arr));
      // [100, 100, 100, 100, 100]
  }

7.Arrays.equals(arr1,arr2)------比较2个数组元素内容是否完全一致

java 复制代码
public static void main(String[] args) {
    Integer[] arr = {-9, 1, 5, 16, 40};
    Integer[] arr2 = {-9, 1, 5, 16, 40};
    System.out.println(Arrays.equals(arr, arr2));
}

8.Arrays.asList()------将一组值,转换成list

1.asList方法,会将 (1,5,4,43,54)数据转成一个List集合

2.返回的asList编译类型List(接口)

3.asList运行类型java.util.Arrays#ArrayList,是 Arrays 类的静态内部类

java 复制代码
private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
java 复制代码
public static void main(String[] args) {
    List<Integer> asList = Arrays.asList(1, 5, 4, 43, 54);
    System.out.println("asList=" + asList);
    // asList=[1, 5, 4, 43, 54]
	
    System.out.println("asList的运行类型:" + asList.getClass());
    // asList的运行类型:class java.util.Arrays$ArrayList
}

9.Arrays类练习题

自定义Book类,里面包含name和price,按price排序(从大到小)。要求使用两种方式排序,有一个 Book[] books=4本书对象。使用前面的传递 实现Comparator接口匿名内部类,也称为定制排序。可以按照 price:(1)从大到小 (2)从小到大 (3) 按照书名长度从大到小

java 复制代码
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 = book2.getPrice() - book1.getPrice();
                if (priceVal > 0) {
                    return -10; // 这里只要输入<0的数即可
                } else if (priceVal < 0) {
                    return 10; // 这里只要输入>0的数即可
                } else {
                    return 0;
                }
            }
        });

        System.out.println(Arrays.toString(books));
        // [Book{name='青年文摘20年', price=5.0}, Book{name='三国演义', price=90.0}, Book{name='红楼梦', price=100.0}, Book{name='java从入门到放弃~', price=300.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;
                }
            }
        });

        System.out.println(Arrays.toString(books));
        // [Book{name='java从入门到放弃~', price=300.0}, Book{name='红楼梦', price=100.0}, Book{name='三国演义', price=90.0}, Book{name='青年文摘20年', price=5.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();
                // 按照书名长度从小到大
                // return book1.getName().length() - book2.getName().length();
            }
        });
        System.out.println(Arrays.toString(books));
        // [Book{name='java从入门到放弃~', price=300.0}, Book{name='青年文摘20年', price=5.0}, Book{name='三国演义', price=90.0}, Book{name='红楼梦', price=100.0}]
    }
}

class Book {
    private String name;
    private double price;

    public Book(String name, double price) {
        this.name = name;
        this.price = 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 +
                '}';
    }
}

二、System类

1.System.exit()

java 复制代码
//exit 退出当前程序
System.out.println("ok1");

//1. exit(0) 表示程序退出
//2. 0 表示一个状态 , 正常的状态
System.exit(0);
System.out.println("ok2"); // ok2因为程序退出,不打印

2.System.arrCopy()------数组拷贝

java 复制代码
public static void main(String[] args) {
    int[] src = {1, 2, 3};
    int[] dest = new int[3];// dest 当前是 {0,0,0}
    /**
     * srcPos:从源数组的哪个索引位置开始拷贝
     * dest:目标数组,即把源数组的数据拷贝到哪个数组
     * destPos:把源数组的数据拷贝到目标数组的哪个索引
     * length:从源数组拷贝多少个数据到目标数组
     */
    System.arraycopy(src, 0, dest, 0, src.length);
    // int[] src = {1,2,3};
    System.out.println("dest=" + Arrays.toString(dest));//[1,2,3]
}

3.System.currentTimeMillis()------返回当前时间距离1970-1-1的毫秒数

java 复制代码
System.out.println(System.currentTimeMillis()); // 1727321941047
相关推荐
GISer小浪花努力上岸3 分钟前
Java N种内部类
java·开发语言·intellij-idea
凭君语未可19 分钟前
详解前驱图与PV操作
java·网络·算法
Sundayday4719 分钟前
tomcat的安装,管理与配置
java·运维·服务器·nginx·tomcat·云计算
羽X瞳30 分钟前
17、CPU缓存架构详解&高性能内存队列Disruptor实战
java·缓存·架构
咕了个咕30 分钟前
微服务-流量染色
java
一直奔跑在路上31 分钟前
【Prometheus】实战二:Prometheus数据监控自定义组件Pushgateway
java·算法·prometheus
武子康40 分钟前
大数据-145 Apache Kudu 架构解读 Master Table 分区 读写
java·大数据·clickhouse·hdfs·架构·apache
程序员张三疯1 小时前
springmvc
java·spring·java-ee·mvc
lucifer3111 小时前
深入理解 Spring Boot 中的事件驱动模型
java·后端
希忘auto1 小时前
详解常见排序
java·排序