Arrays.asList的那点事

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class ArraysAsListDemo {
    public static void main(String[] args) {
        List<String> source1 = new ArrayList<String>(Arrays.asList("1", "2", "3"));
        ArrayList<String> source2 = new ArrayList<String>(Arrays.asList("5", "62", "3"));
        source2.removeAll(source1);
        System.out.println(source2);
//        Arrays.asList("1", "2", "3").remove("1");//会报错。因为Arrays$ArrayList中没有实现List接口中的remove方法

        System.out.println(source1.containsAll(source2));
        HashSet<String> total = new HashSet<String>();
        total.addAll(source1);
        total.addAll(source2);
        System.out.println(total.size() > (source1.size() + source2.size()));
        System.out.println(total.size() < (source1.size() + source2.size()));
    }

}

 

    // Misc

    /**
     * Returns a fixed-size list backed by the specified array.  (Changes to
     * the returned list "write through" to the array.)  This method acts
     * as bridge between array-based and collection-based APIs, in
     * combination with {@link Collection#toArray}.  The returned list is
     * serializable and implements {@link RandomAccess}.
     *
     * <p>This method also provides a convenient way to create a fixed-size
     * list initialized to contain several elements:
     * <pre>
     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
     * </pre>
     *
     * @param a the array by which the list will be backed
     * @return a list view of the specified array
     */
    public static <T> List<T> asList(T... a) {
    return new ArrayList<T>(a);
    }

    /**
     * @serial include
     */
    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) {
            if (array==null)
                throw new NullPointerException();
        a = array;
    }

 说明:

在jdk文档中对RandomAccess接口的定义如下:
public interface RandomAccess
List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。
此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

将操作随机访问列表的最佳算法(如 ArrayList )应用到连续访问列表(如 LinkedList )时,可产生二次项的行为。
如果将某个算法应用到连续访问列表,那么在应用可能提供较差性能的算法前,鼓励使用一般的列表算法检查给定列表是否为此接口的一个 instanceof ,
如果需要保证可接受的性能,还可以更改其行为。现在已经认识到,随机和连续访问之间的区别通常是模糊的。
例如,如果列表很大时,某些 List 实现提供渐进的线性访问时间,但实际上是固定的访问时间。这样的 List 实现通常应该实现此接口。

强调:
JDK中推荐的是对List集合尽量要实现RandomAccess接口
如果集合类是RandomAccess的实现,则尽量用for(int i = 0; i < size; i++) 来遍历而不要用Iterator迭代器来遍历,在效率上要差一些。
反过来,如果List是Sequence List,则最好用迭代器来进行迭代。

package java.util;
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    private static final long serialVersionUID = 8683452581122892189L;

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer.
     */
    private transient Object[] elementData;

    /**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;
public interface List<E> extends Collection<E> {
    // Query Operations

    /**
     * Returns the number of elements in this list.  If this list contains
     * more than <tt>Integer.MAX_VALUE</tt> elements, returns
     * <tt>Integer.MAX_VALUE</tt>.
     *
     * @return the number of elements in this list
     */
    int size();

    /**
     * Returns <tt>true</tt> if this list contains no elements.
     *
     * @return <tt>true</tt> if this list contains no elements
     */
    boolean isEmpty();
* @author  Josh Bloch
 * @author  Neal Gafter
 * @version 1.55, 04/21/06
 * @see        Set
 * @see        List
 * @see        Map
 * @see        SortedSet
 * @see        SortedMap
 * @see        HashSet
 * @see        TreeSet
 * @see        ArrayList
 * @see        LinkedList
 * @see        Vector
 * @see     Collections
 * @see        Arrays
 * @see        AbstractCollection
 * @since 1.2
 */

public interface Collection<E> extends Iterable<E> {
    // Query Operations

    /**
     * Returns the number of elements in this collection.  If this collection
     * contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
     * <tt>Integer.MAX_VALUE</tt>.
     *
     * @return the number of elements in this collection
     */
    int size();

    /**
     * Returns <tt>true</tt> if this collection contains no elements.
     *
     * @return <tt>true</tt> if this collection contains no elements
     */
    boolean isEmpty();

 

时间: 2024-10-22 01:49:57

Arrays.asList的那点事的相关文章

Arrays.asList解析

List的一个典型的特性就是其长度是可变的,我们可以很方便地对它进行插入和删除元素的操作,这是它与数组所存在的一个很大的区别,后者的长度是固定的,而且我们不能从数组中删除元素,只能修改元素的值. 利用Arrays.asList(array)返回一个List,然而这个返回的是只读的List不支持add和remove的操作. JDK文档是这么说的: public static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表.(对返回列表的更

jdk-利用Arrays.asList定义固定大小数组时失败

问题描述 利用Arrays.asList定义固定大小数组时失败 刚开始接触Ajax,实现用户名是否可用要运用到下列函数....Arrays中的asList总会有下划线提示错误,尝试很多方法都解决不了.刚开始学,也不是很懂这些代码是什么意思..用的是jdk1.6.0 import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.Http

Difference between ArrayList and Arrays.asList() in Java

Arrays.asList does not return an ArrayList instance which has an add method implemented correctly.  It returns a List that is a "view" onto the array - a wrapper that makes the array look like a list Changes to the returned list write through to

Arrays.asList()转化的List,调用List.add()报错

问题描述 List<Integer> set = Arrays.asList(1,1,11,111);set.add(55);//(1)set.remove(2);//(2)结果:java.lang.UnsupportedOperationException(1)(2)是发生错误的地方疑问:怎么会发生错误呢,List不是会自动变化长度吗 解决方案 Arrays.asList()返回的List是Arrays工具类的内部类,是只读的,不能新增和删除.查看jdk可以看到asList()里是把数据放到

Arrays.asList问题

问题描述 String[]words=(String[])vData.toArray(newString[2]);request.setAttribute("list",Arrays.asList(words));与String[]words={"absolute","anyone","anything","apple","abandon","breach",&quo

java 源码分析Arrays.asList方法详解_java

最近,抽空把java Arrays 工具类的asList 方法做了源码分析,在网上整理了相关资料,记录下来,希望也能帮助读者! Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: /** * Returns a fixed-size list backed by the specified array. (Changes to * the returned list "write through" to the arr

浅谈Arrays.asList() 和ArrayList类型区别_java

<pre name="code" class="html"><pre name="code" class="html">Arrays.asList() 将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!用这个对象对列表进行添加删除更新操作,就会报UnsupportedO

Java利用Arrays的asList方法输出数组数据

 package me.test; import java.lang.reflect.*;  import java.util.Arrays; public class CompareArray {     public static  void main(String[]args)   {    int[]    a=new int[3] ;    int[]    b=new int [5] ;    int[][]  c=new int[3][3] ;    String[] str=ne

关于Java Collections API您不知道的5件事,第1部分

定制和扩展 Java Collections 对于很多 Java 开发人员来说,Java Collections API 是标准 Java 数组及其所有缺点的一个非常需要的替代品.将 Collections 主 要与 ArrayList 联系到一起本身没有错,但是对于那些有探索精神的人来说,这只是 Collections 的冰山一角. 虽然 Map(以及它的常用实现 HashMap)非常适合名-值对或键-值对,但是没有理由让自己局限于这些熟悉的工具.可以使用适当的 API,甚至适当的 Colle