第八章:Java集合

本文深入解析了Java中的集合类,包括Set、List和Map的各种实现,如HashSet、TreeSet、ArrayList、LinkedList、HashMap和TreeMap等。详细介绍了每种集合的特点、应用场景及内部实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set集合:

             类似于一个罐子,很多对象都可以丢进去,通常是不能记住丢进去的顺序的,因此set集合中的对象不能是同一个对象。存         储的时候采用hash算法机制,计算存储的位置。

HashSet类:

            无序,允许存放null值,地城封装的是HashMap,实现的时候是不同步的,线程步安全。

            当存入一个元素的时候使用hashCode()方法来得一个int值,然后根据这个值决定对象放在HashSet中的存储位置。如果有            两个元素则利用equal()方法比较,即使其结果返回是true,只要hashCode值不一样也可以添加成功。换一句话说比较两个对象是不是相等需要比较equal相等,还要hashCode也要相等。因此重写的时候尽量保证equal()返回true的时候,hashCode()方法也换回true。

             如果equal返回是false的时候,其hashCode的值是true的时候,则在同一个桶之中需要存放很多元素,这样会导致性能下             降。

LinkedHashSet类

          LinkedHashSet是HashSet的子类,它使用链表维护元素元素的次序,因此在遍历的LinkedHashSet()的时候,会按照添加的顺序来       访问集合里面的元素。

TreeSet类  

           TreeSet是接口类SortedSet的实现类,因此可以确保该类是一个排序状态。

           与HashSet不同的是,TreeSet是以红黑树的结构来决定存储位置的。

           排序状态则分为两种:

                自然排序,利用cmpareTo()方法来比较元素的大小,按照升序排序,元素要实现 Comparable接口,因为其提供comparaTo()。

                定制排序,在创建的是时候与Comparator关联,因为Comparator是一个函数式接口,故可以利用Lambda表达式。

          TreeSet类是利用comparaTo()来判断两个元素是否相等

 EnumSet类

          存入的元素都是枚举里面的元素,不允许存null,以位向量形式存储,像是非常紧凑和高效,因此对像内存占用小,运行效率也很              好。

总结:

      HasSet性能要比TreeSet好,因为TreeSet需要维护一红黑树,因为在不需要对元素进行排序的时候,一般选择都是HasSet。

      HashSet和LinkedHashSet相比,插入和删除的候,HashSet性能要好,因为维护链表会带来额外开销,但是在遍历的时候     LinkeHashSet却要好一些。

      EnumSet是Set所有实现类中,性能最好的,另外HashSet TreeSet EnumSet都是线程不安全的。如果要线程安全则需要Collection类中的synchronizedSortedSet方法来包装该set集合。

 

List集合:

         list是Collection是子接口,List集合代表一个可重复的,排序的元素集合,其默认的索引顺序是其添加顺序,从0开始。

ArratList和Vector实现类

         ArrayList和Vector作为list最经典的实现类,完全支持list接口的全部功能,且都是基于数组实现的。

         ArrayList是线程不安全的,Vector是线程安全的,所以ArrayList是性能相对好些,但是即使在使用的时候一般也是利用collection将           ArrayList用来保证其线程安全。

LinkedList实现类

         LinkedList实现了Deque,所以即可以当成队列也可以当成栈来使用。ArrayList内部是以数组的形式存储的,因此在随机访问的时候         性能较好,而LinkedList在插入和删除的时候性能比较出色。

 

Map集合:

       用来存储键值对,其中key和value可以是任何的引用类型数据,但是key值不能相同。

HashMap和Hashtable实现类:

       两者之间的关系和HashSet和Vector相似。

 两者之间的主要区别:

       HashMap线程不安全,Hashtable线程安全,因此HashMap性能会更好一点。

       Hashtable不可以把null作为key和value,但是HashMap可以把Null作为key和value。
两者共同点:

       与HashSet类似, Hashtable和HashMap判断key是否相同的标准是,equal()方法是true,并且HashCode()方法也是true。

       判断value是否相同,主要是equal()方法是否相同。

LinkedHashMap实现类

        使用双向链表来维护的key-value,并只维护key的次序。因为需要维护插入元素的顺序,性能比hashMap低,但是在迭代访问的时候        性能比较好,且迭代的时候与添加元素的顺序一致。

SortedMap接口和TreeMap实现类

         TreeMap是SortedMap的实现类,其本身久是一颗红黑树结构,通过排序来确定来确定存储节点。

         排序的方式:

              自然排序:key必须实现了Comparable,且必须是同一个类型的数据。

              定制排序:传入一个Comparator对象,该对象负责对key进行排序。

          判断相等,comparaTo()返回0表示两个key相等。

WeakHashMap实现类

        因为HashMap对对象使用的是强引用,在垃圾回收的时候,不会被回收。而WeakHashMap保留的是对实际对象的弱引用,因此在垃圾回收的时候key所引用的对象可能被回收。当垃圾回收的时候,回收了key所引用的对象之后,WeakHashMap会自动删除key对应的Key-value键值对。

       对象应用的级别:

        强引用:垃圾回收永远回收不了。

        软引用:要发生内存溢出之前,把这些对象列入垃圾回收的范围之中,进行第二次回收。

        弱引用:只能生存到下一次垃圾收集发生之前,当垃圾回收工作的时候,无论内存足够都回回收。

        虚引用:用来收到一个系统通知,当对象被垃圾回收的时候。

IdentityHashMap实现类

        和HashMap类似,但是在处理两个key是否相等的时候要严格相等,key1=key2。

         注意字符串直接量,由于字符串直接量是使用常量池来管理的,所以==比较会返回true。

总结:

     TreeMap通常比HashMap,Hashtable要慢,尤其在插入删除的时候。但是有一个好处是TreeMap中的key-value是一个总是有序状态,无序进行排序操作。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值