• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

常用工具包之JDK.Collections

开发技术 开发技术 4小时前 6次浏览

首先,对于归属于一类的方法只会介绍其中一个。

asLifoQueue(Deque deque)

通过 双端队列 获取一个 LIFO(后进先出) 的队列 ,这不就是堆栈了?

这里介绍下Deque,Deque是双端队列,继承自Queue。常见的LinedList实现了Deque。

Deque本身是个接口,如果实现普通队列可以如下:

Queue queue = new LinkedList();

如果实现双端队列(两端都可进出,先进先出行为)

Deque deque = new LinkedList()

如果实现堆栈(后进先出行为)

Deque deque = new LinkedList()

你会发现是一样的。因为具体表现是队列还是堆栈取决于你的使用方式。

注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。Deque堆栈操作方法:push()、pop()、peek()。

其次,ArrayDeque也实现了Deque,同时也能作为堆栈或是队列。

如果面试官问:怎么实现个堆栈,你晓得怎么回答了吧!

总结:这个方法挺迷惑的,不知道使用场景是哪。。

binarySearch

binarySearch是在集合中二分查找某一元素,不过返回的索引逻辑十分复杂,并且由于是二分查找查找前需要保证集合是有序的,感觉意义不大。

总结的规则如下:

  1. 如果key在数组中,则返回搜索值的索引;否则返回-1或者”-“(插入点)。插入点是索引键将要插入数组的那一点,即第一个大于该键的元素索引

    同时:

    • 不存在时由1开始计数;
    • 存在时由0开始计数。

总结:能不用就别用。。

checkedCollection(Collection c , Class type)

  • 返回指定集合的动态类型安全视图。 任何插入错误类型元素的尝试都将导致立即出现ClassCastException 。 假设在生成动态类型安全视图之前,集合不包含错误类型的元素,并且对集合的所有后续访问都通过该视图进行,则可以保证该集合不能包含错误类型的元素。

    简单来说就是对集合内的元素进行检查,并且之后如果添加错误类型元素都会抛出异常。

  • 动态类型安全视图的另一个用途是调试。 假设程序失败并出现ClassCastException ,表明将错误类型的元素放入参数化集合中。 不幸的是,在插入错误元素后的任何时间都可能发生异常,因此它通常很少或根本不提供有关问题真正来源的信息。 如果问题是可重现的,则可以通过临时修改程序以使用动态类型安全视图包装集合来快速确定其来源。 例如,这个声明:

    Collection c = new HashSet<>();

​ 可以暂时替换为这个:

 Collection<String> c = Collections.checkedCollection(new HashSet<>(), String.class);

​ 再次运行程序将导致它在错误类型的元素插入集合时失败,从而清楚地识别问题的根源。 一旦问题得到解决,修改后的声明可能会恢复到原来的状态。

总结:同理还有类似作用的checkedMap等等。

disjoint(Collection c1, Collection c2)

  • 如果两个集合没有共同的元素,则返回true,否则返回false;原理是遍历使用contain方法进行验证是否包含。

总结:有一定的使用场景,可以看看源码学习下人家是怎么对两个集合进行遍历验证是否包含共同元素。

enumration(final Collection c)

返回指定集合的枚举,枚举包括了一个迭代器。调用enumeration.nextElement()可以认为是 c.iterator.next()。

Enumeration<Integer> enumeration = Collections.enumeration(list);
for (int i = 0; i < list.size(); i++) {
  System.out.println(enumeration.nextElement());
}

list(Enumration enumration)

通过Enumration获取装载其中元素的List。

copy(List dest, List src)

将 src 集合的内容复制到 dest 集合,src的size 必须小于 dest的size,也就是说src集合中的数据要比dest中的数据要少。这个方法更像是对某一集合中的数据进行替换。

        List<Integer> list = new ArrayList<>();
        List<Integer> newList = new ArrayList<>();
        newList.add(1);
        newList.add(2);
        newList.add(3);
        newList.add(4);
        newList.add(5);
        list.add(1);
        list.add(2);
        list.add(4);
        list.add(6);
        Collections.copy(newList,list);
        System.out.println(newList);

输出:

[1, 2, 4, 6, 5]

fill(List list, T obj)

将集合中的所有元素用特定的元素替代。

frequency(Collection c, Object o)

查看集合中和元素o equeal相等的元素个数。

indexOfSubList(List source, List target)

重头开始搜索,target集合在source集合中第一次出现的索引位置。

unmodifiableCollection(Collection c)

包装一个集合为不可变集合(只读集合),当对不可变集合进行新增/修改,会马上抛出异常。

nCopies(int n, T o)

方法用于返回一个不可变列表组成的n个拷贝的指定对象。

package com.yiibai;

import java.util.*;

public class CollectionsDemo {
   public static void main(String[] args) {
      // create a list with n copies 
      List list = Collections.nCopies(5, "tuitorial Point");
      
      // create an iterator
      Iterator itr = list.iterator();
      
      System.out.println("Values are :");
      while (itr.hasNext()){
         System.out.println(itr.next());
      }
   }      
}

输出:

tuitorial Point
tuitorial Point
tuitorial Point
tuitorial Point
tuitorial Point

SynchronizedList

返回一个线程安全的List集合。同理还有SynchronizedSet、SynctronizedCollection。


程序员灯塔
转载请注明原文链接:常用工具包之JDK.Collections
喜欢 (0)