一、Arrays类的概述和方法使用
Arrays类概述
* 针对数组进行操作的工具类。
* 提供了排序,查找等功能。
B:成员方法
* public static String toString(int[] a)将数组转换成字符串
* public static void sort(int[] a)快速排序
* public static int binarySearch(int[] a,int key)二分查找
可以通过看该类的源码了解常用的查找和排序算法
数组冒泡排序代码实现
public static void main(String[] args) {
int arr[] = {78,98,54,39,86,46};
//冒泡排序
MP(arr);
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i]+" ");
}
}
public static void MP(int[] arr) {
for(int i=0;i<arr.length-1;i++)//需比较多少回
for(int j=0;j<arr.length-1-i;j++) {//每回比较多少次,-1为了防止啊[j+1]越界,-i为了提高效率
if (arr[j]>arr[j+1]) {
int p;
p=arr[j];
arr[j]=arr[j+1];
arr[j+1]=p;
}
}
}
数组选择排序
public static void XZ(int[] arr) {
for(int i=0;i<arr.length-1;i++)//比较多少回j
for(int j =i;j<arr.length-1; j++) {
if(arr[i]>arr[j+1]) {
int p;
p=arr[i];
arr[i]=arr[j+1];
arr[j+1]=p;
}
数组二分查找实现
public class djw {
public static void main(String[] args) {
int arr[] = {3,4,5,6,7,8,458};
System.out.println(EF(arr,8));
}
public static int EF(int[] arr, int value) {
int min = 0;
int max = arr.length-1;
int mid = (max+min)/2;
while(arr[mid]!=value) {
if(arr[mid]<value) {
min=mid+1;
}else if(arr[mid]>value){
max=mid-1;
}
mid=(min+max)/2;
if(min>max) {
return -1;
}
}
return mid;
}}
二、asList的方法陷阱
1、UnsupportOperationException异常
aslist的作用:asList 将数组转换为 List集合类型,
出错描述:“使用工具类Arrays.asList()把数组转换成集合list后,该 list 是一个长度不可变的列表,传入参数的数组有多长,其返回的列表就只能是多长。不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportOperationException异常”
首先我们看看出错案例:
我们可以看到list的大小不是6,而且输出list的竟然是他的hascode。
package com.jiuzhou.jiagou;
import java.util.Arrays;
import java.util.List;
public class errAsList {
public static void main(String[] args) {
int[] app = {11,22,33,44,55,66};
List list = Arrays.asList(app);
list.clear();
}
}
-----------------------------------------
输出结果为:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
at java.util.AbstractList.removeRange(Unknown Source)
at java.util.AbstractList.clear(Unknown Source)
at com.jiuzhou.jiagou.errAsList.main(errAsList.java:12)
运行结果:抛出 UnsupportedOperationException 异常,该异常表示 list 不支持 add 方法。
我们从源码的角度来看看出错的原因
首先看看 asList 的源码:
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}@Override
public int size() {
return a.length;
}@Override
public Object[] toArray() {
return a.clone();
}............................
可以看到在调用asList方法时,创建一个ArrayList对象,而ArrayList在继承AbstractList<E>的基础上,重写了size()等方法,唯独却没有重写add、remove、clear等方法,add等方法直接继承AbstractList<E>类的,然而AbstractList<E>类规定调用这些方法时,直接抛出UnsupportOperationException异常。
public E remove(int index) {
throw new UnsupportedOperationException();
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
2、使用基本数据类型数组转换为列表,会把数组当作一个可变参数处理。
出错描述:如下面代码,我们期待的结果如下:
6
输出数组内容
public class errAsList {
public static void main(String[] args) {
int[] app = {11,22,33,44,55,66};
List list = Arrays.asList(app);
System.out.println(list.size());
System.out.println(list);
}
}
-----------------------------------
//输出为:
//1
//[[I@70dea4e]
然而事实并非如此:
注意这里输出的数量是1,原因是,在Arrays.asList中,该方法接受一个变长参数,一般可看做数组参数,但是因为int[] 本身就是一个类型,所以data变量作为参数传递时,编译器认为只传了一个变量,这个变量的类型是int数组,所以size为1。基本类型是不能作为泛型的参数,按道理应该使用包装类型,但这里缺没有报错,因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组。