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()——二叉查找
- 使用binarySearch通过二分搜索法进行查找
- 要求该数组必须有序,如果数组无序,不能使用binarySearch
- 如果数组中不存在该元素,则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