集合分为Collection和Map两种体系
Collection接口:单列数据,定义了一组存取对象的方法的集合
- List接口:元素有序,可重复的集合
- Set接口:元素无序,不可重复的集合
Map接口:双列数据,保存具有映射关系,key-value对的集合
Map接口继承图集合
开发中集合的选择
- List集合
如果需要保留存储顺序并保存重复元素,推荐使用List集合 - ArrayList: 若查询较多,推荐使用ArrayList
- LinkedList:若存取较多,推荐使用LinkedList
- Vector:若需要线程安全,推荐使用Vector,但开发中一般由程序员来实现集合的线程安全,不常用
- Set集合
如果不需要保留存储顺序并需要去除重复的元素,推荐使用Set集合 - HashSet:若不需要排序时,推荐使用HashSet,HashSet比TreeSet效率高
- TreeSet:若需要将元素排序,推荐使用TreeSet
- LinkedHashSet:若需要保留存储顺序,又需要去除重复元素,推荐使用LinkedHashSet
List接口
是用于有序存储可重复元素的集合
List接口继承了Collection接口,声明有序存储对象(对象可重复)功能的公共接口
ArrayList
- 数组实现,查找快,增删慢
- 由于是数组实现,在增加或删除时,会牵扯到数组扩容以及元素的拷贝,所以效率慢,数组是可以直接按索引查询,所以查询的时候,较快
LinkedList
- 链表实现,增删快、查询慢,由于链表实现:
1、增加时只要让前一个元素记住自己就可以了
2、删除时,让前一个元素记住后一个元素,后一个元素记住前一个元素,这样增删效率比较高
3、查询时需要一个一个的遍历,效率比较低
Vector
- 基于数组实现的,线程同步的遗留集合类,
- 和ArrayList原理相同,但线程安全,效率比较低,一般来讲,线程安全的东西,效率有点影响
Stack
- 栈(stack)是一种后进先出(LIFO)的集合类型, 即后来添加的数据会先被删除
- 可以将其类比于下面文件的取放操作:新到的文件会被先取走,这使得每次取走的文件都是最新的
- 实现栈有以下2种方式
1、用数组实现栈
2、用链表实现栈
Queue
- 队列属于一种遵循先进先出(FIFO)原则的集合类型
- 可以将其类比为生活中一些以公平性为原则的服务场景:排成一排的客户等待服务,等待最久即最先入列的客户应该最先提供服务(出列)
- 实现队列有以下2种方式
1、用链表实现队列
2、用循环数组实现队列
栈遵循后进先出的原则,所以要在数组或链表同一端做添加和删除操作
队列遵循先进先出的原则, 所以要在数组或链表的两端分别做插入和删除的操作
Set接口
- Set接口继承了Collection接口,声明无序存储对象(对象不可重复)功能的公共接口,不能通过索引方式获取
- Set接口的实现类,判断两个对象是否相等,不是通过 ==运算符,而是根据equals()方法比较
- 由于集合元素是不可重复的,如果试图把一个对象存放在Set容器中时,对应的类必须重写equlas()方法和hashCode(Object obj)方法,以实现对象相等规则,插入元素时会进行hash验证
HashSet
- HashSet无序不可重复
- HashSet不是线程不安全
- 基于hash算法来存储集合中的元素,因此具有很好的存取、查找、删除性能
LinkedHashSet
- LinkedHashSet有序不可重复
- LinkedHashSet是HashSet的子类
- LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来以插入顺序保存的
- LinkedHashSet插入性能略低于HashSet,但在迭达访问Set集合元素时有不错的表现
TreeSet
- TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态
- TreeSet底层使用红黑树结构存储数据
- TreeSet有两种排序方式:自然排序、定制排序
- 如果试图把一个对象添加到TreeSet集合时,则该对象的类必须实现Comparable接口
Map接口
- Map接口用于保存映射关系的数据,key-value
- Map中的key和value,可以是任何引用类型的数据
- Map中的key是用Set存放的,不允许重复,即作为key的类,一定要重写hashCode()和equals()方法
- 一般常用String类型,作为Map集合中的key
网友评论