当前位置: 首页 > article >正文

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()

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实现定制排序


4. 调用 定制排序 时,传入两个参数:

  • 排序的数组
  • 实现了Comparator接口的匿名内部类,要求实现compare方法

5. 这里体现了接口编程的方式,源码分析:
(1)

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实现冒泡排序的定制排序

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);
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()——数组元素的复制

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()——数组的填充

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个数组元素内容是否完全一致

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 类的静态内部类

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
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) 按照书名长度从大到小

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()

//exit 退出当前程序
System.out.println("ok1");

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

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

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的毫秒数

System.out.println(System.currentTimeMillis()); // 1727321941047

http://www.kler.cn/news/321406.html

相关文章:

  • 网格大师OSGB转OBJ,转换类型中的非拓扑、拓扑、重建有什么区别?
  • 【Docker】01-Docker常见指令
  • 【Linux实践】实验八:Shell程序的创建及变量
  • Scala第二天
  • 【C++笔试强训】如何成为算法糕手Day5
  • 解决TikTok无法注册或注册不了的问题
  • 手机使用技巧:如何修复变砖的 Android 手机
  • 策略模式
  • [笔记]某S厂减速箱部件参数表 - 技术问题海外联系方式
  • JavaScript typeof运算符
  • 实变函数精解【25】
  • Excel锁定单元格,使其不可再编辑
  • QT开发:详解 Qt 多线程编程核心类 QThread:基本概念与使用方法
  • 大语言模型量化方法GPTQ、GGUF、AWQ详细原理
  • 【算法】二叉树中的 DFS
  • 技术点:go使用gomail包进行邮件发送
  • Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地
  • element ui 精确控制日期控件 date-picker
  • 怎么备考2024年11月软考高级系统架构师 ?
  • 基于SSM+小程序的医院管理系统(医院1)(源码+sql脚本+视频导入教程+文档)
  • grpcurl使用
  • gitlab集成CI/CD,shell方式部署
  • EMC术语简要介绍
  • SSM的学习(3)
  • 【论文_1992】 REINFORCE » P2 附录
  • 《程序猿之设计模式实战 · 模板方法》
  • JavaWeb美食推荐管理系统
  • 【Linux扩容根分区】LVM分区扩容过程踩坑记录
  • 计算机视觉硬件整理(四):相机与镜头参数介绍
  • EasyAR自定义相机RTSP视频流(CustomCamera)