• Collections、Arrays 简明


    转载请注明出处,谢谢!

    Collections :

    它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。


    一般方法

    Collections. sort (list); list 集合进行元素的自然顺序排序。

    Collections. sort(list, new AComparator ()); 按指定的比较器方法排序。

    class AComparatorByLen implements Comparator<String>{
    public int compare(String s1,String s2){
    int temp = s1.length()-s2.length();
    return temp == 0 ? s1.compareTo(s2) : temp;
    }
    }
    

    Collections. max (list); 返回 list 中自然顺序最大的元素。

    Collections. max (list, new AComparator()); 根据指定比较器产生的顺序,返回list 中最大的元素。

    Collections. min(list); //返回 list 中自然顺序最小的元素。

    Collections. max (list, new AComparator()); 根据指定比较器产生的顺序,返回list 中最小的元素。

    Collections. binarySearch (list,"zz"); 二分查找,返回角标。

    Collections. reverseOrder (); 逆向反转排序。

    Collections. shuffle (list); 使用默认随机源对指定列表进行置换。

    Collections.nCopies(int n, T o) 返回由指定对象的 n 个副本组成的不可变列表

    //字符串只存储了一次,付出的储存代价很小。
    List<String> settings = Collections.nCopies(100, "DEFAULT");
    

    Collections.singleton(T o) 返回一个只包含指定对象的不可变的单元素集 set。不需要付出建立数据结构的开销,相似还有,singletonList(T o)singletonMap(K key, V value)

    返回不可修改视图

    static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
    返回指定 collection 的不可修改视图。
    static <T> List<T> unmodifiableList(List<? extends T> list)
    返回指定列表的不可修改视图。
    static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
    返回指定映射的不可修改视图。
    static <T> Set<T> unmodifiableSet(Set<? extends T> s)
    返回指定 set 的不可修改视图。
    static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m)
    返回指定有序映射的不可修改视图。
    static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
    返回指定有序 set 的不可修改视图。

    List <String> staff = new LinkedList<>();
    ...
    lookAt(Collections.unmodifiableList(staff));     
    
    • Collections.unmodifiableList方法将返回一个实现了List接口的对象。其访问器方法从staff集合中读取值。lookAt方法也可以调用List接口中的所有方法,但所有的更改器方法功能已经被重新定义成了只抛出UnsupportedOperationException异常。
    • 由于视图只是包装了接口,所以只能访问接口中定义的方法。例如addFirstaddLast它们不是List接口中的方法,而是LinkedList类中的方法。

    同步视图

    类库的设计者使用视图机制来确保常规集合的线程安全,而不是使用实现了线程安全的集合类。

    原理:定义一个类,将集合所有的方法加同一把锁后返回。

    static <T> Collection<T> synchronizedCollection(Collection<T> c)
    返回指定 collection 支持的同步(线程安全的)collection。
    static <T> List<T> synchronizedList(List<T> list)
    返回指定列表支持的同步(线程安全的)列表。
    static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
    返回由指定映射支持的同步(线程安全的)映射。
    static <T> Set<T> synchronizedSet(Set<T> s)
    返回指定 set 支持的同步(线程安全的)set。
    static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
    返回指定有序映射支持的同步(线程安全的)有序映射。
    static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
    返回指定有序 set 支持的同步(线程安全的)有序 set。

    检查视图

    ArrayList<String> strings = new ArrayList<>();
    ArrayList rawList = strings;
    rawList.add(new Employee("tommy"));	//now strings contains a Employee object.
    System.out.println(rawList.get(0));
    
    outPut:
    Employee [name=tommy, getName()=tommy, getClass()=class collections.Employee, hashCode()=118352462, toString()=collections.Employee@70dea4e]
    

    检查视图可以探测到这类问题:

    List<String> safeStrings = Collections.checkedList(strings, String.class);
    ArrayList rawList2 =  safeStrings;
    System.out.println(rawList2);
    
    outPut:
    java.lang.ClassCastException: Attempt to insert class java.util.Date element into collection with element type class java.lang.String
    

    视图局限性:

    • 通常可能只能读、无法改变大小、只支持删除不支持插入。

    Collection 和Collections 的区别 :

    • Collections 是个 java.util 下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。
    • Collection 是个 java.util 下的接口,它是各种集合结构的父接口,继承于它的接口主要有 Set 和 List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。

    Arrays :

    用于操作数组对象的工具类,方法皆为静态方法。


    • asList(T... a) 方法
      返回普通Java数组的List包装器,返回的对象不是ArrayList,而是一个带有访问底层数组的get 和set方法的视图对象。改变底层数组的所有方法,如与迭代器相关的addremove方法,会直接抛出不支持操作异常UnsupportedOperationException
    String[] values = {"aaa","bbb","ccc","ddd"}; //a array
    List<String> list = Arrays.asList(values);	//a list
    HashSet<String> staff = new HashSet<>(Arrays.asList(values)); //a set
    
    • 将数组转换成集合有什么好处呢?
      asList(T... a) 方法,将数组转换成集合后可以用集合中的方法来操作数组中的元素:isEmpty()contains(Object o)indexOf(Object o)set(int index, E element)
    • 如果数组中存储的是引用数据类型,这些引用对象直接作为列表的元素。
    • 如果数组中存储的是基本数据类型, asList(T... a) 会将这个数组对象作为参数传入方法中,这样,列表中就仅有一个元素。
    int[] ints = {1,2,3,4,5};
    List list = Arrays.asList(ints);
    System.out.println("the size of list is:" + list.size());
    
    outPut:
    the size of list is:1
    
    • asList(T... a) 接受的参数是一个泛型的变长参数,我们知道基本数据类型是无法发型化的,也就是说 8 个基本类型是无法作为 asList(T... a) 的参数的, 要想作为泛型参数就必须使用其所对应的包装类型。这里, int 类型的数组当做其参数,而在 Java 中数组是一个对象,它是可以泛型化的,所以列表的长度为1.
    //将 int 改变为 Integer
    Integer[] ints = {1,2,3,4,5};
    List list = Arrays.asList(ints);
    System.out.println("list'size:" + list.size());
    
    outPut:
    the size of list is:5
    
    • 集合转数组: 用的是 Collection 接口中的 toArray()方法;
    String[] val = staff.toArray(new String[0]); //a array  
    
    • 如果给 toArray 传递的指定类型的数据长度小于了集合的 size,那么 toArray 方法,会自定再创建一个该类型的数据,长度为集合的 size。
    • 如果传递的指定的类型的数组的长度大于了集合的 size,那么 toArray 方法,就不会创建新数组,直接使用该数组,并将集合中的元素存储到数组中,其他为存储元素的位置默认值 null。所以,在传递指定类型数组时,最好的方式就是指定的长度和 size 相等的数组。
    • 将集合转成数组的好处是限制了集合中的元素的增删操作。





    (-̇᷇̂ᴥ ̇᷇̂-)(-̇᷇̂ᴥ ̇᷇̂-)(-̇᷇̂ᴥ ̇᷇̂-)不要克制,喜欢就顶(୨୧•͈ᴗ•͈)◞ᵗʱᵃᵑᵏઽ

    ——@guoyangde http://www.cnblogs.com/LittleTreasureBox/p/8904016.html

  • 相关阅读:
    好用的 convert freestyle jenkins jobs to pipeline 插件使用
    MkDocs 搭建试用
    当前云安全问题&&一些想法
    asciidoctor 安装试用
    gradle asciidoc 使用
    apache phoenix 安装试用
    parceljs 基本使用———又一个前端构建工具
    tidb 集群扩容
    tidb 安装试用&&以及安装几个问题解决
    caddy quic 协议试用&& 几个问题
  • 原文地址:https://www.cnblogs.com/LittleTreasureBox/p/8834900.html
Copyright © 2020-2023  润新知