java的集合框架笔记(一)之Arrays类

一、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的数组。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值