zoukankan      html  css  js  c++  java
  • Java Collection框架—List set map 的异同世界

    Java集合是多个对象的容方法。集合(容方法)。简单点,事实上就是一个对象,能将具有同样性质的多个元素汇聚成一个总体。

    Collections Framwork是用来表现和操纵集合的一个统一的体系结构。

     

    经常使用的集合有HashMapHashSetArrayList……,由于对于每个集合的内涵都非常模糊,所以才会导致自己不知道详细的使用环境。我们通过对照来区分异同:


    Set(集)

    Set能够说是一种最简单的集合,基本的两个实现类,HashSet。TreeSet,两者最大的差别就是TreeSet是有序的。而HashSet是无序的(具体请见后文分解)

    以HashSet举例说明:

    import java.util.HashSet;
    import java.util.Set;
    import java.util.*;
    
    public class hashset {
    
        /**
         * 使用Set演示样例代码
         */
        public void hashSetExample() {
    
            Set vehicles = new HashSet();
    
            //Declare some string items
            String item_1 = "apple";
            String item_2 = "orange";
            String item_3 = "banana";
    
            boolean result;
    
            //把每一个文件都使用set方法增加
            result = vehicles.add(item_1);
            System.out.println(item_1 + ": " + result);
    
            result = vehicles.add(item_2);
            System.out.println(item_2 + ": " + result);
    
            result = vehicles.add(item_3);
            System.out.println(item_3 + ": " + result);
    
            //再次尝试使用item_1
            result = vehicles.add(item_1);
            System.out.println(item_1 + ": " + result);
        }
    
        @SuppressWarnings("unchecked")  public static void main(String[] args) {
    		new hashset().hashSetExample();
        }
    	   
    
           
    }
    最后输出的结果为:apple:true;orange:true;banana:true;apple:false,出现的原因就是由于咱们Set是不同意有反复元素出现的。

    List(列表)

    List相比而言,是常见的,List特征就是其元素是以线性方式存储,集合中能够存放反复的对象,当涉及到“栈”,“队列”,“链表”等时,都是使用List,事实上也就是我们数据库结构使用的那些知识。

    至于详细使用什么,也得视情况而定,比方:

    ArrayList():适用于能够改变长度的数组,能够对元素进行随机的訪问,仅仅只是插入,删除元素的速度较慢;

    LinkedList():主要用于链表数据结构,插入和删除速度是非常快的,仅仅是訪问时的速度慢。

    Vector():底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(不管查询还是增删都非常慢。所以一般不经常使用,直接用ArrayList取代来使用了。

    Map(映射)

    Map<key,value>是一个双列集合。是一种把键对象和值对象映射的集合,有一个Key值和一个Value值,Key值代表唯一,所以不能反复;Value值是真正能够存储的变量,所以是能够反复的。Map没有继承于Collection接口。在Map集合中检索元素时。仅仅要给出键对象。就能够返回相应的值。

    对于Map而言,运行效率是一个大问题,经常使用的两个实现为:

    HaspMap():Map基于散列表的实现,插入和查询“键值对”的开销是固定的。HashMap就是使用对象的HashCode来进行查询的。此方法可以显著提高性能

    TreeMap():仅仅要是Tree。他就一定是经过排序的,TreeMap是唯一带有SubMap()方法的,所以它能够返回一个子树。

    Map-HashCode举例:

    import java.util.*;     
       
    public class hashcode {    
         public static void main(String[] args){    
              HashMap h2=new HashMap();    
              for(int i=0;i<10;i++)    
                   h2.put(new Element(i), new result());    
              System.out.println("h2:");    
              System.out.println("Get the result for Element:");    
              Element test=new Element(5);    
              if(h2.containsKey(test))    
                   System.out.println((result)h2.get(test));    
              else   
                   System.out.println("Not found");    
         }    
    }    
    /* 这样执行结果为null,也就是得不到值 */
    /* class Element{    
         int number;    
         public Element(int n){    
              number=n;    
         }     
    }     */
    /* 更改方法例如以下: */
    class Element{    
         int number;    
         public Element(int n){    
              number=n;    
         }     
         public int hashCode(){    
              return number;    
         }    
         public boolean equals(Object o){    
              return (o instanceof Element) && (number==((Element)o).number);    
         }    
    }   
    
    class result{    
         Random r=new Random();    
         boolean possible=r.nextDouble()>0.5;    
         public String toString(){    
              if(possible)    
                   return "OK!";    
              else   
                   return "Impossible!";    
         }    
    }   
    对于Element而言,前后两者的对照就是一个有返回值。一个没有返回值;HashCode方法是继承于Object的。由于Element在这里覆盖了hashCode()和equals()方法,这样是前后两个Key保持了一致,所以终于有了值返回。

    对于HashCode而言。事实上不必对每一个不同的对象都产生一个唯一的HashCode,仅仅要可以得到返回值就达到目的了。再者,对于HashCode,最好可以分散开,使用“分散原则”,有利于提高性能。

    最后总结:

     对于Collection须要了解的还有非常多非常多,这也仅仅是冰山一角,通过对照学习,可以在使用的过程中得到最优解,这样才干使我们的系统性能优化。价格合理。

  • 相关阅读:
    golang 带参数 发送、上传本地文件到其他机器、服务器
    【比赛游记】北大集训2020垫底记
    【比赛游记】NOIP2020又当工具人记
    AtCoder Regular Contest 107
    AtCoder Regular Contest 108
    【比赛游记】CSP2020游记
    注意事项
    2020北大集训摸鱼记
    NOIP2020游记
    ARC109F
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6991414.html
Copyright © 2011-2022 走看看