Java容器各种常用API总结

先说一下Java中所有容器都有的常用API:size()容器大小,isEmpty()是否为空,clear()清空容器,iterator()返回容器的迭代器(Collection接口下容器才有,Map接口下的没有)。

List常用API

  1. 插入元素

    • add(E e):list尾部插入一个元素;
    • add(int index, E e):指定位置插入元素;
    • addAll(Collection<? extends E> c):collection中所有元素插入list尾部,也可以加上参数index,指定插入位置。
  2. 查找元素

    • get(in index):根据index获取元素;
    • indexOf(Object o):查找元素第一次出现的index。
  3. 删除元素

    remove和removeAll方法,前者可以通过指定index或元素删除,后者传入一个collection。

  4. 排序

    Collections.sort(List<T> list),可以额外传入一个Comparator参数。

  5. 其他

    • subList(int start, int end):包含start,不包含end的子列表;
    • toArray():list转array;
    • toArray(T[] a):指定array类型,比如 String[] y = x.toArray(new String[0]);

Set常用API

  1. 插入元素

    • add(E e):插入单个元素;
    • addAll(Collection<?extends E> c):插入collection中所有元素。
  2. 查找元素

    • contains(Object o):判断是否包含元素o
    • containsAll(Collection<?> c):判断是否包含collection中所有元素。
  3. 删除元素

    remove(Object o)删除单个元素,不存在返回false,或者通过removeAll删除collection中元素。

  4. 其他

    toArray方法,返回Object数组,或者通过toArray(T[] a)返回指定类型数组。

Map常用API

  1. 插入元素
    • put(K key, V value):插入单个键值对
    • putIfAbsent(K key, V value):key对应的值不为null,则put
  2. 查找元素
    • get(K key):传入key,返回value,key不存在返回null;
    • getOrDefault(K key, V defaultValue):传入key,返回value,key不存在返回defaultValue。
  3. 删除元素
    • remove(Object key):删除key
    • remove(Object key, Object value):删除值为value的key
  4. 其他
    • keySet():返回所有key组成的集合;
    • values():返回所有value组成的列表。

Stack常用API

对于栈,我们关注的API有入栈、出栈、获取栈顶元素、栈是否为空、栈大小。其中是否为空和大小,都是统一用isEmpty()和size(),我们重点看下其它3个API。

  1. Vector下的Stack类

    peek()返回栈顶元素,push()入栈,pop()删除并返回栈顶元素。

  2. LinkedList作为栈使用

    因为LinkedList实现了Queue和Dequeue接口,因此也可以作为栈使用。Dequeue双端队列接口,实现类包括ArrayDequeue、LinkedBlockingDeque、LinkedList等。

    和Stack类一样,peek()、push()和pop()分别表示取回栈顶、入栈、出栈操作。

Queue常用API

  1. 对于queue一般用offer表示入队列,poll表示出队列,peek表示获取队列第一个元素(即将出队列的)。

  2. queue中add/offer,element/peek,remove/poll对比

    • add()和offer()

      add()和offer()都是向队列中添加一个元素。一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。因此就可以在程序中进行有效的判断!

    • poll()和remove()

      remove() 和 poll() 方法都是从队列中删除第一个元素。如果队列元素为空,调用remove() 的行为与 Collection 接口的版本相似会抛出异常,但是新的 poll() 方法在用空集合调用时只是返回 null。因此新的方法更适合容易出现异常条件的情况。

    • element()和peek()

      element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

LinkedList中的部分方法总结

由于LinkedList实现了Queue和Dequeue接口,因此可以同时作为stack、queue和dequeue。LinkedList类中操作元素的方法非常之多,下面稍作对比:push:加载链表头;peek:从链表头取;pop:从链表头出;offer:从链表尾加;poll:从链表头出;remove:从链表头出。总结:拿数据都是从链表头拿,插入push从头插,offer从尾插。

排序常用API

  1. 对于List接口,一般直接使用Collections.sort(list)即可对list进行排序

    Collections.sort()也可以传入一个Comparator指定排序规则

  2. 对于Set接口,可以通过TreeSet实现排序,举个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class App {
    public static void main( String[] args ) {
    Set<String> set = new HashSet<>();
    set.add("1");
    set.add("2");
    set.add("5");
    set.add("4");
    set.add("3");
    System.out.println(set.toString());
    Set<String> sortSet = new TreeSet<String>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
    return o2.compareTo(o1);//降序排列
    }
    });
    sortSet.addAll(set);
    System.out.println(sortSet.toString());
    //也可以使用下面方式
    Set<String> sortSet = new TreeSet<String>((o1, o2) -> o2.compareTo(o1));
    Set<String> sortSet = new TreeSet<String>(Comparator.reverseOrder());
    TreeSet<PersonObj> objects = new TreeSet<>(((o1, o2) ->Integer.compare(o2.getAge(), o1.getAge())));
    }
    }
  3. 对于Arrays,可以直接通过Arrays.sort(arr)升序排序,也可以额外传入一个Comparator,比如Arrays.sort(arr, Collections.reverseOrder())

遍历方法总结

  1. 遍历List

    • for循环,利用index遍历listfor(int i = 0; i < list.size(); ++i)
    • forEach遍历,比如for(Integer item : list)
    • Iterator遍历,比如Iterator<Integer> iter = list.iterator();while(iter.hashNext){System.out.println(iter.next())}
  2. 遍历Set

    • forEach遍历,比如for(Integer item : set);
    • 迭代器遍历:和List一样。
  3. 遍历Map

    • 遍历entrySet(),比如for (Map.Entry<Integer, Integer> entry : map.entrySet())

      需要注意的是,遍历之前需要检查是否非空,否则抛出异常。

    • 遍历key集合,比如for (Integer key : map.keySet())

    • 迭代器遍历,比如Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();,当然也可以用keySet的迭代器遍历;

    • 通过forEach配合lambda表达式遍历:map.forEach((k, v) -> System.out.println("key = " + k + ", value = " + v));,其底层还是通过entrySet遍历的。

    注:推荐使用entrySet,而不是keySet遍历,因为keySet遍历实际上遍历了2次。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信