zoukankan      html  css  js  c++  java
  • java集合你了解多少?

    用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获。

    一、所有集合都实现了Iterable接口。

        Iterable接口中包含一个抽象方法:Iterator<T> iterator();每个实现了这个方法的集合都会返回一个Iterator对象。

        Iterator:它包含三个方法,hashNext(),next(),remove()三种方法,通过它们可以实现集合的遍历和元素删除,例如:

        Collection<String> list = new ArrayList<String>();

       list.add("a");   

       list.add("b");  

        list.add("c");

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {  

             String element = iterator.next();

              System.out.println(element);//a b c

        }  

        System.out.println(list);//[a, b, c]      iterator = list.iterator();    iterator.next();

        iterator.remove();

        System.out.println(list);//[b, c]

        ps:为什么不直接实现Iterator接口呢?因为:Iterator会携带当前集合的位置信息,下次使用再使用的时候就非从0开始了;而Iterable接口每次都返回一个Iterator对象(通过内部类实现Iterator),各个迭代器之间互不影响。

    二、ListIterator

        从AbstractList起封装了public ListIterator<E> listIterator()方法,返回一个ListIterator,它在Iterator的基础上增加了add(),previous(),hasPrevious()等方法,可以实现双向遍历。

    AbstractList<String> list = new ArrayList<String>();

    list.add("a");

    list.add("b");

    list.add("c");

    ListIterator<String> iterator = list.listIterator(3);

    while (iterator.hasPrevious()) {

    String element = iterator.previous();

    System.out.println(element);//c,b,a

    }

    三、比较

        ArrayList:允许存放重复元素,且元素是有序的,随机访问比较方便。

        LinkedList:链表实现,插入和删除时更优于ArrayList。

        HashSet:不允许重复元素且无序(散列函数对元素进行排序,可快速查询),允许null值。

        TreeSet:红黑树排序,可进行排序,包含的元素要实现Comparable接口并定义compareTo方法,不允许null值。

        HashMap:线程不安全,key和值都允许null,判断是否包含key要使用containsKey()方法,不允许重复key,hash数组的默认大小是16,而且一定是2的指数,重新计算hash值。

        HashTable:线程安全,key和value都不允许出现null值,不允许重复key,数组默认大小是11,增加的方式是 old*2+1,使用包含对象的hash值。

    四、Collections和Arrays

        Collections:java.util下的一个专用类,它包含有各种有关集合操作的静态方法,可实现对各种集合的搜索、排序、线程安全化等操作。

        Arrays:java.util下的一个专用类,用来操作array ,提供搜索、排序、复制,转换等静态方法。

    关注老姜谈技术,微信号:helojava,或者扫描下面二维码。


    每日一帖,技术鸡汤。

  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/jiangkuan/p/6019040.html
Copyright © 2011-2022 走看看