java中的集合框架:Collection 和Map

集合:包含多个元素的对象,又称容器

集合框架:一个代表、操作集合的统一架构,所有的集合框架都包含:接口、实现类以及算法。
**接口:**表示集合的抽象数据类型。接口允许我们操作集合时不必关注具体实现,从而达到“多态”。在面向对象编程语言中,接口通常用来形成规范。

**实现类:**集合接口的具体实现,是重用性很高的数据结构。
**算法:**用来根据需要对实体类中的对象进行计算,比如查找,排序。 同一种算法可以对不同的集合实现类进行计算,这是利用了“多态”;重用性很高。

其他语言的集合框架:
C艹 的 STL(标准模板库),Smalltalk 的集合层次结构

java集合框架

Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。

Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。

java集合框架主要结构图:
在这里插入图片描述
Collection接口继承树
在这里插入图片描述
Collection接口中的15个方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

遍历 Collection 的几种方式:

  1. foreach方式:
Collection<Person> persons = new ArrayList<Person>();
for (Person person : persons) { 
    System.out.println(person.name);  
}  
  1. Iterator迭代器:
Collection<Person> persons = new ArrayList<Person>();
Iterator iterator = persons.iterator();
while (iterator.hasNext) { 
    System.out.println(iterator.next);  
} 
  1. 聚合操作aggregate operations
Collection<Person> persons = new ArrayList<Person>();
persons
    .stream()
    .forEach(new Consumer<Person>() {  
        @Override  
        public void accept(Person person) {  
            System.out.println(person.name);  
        }  
}); 

Aggregate Operations 聚合操作
在 JDK 8 以后,推荐使用聚合操作对一个集合进行操作。聚合操作通常和 lambda 表达式结合使用,让代码看起来更简洁(因此可能更难理解)。下面举几个简单的栗子:
在这里插入图片描述

Set子接口

Set集合不允许包含相同的元素,而判断两个对象是否相同则是根据equals方法。

HashSet类

HashSet类是Set接口的典型实现类。特点:

1.不能保证元素的排列顺序,加入的元素要特别注意hashCode()方法的实现。
2.HashSet不是同步的,多线程访问同一步HashSet对象时,需要手工同步。
3.集合元素值可以是null。

LinkedHashSet类

LinkedHashSet类也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序。与HashSet相比,特点:

1.对集合迭代时,按增加顺序返回元素。
2.性能略低于HashSet,因为需要维护元素的插入顺序。但迭代访问元素时会有好性能,因为它采用链表维护内部顺序。

SortedSet接口及TreeSet实现类

TreeSet类是SortedSet接口的实现类。因为需要排序,所以性能肯定差于HashSet。与HashSet相比,额外增加的方法有:

first():返回第一个元素
last():返回最后一个元素
lower(Object o):返回指定元素之前的元素
higher(Obect o):返回指定元素之后的元素
subSet(fromElement, toElement):返回子集合
可以定义比较器(Comparator)来实现自定义的排序。默认自然升序排序。

EnumSet类

EnumSet类是专为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值。

List子接口

List子接口是有序集合,所以与Set相比,增加了与索引位置相关的操作:

add(int index, Object o):在指定位置插入元素
addAll(int index, Collection c):…
get(int index):取得指定位置元素
indexOf(Obejct o):返回对象o在集合中第一次出现的位置
lastIndexOf(Object o):…
remove(int index):删除并返回指定位置的元素
set(int index, Object o):替换指定位置元素
subList(int fromIndex, int endIndex):返回子集合

ArrayList和Vector实现类

这两个类都是基于数组实现的List类。
ArrayList是线程不安全的,而Vector是线程安全的。但Vector的性能会比ArrayList低,且考虑到兼容性的原因,有很多重复方法。
Vector提供一个子类Stack,可以挺方便的模拟“”这种数据结构(LIFO,后进先出)。
结论:不推荐使用Vector类,即使需要考虑同步,即也可以通过其它方法实现。同样我们也可以通过ArrayDeque(数组双端队列)类或LinkedList类实现“栈”的相关功能。所以Vector与子类Stack,建议放进历史吧。

LinkedList类

不像ArrayList是基于数组实现的线性表,LinkedList类是基于链表实现的。

另外还有固定长度的List:Arrays工具类的方法asList(Object… a)可以将数组转换为List集合,它是Arrays内部类ArrayList的实例,特点是不可以增加元素,也不可以删除元素。

Queue子接口

Queue用于模拟队列这种数据结构,实现“FIFO”等数据结构。通常,队列不允许随机访问队列中的元素。

Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。
BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。

Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。

基本操作:

boolean add(E e) : 将元素加入到队尾,不建议使用
boolean offer(E e): 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。推荐使用此方法取代add
E remove(): 获取头部元素并且删除元素,不建议使用
E poll(): 获取头部元素并且删除元素,队列为空返回null;推荐使用此方法取代remove
E element(): 获取但是不移除此队列的头
E peek(): 获取队列头部元素却不删除元素,队列为空返回null

PriorityQueue类

PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按队列元素的大小重新排序。当调用peek()或者是poll()方法时,返回的是队列中最小的元素。当然你可以与TreeSet一样,可以自定义排序。

Deque子接口与ArrayDeque类

Deque代表一个双端队列,可以当作一个双端队列使用,也可以当作“栈”来使用,因为它包含出栈pop()与入栈push()方法。

ArrayDeque类为Deque的实现类,数组方式实现。方法有:

addFirst(Object o):元素增加至队列开头
addLast(Object o):元素增加至队列末尾
poolFirst():获取并删除队列第一个元素,队列为空返回null
poolLast():获取并删除队列最后一个元素,队列为空返回null
pop():“栈”方法,出栈,相当于removeFirst()
push(Object o):“栈”方法,入栈,相当于addFirst()
removeFirst():获取并删除队列第一个元素
removeLast():获取并删除队列最后一个元素

实现List接口与Deque接口的LinkedList类

LinkedList类是List接口的实现类,同时它也实现了Deque接口。因此它也可以当做一个双端队列来用,也可以当作“栈”来使用。并且,它是以链表的形式来实现的,这样的结果是它的随机访问集合中的元素时性能较差,但插入与删除操作性能非常出色。

各种线性表选择策略

数组:是以一段连续内存保存数据的;随机访问是最快的,但不支持插入、删除、迭代等操作。
ArrayList与ArrayDeque:以数组实现;随机访问速度还行,插入、删除、迭代操作速度一般;线程不安全。
Vector:以数组实现;随机访问速度一般,插入、删除、迭代速度不太好;线程安全的。
LinkedList:以链表实现;随机访问速度不太好,插入、删除、迭代速度非常快。

猜你喜欢

转载自blog.csdn.net/mulinsen77/article/details/84844412