• 常见集合及实现类的区别


    JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。

    Set集合:  

    加入Set的元素必须定义equals()方法以确保对象的唯一性;

    HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快;为快速查找设计的Set,存入HashSet的对象必须定义hashCode()。 

    TreeSetTreeSet类实现了SortedSet接口,能够对集合中的对象进行排序,底层为树结构。

    LinkedHashSet具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

    List集合:     

    其元素以线性方式存储,集合中可以存放重复对象;

    ArrayList:由长度可变的数组实现。可以对元素进行随机的访问,向ArrayList()中间插入与删除元素的速度慢。一个List可以生成ListIterator,使用它可以从两个方向遍历List;

    LinkedList:在实现中采用链表数据结构。对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:   addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

    最基本的两种检索集合中的所有对象的方法: 

     1: for循环和get()方法:

    for(int i=0; i<list.size();i++){  
     
      System.out.println(list.get(i));  
     
    }  

    2: 使用 迭代器(Iterator):

    Iterator it=list.iterator();  
     
    while(it.hashNext()){  
     
      System.out.println(it.next());  
     
    }  

    Map集合: 

    一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 ,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 

     HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。  

    LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时更快,因为它使用链表维护内部次序。

    TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 

    WeakHashMao :弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。 

    IdentifyHashMap: : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。

    Map 的常用方法:

    1 添加,删除操作:

    Object put(Object key, Object value): 向集合中加入元素   
    Object remove(Object key): 删除与KEY相关的元素   
    void putAll(Map t):  将来自特定映像的所有元素添加给该映像   
    void clear():从映像中删除所有映射

    2 查询操作: 

    Object get(Object key):获得与关键字key相关的值 。Map集合中的键对象不允许重复,也就说,任意两个键对象通过equals()方法比较的结果都是false.,但是可以将任意多个键映射到同一个值对象上。

    可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。

    注意:
    1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
    2、Set和Collection拥有一模一样的接口。
    3、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

    List和Set的区别:

    (1)Set是无序不重复的,List相反;

    Set集合和hashCode以及equals方法的联系:

    重写hashCode() 用于获得元素的存储位置;重写equals() 用于在两个元素的位置相同的时候 比较两个元素是否相等。最终来去掉HashSet中的重复元素。

    List 和 Map 区别:

    List:是存储单列数据的集合,存储的数据是有序并且是可以重复的 
    Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复

    ArrayList与LinkedList的区别:

    (1)ArrayList是一种可增长的数组实现,优点是它的随机存取速度快,缺点是新项的插入和现有项的删除花销大,除非变动是在ArrayList的末端。

    (2)LinkedList是双向链表实现,新项的插入和现有项的删除均开销很小,随机访问速度不比ArrayList();

    ArrayList 与 Vector 区别:

    Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。

    HashMap 和 Hashtable 的区别:

    (1)HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行。

    (2)线程安全方面Hashtable要比HashMap更安全,因为HashTable中的方法都是synchronized的,同时速度上要比HashMap要慢;HashMap可以通过ConcurrentHashMap(java5以上版本)来使线程安全(ConcurrentHashMap就是一个分段的hashtable ,根据自定的hashcode算法生成的对象来获取对应hashcode的分段块进行加锁,不用整体加锁,提高了效率);

    (3)另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

    HashSet 和 HashMap 区别:

    (1)HashMap实现了Map接口,而HashSet实现了Set接口;

    (2)HashMap存储的是键值对,而HashSet是存储对象;

    (3)HashMap使用put()向Map添加元素,HashSet通过add()添加元素;

    (4)HashMap使用Key计算hashcode,HashSet使用成员对象计算hashcode;

    (5)HashMap要比HashSet快,因为它是使用唯一的键获取对象。

     

  • 相关阅读:
    C# 文件操作(读取文本/日志文件,读取文件列表,创建HTML,写入日志文件)
    网页布局与优化
    深度复制与浅度复制
    Silver 操作Cookie
    HTTP Method小结
    C# 主动发起请求代码
    震动放声音
    细数Objective-C中的回调机制
    iOS7隐藏状态栏 status Bar
    本地化UIImagePicker中的文字
  • 原文地址:https://www.cnblogs.com/goodbye-lazy/p/10408091.html
Copyright © 2020-2023  润新知