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
相关推荐
向宇it8 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行10 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想1 小时前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。2 小时前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea
.生产的驴2 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven