Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 372|回复: 0

[默认分类] Java常用集合类及其区别

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-10 13:24:19 | 显示全部楼层 |阅读模式


    面试时时被集合类各种虐,现在就来总结一下java的集合类及其区别。


    Java集合框架的基本接口、类层级结果如下:
    java.util.Collection[接口]
       --java.util.List[接口]
           --java.util.AarrayList
           --java.util.LinkedList
       --java.util.Vector
         --java.util.Stack
       --java.util.Set[接口]
         --java.util.HashSet
         --java.util.SortedSet[接口]
         --java.util.TreeSet
       --java.util.Queue
    java.util.Map[接口]
       --java.util.SortedMap[接口]
         --java.util.TreeMap
       --java.util.HashMap
       --java.util.HashTable
       --java.util.LinkedHashMap
       --java.util.WeakHashMap


    1.Collection
         是最基本的集合类型,所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个共的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。
    若要检查Collection中的元素,可以使用foreach进行遍历,也可以使用迭代器,Collection支持iterator()方法,通过该方法可以访问Collection中的每一个元素。用法如下:

    1. Iterator it=collection.iterator();
    2. while(it.hasNext()){
    3.    Object obj=it.next();
    4. }
    复制代码
    Set和List是由Collection派生的两个接口




    1.1 List接口

      List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引的位置来访问List中的元素,类似于Java数组。


      List允许有相同的元素存在。


      除了具有Collection接口必备的的iterator()方法外,还提供了listIterator()方法,放回一个
       ListIterator接口。
      



      实现List接口的常用类有LinkedList、ArrayList、Vector和Stack

    1.1.1 LinkedList类

         LinkedList实现了List类接口,允许null元素。此外LinkedList提供额外的get、remove、insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)


      LinkedList没有同步方法。如果多个线程想访问同一个List,则必须自己实现访问同步。一种解决办法是在创建List时构造一个同步的List:


      List list=Collection。synchronizedList(new LinkedList(...))

    1.1.2 AyyayList类

      ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。


      size(),isEmpty(),get(),set()方法运行时间为常数。但是add()方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。


      每个ArrayList实例都有一个容量(Capactity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入之前可以调用ensureCapacity()方法来增加ArrayList容量已提高插入效率

    1.2Vector类

      Vector非常类似ArrayList,当时Vector是同步的。由Vector创建的iterator,虽然和ArrayLsit创建的iterator是同一接口,但是,因为Vector是同步的,当一个iterator被创建而且这在被使用,另一个线程改变了Vector状态,这时调用iterator的方法时将抛出
      ConcurrentModificationException,因此必须捕获该异常。


    1.3 Stack类
         Stack继承自Vector,实现了一个后进先出的堆栈。Stack提供了5个额外的方法使得Vector得以被当做堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,serach方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。


    1.4 Set接口

         Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。


         很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。


          请注意:必须小心操作可变对象。如果一个Set中的可变元素改变了自身的状态导致Object.equals(Object)=true将导致一些问题


      


    1.4.1 HashSet

         HashSet调用对象的hashCode(),获得哈希码,然后在集合中计算存放对象的位置。通过比较哈希码与equals()方法来判别是否重复。所以,重载了equals()方法同时也要重载hashCode();


      


    1.4.2 TreeSet

      TreeSet 继承SortedSet接口,能够对集合中对象排序。默认排序方式是自然排序,但该方式只能对实现了Comparable接口的对象排序,java中对Integer、Byte、Double、Character、String等数值型和字符型对象都实现了该接口。


      



    2 Map接口

            Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供了3中集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key--value映射。


      


    2.1 HashTable类

         HashTable继承Map接口,实现了一个key--value映射的哈希表。任何非空的对象都可作为key或者value。


        添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。


        HashTable通过initial caoacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大了load factor可以节省空间但相应的查找时间将增大,这回影响像get和put这样的操作


      HashTable是同步的


      


    2.2 HashMap类

         HashMap和HashTable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key,但是将HashMap视为Collection时,其迭子操作时间开销和HahMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设的过高,或者load factor过低


      


    2.3 WeakHashMap类

      WeakHashMap是一种改进的HashMap,他对key实行弱引用,如果一个key不再被外部所引用,那么该key可以被GC回收


      



      



      






    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-20 14:47 , Processed in 0.430417 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表