Java基础之集合

Java集合类是 一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈、队列等。除此之外,Java集合还可以用于保存具有映射关系的数组。Java集合大致可分为Set、List、Queue和Map四种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合,Java5又增加Queue体系集合,代表一种队列集合实现。

集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。

Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子类接口或实现类:

  1.Collection的继承树:



  2.Map的继承树:


   Map保存的每项数据都是key-value对,也就是由key和value两个值组成。Map里的key是不可重复的,key用于标识集合里的每项数据,需要查阅Map中的数据时,总是根据Map的key来获取。

 3.Set集合:

     HashSet:按HashSet算法来存储集合中的元素,因此具有很好的存取和查找性能。

其特点有:不能保证元素的排序顺序,顺序可能与添加顺序不同,顺序也可能发生变化;不是同步的,如果多个线程同时访问一个HashSet,必须通过代码来保证其同步;集合元素可以是null。

当向HashSet集合存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的储存位置。如有两个元素通过equals()方法比较返回true,但它们的hashCode()方法返回值不相等,HashSet将会储存在不同的位置,依然可以添加成功。

HashSet集合判断两个元素相等的标准是两个对象通过equals()、hashCode()两个方法的一个或全部。

      LinkedHashSet:是根据元素的hashCode值来决定元素的储存位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,当遍历LinkHashSet集合里的元素时,LinkHashSet将会按元素的添加顺序来访问集合的元素。

      TreeSet:采用红黑树的数据结构来储存集合元素,支持两种排序方法:自然排序和定制排序。自然排序:会调用集合元素的compareTo(Object object)方式来比较元素之间的大小关系,然后将集合元素按升序排序。定制排序:通过Comparator接口。接口里包含一个int compare(T o1,T o2)方法。该方法用于比较o1和o2的大小。

      EnumSet:转为枚举类设计的集合类,其中的所有的元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显示或隐式地指定。在其内部以向量的形式储存,不允许null元素加入。

  4.List集合:一个元素元素有序、可重复的,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引。

     ArrayList和Vector:这两个类都是基于数组实现的List类,这两个类封装了一个动态的允许在分配的Object[]数组。使用initalCapacty参数来设置该数组的长度,当向list中添加元素超出了该数组的长度时,它们的initalCapacity会自动增加。

  5.Queue集合:用于模拟队列这种数据结构,队列通常是指“先进先出(FIFO)”的容器。队列的头部保存在队列中存放时间的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。队列不允许随机访问队列中的元素。

     PriorityQueue:是一种比较标准的队列实现类。它是比较标准的队列实现,而不是绝对标准的队列实现,是因为PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek()方法或poll方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。不允许mull插入,有自然排序和定制排序两种排序方式。

     Deque:双端队列,Deque接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列的元素。

     LinkList:可以根据索引来随机访问集合的元素,除此之外,LinkList还实现了Deque接口,可以被当成双端队列来使用,它既可以被当成“栈”来使用,也可以当成队列使用。

   6.Map集合:

     LinkHashMap:可以避免HashMap、Hashtable里的key-value对进行排序,同时又避免使用TreeMap所增加的成本。只需要维护元素的插入顺序,因此性能略低于HashMap的性能,其内部是以链表维护内部顺序,所以在迭代访问Map里的全部元素讲有较好的性能。

    Properties:是Hashtable类的子类,其对象在处理属性文件时特别方便。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名-属性值”加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型。

   TreeMap:是一个红黑树数据结构,每个key-value对即是作为红黑树的一个节点。TreeMap储存key-value对时,需要根据key对节点进行排序,TreeMap可以保证所以的key-value对处于有序状态则有两种排序方式:自然排序和自定义排序。

   WeakHashMap:与HashMap的用法基本一致,区别是HashMap的key值保留了对实际对象的强引用,只要HashMap对象不被销毁,其所有key引用的对象就不会被垃圾回收,而WeakHashMap中的key所引用的对象可能被垃圾回收。

   IdentityHashMap:与HashMap用法基本相似,IdentityHashMap不能保证key-value对之间的顺序,也不能保证顺序随时间的推移保持不变。

   EnumMap:是一个与枚举类一起使用的Map实现,其所有key都必须是单个枚举类的枚举值,创建它时必须显式或隐式指定它对应的枚举类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值