Java集合的基本介绍

什么是集合

集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所以的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供了一些多线程支持的集合类。

  1. 集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
  2. 集合存放的是多个对象的引用,对象本身还是放在堆内存中。
  3. 集合可以存放不同类型,不限数量的数据类型。

在Java中,集合主要分为两类:

  • Collection:一组"对立"的元素,通常这些元素都服从某种规则:List必须保持元素特定的顺序;Set不能有重复元素;Queue保持一个队列(先进先出)的顺序;每个位置只能保存一个元素(对象)
  • Map:一组成对的"键值对"对象

Java集合类架构层次关系

Collection接口有个父接口:Iterable,这个Iterable接口只有一个方法: iterator()。它返回一个代表当前集合对象的泛型迭代器,用于之后的遍历操作。所以所有的Collection集合对象都具有"foreach可遍历性"。

1. Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object的集合,这些Object被称作Collection的元素。Collection是一个接口,用以提供规范定义,不能被实例化使用

1.1 Set接口

Set继承自Collection接口,不能包含有重复元素(记住,这是整个Set类层次的共有属性)。
Set集合类似于一个罐子,"丢进"Set集合里的多个对象之间没有明显的顺序。

Set判断两个对象相同不是使用"=="运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。

因为Set的这个制约,在使用Set集合的时候,应该注意两点:

  • 为Set集合里的元素的实现类实现一个有效的equals(Object)方法
  • 对Set的构造函数,传入的Collection参数不能包含重复的元素
1.1.1 HashSet类

HashSet是Set接口的典型实现,HashSet使用hash算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。

值得注意的是,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等。

HashSet底层是通过HashMap实现,插入到HashSet中的值作为key,value的值是一个常量。HashSet的方法基本调用Map的方法实现。

1.1.1.1 LinkedHashSet类

LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但和HashSet不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的

当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。

LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时(遍历)将有很好的性能(链表很适合进行遍历)

1.1.2 SortedSet接口

此接口主要用于排序操作,即实现此接口的子类都属于排序的子类

1.1.2.1 TreeSet类

TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态

1.1.3 EnumSet类

EnumSet是一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。

EnumSet的集合元素也是有序的,它们以枚举值在Enum类内的定义顺序来决定集合元素的顺序。

1.2 List接口

List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。

List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。

List集合默认按元素的添加顺序设置元素的索引

1.2.1 ArrayList类

ArrayList是基于数组实现的List类,它封装了一个动态的增长的、允许再分配的Object[]数组。

1.2.2 Vector

Vector和ArrayList在用法上几乎完全相同,但由于Vector是一个古老的集合,所以Vector提供了一些方法名很长的方法,但随着JDK1.2以后,java提供了系统的集合框架,就将Vector改为实现List接口,统一归入集合框架体系中

1.2.2.1 Stack类

Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出)。

1.2.3 LinkedList类

它实现两个接口:

  • List<E> :能对它进行队列操作,即可以根据索引来随机访问集合中的元素
  • Deque<E>:即能将LinkedList当作双端队列使用,也可以被当作"栈来使用"

1.3 Queue类

Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。

队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。

新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素。

1.3.1 PriorityQueue类

PriorityQueue并不是一个比较标准的队列实现,PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序,这点从它的类名也可以看出来。

1.3.2 Deque类

Deque接口代表一个"双端队列",双端队列可以同时从两端来添加、删除元素。

因此Deque的实现类既可以当成队列使用、也可以当成栈使用。

1.3.2.1 ArrayDeque类

是一个基于数组的双端队列,和ArrayList类似,它们的底层都采用一个动态的、可重分配的Object[]数组来存储集合元素,当集合元素超出该数组的容量时,系统会在底层重新分配一个Object[]数组来存储集合元素。

2. Map接口

Map用于保存具有"映射关系"的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value。

key和value都可以是任何引用类型的数据。

Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。

2.1 HashMap类

和HashSet集合不能保证元素的顺序一样,HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准也是: 两个key通过equals()方法比较返回true、同时两个key的hashCode值也必须相等。

2.1.1 LinkedHashMap类

LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区分)

2.2 HashTable类

是一个古老的Map实现类

2.2.1 Properties文件

Properties对象在处理属性文件时特别方便(windows平台上的.ini文件),Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入到属性文件中,也可以把属性文件中的"属性名-属性值"加载到Map对象中。

2.3 SortedMap接口

正如Set接口派生出SortedSet子接口,SortedSet接口有一个TreeSet实现类一样,Map接口也派生出一个SortedMap子接口,SortedMap接口也有一个TreeMap实现类。

2.3.1 TreeMap类

TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。

TreeMap可以保证所有的key-value对处于有序状态

同样,TreeMap也有两种排序方式: 自然排序、定制排序。

2.4 WeakHashMap类

WeakHashMap与HashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的"强引用",这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。

但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对。

2.5 IdentityHashMap类

IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等。

2.6 EnumMap类

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

EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)来决定元素的顺序。


Java 集合框架图

文章转载自集合是什么?Java集合的基本介绍(附框架图)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值