zoukankan      html  css  js  c++  java
  • Java基础:Collection—List&Set

    List和Set:

    List可以将元素维护在特定的序列中。它的特点是有序,允许重复元素出现。最常见的List的实现类是:ArrayList。

    Set的特点是:无序,不保存重复元素。当尝试将重复的元素添加到Set中,它就会阻止这种重复现象。Set最常见的实现是HashSet。

     ArrayList更适合顺序的访问元素,它更像一个可变长度的数组。但是想要在List中间插入或删除元素时相对会比较慢。HashSet可以很快的查询到某个元素是否在Set中,因此可以很快的实现快速查询。

     

    遍历打印ArrayList的方法:

    public void firstWayPrintList() {
            for(int i=0; i<list.size();i++){
                System.out.print(list.get(i) + " ");
            }
            System.out.print('
    ');
        }
    
     public void secondWayPrintList() {
            for(Integer i: list){
                System.out.print(i + " ");
            }
            System.out.print('
    ');
        }
    
     public void thirdWayPrintList(){
            for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext();){
                System.out.print(iterator.next() + " ");
            }
            System.out.print('
    ');
        }

    遍历打印HashSet的方法:

    public void firstWayPrintSet(){
            for(Integer i: set){
                System.out.print(i + " ");
            }
             System.out.print('
    ');
    
    
        }
    
    public void secondWayPrintSet(){
            for(Iterator<Integer> iterator = set.iterator(); iterator.hasNext();){
                System.out.print(iterator.next() +  " ");
            }
            System.out.print('
    ');
        }

    可见遍历获得ArrayList中各个元素的方法有三种:for循环,foreach,iterator;而遍历获得HashSet元素的方法只有两种:foreach,iterator。原因就在于HashSet的无序存储的特点。HashSet采用了hash,也就是散列的方法来存储元素,每个特定的元素对应一个HashCode,这就是为什么它不能存储相同的元素。同时由于采用hash,元素的存储并没有遵循某一特定的顺序,所以不能够在for循环中通过get(i)方法来得到其中的第i个元素。

    如何使Set能够有序存储?

    那如果我想要一个Set它能够保持元素添加时的顺序应该如何呢?答案是使用LinkedHashSet。LinkedHashSet内部使用了链表来维护元素的顺序,同时它也具有HashSet的快速查询的特点。

    如何消除List中的重复元素?

    我已经有了一个List,但是我想消除里面的重复元素,快速的做法是:利用Set。

    public void deleteDuplicate(){
            Set<Integer> set = new HashSet<Integer>(list);
            list.clear();
            list.addAll(set);
            for(Integer i: list){
                System.out.print(i + " ");
            }
        }

    另外两个需要注意的地方:

    1.在创建一个List或是Set时,良好的代码风格是:声明一个具体类的对象(ArrayList/HashSet),将其转型为对应的接口(List/Set),然后在其余的代码中都使用这个接口。我的代码中就是这样做的,这样做的好处是:如果以后我需要改变我的实现,只需要在创建的地方进行修改。

    2.使用泛型:在声明的时候在尖括号中定义类型参数(HashSet<String>),这个类型参数指定了可以被放到这个容器中的对象的类型。通过使用泛型,就可以在编译阶段防止将错误的类型的对象放到容器当中。

  • 相关阅读:
    java解析php函数json_encode unicode 编码问题
    python根据域名循环遍历查找绑定IP
    android开发 sqlite设置本地时间
    android判断指定软件是否安装
    android中安装,启动和卸载应用
    .net程序员面试题
    error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
    jQuery EasyUI学习笔记
    [转载]NetBox使用教程!
    Sql一次清空所有数据(基于 Mgo Bcp)
  • 原文地址:https://www.cnblogs.com/harolei/p/3236515.html
Copyright © 2011-2022 走看看