浅析java集合框架
一、图示集合
二、作用及分类
- 作用
-
- 集合是Java语言中非常重要的API
-
- 用来存储多个数据
-
- 实现了不同的数据结构
-
- 分类
-
- Collection:所有集合类的根接口
-
- Map:映射接口,存放键值对。
-
- Iterator:遍历集合的迭代接口
-
三、Collection接口
- Collection意即集合,是所有集合类的根接口,同时Collection接口是一个泛型接口。
- 方法:add(E): 添加对象;
Iterator<E> iterator():生成迭代器对象,进而可
以迭代集合中的元素。
int size();获取集合中元素数量。
……
- List:有序的集合,元素有序存入。
- Set:无重复的集合,即存入的元素不重复。
- Queue:队列,jdk1.5版本新增接口,Queue实现了“先进先出”(FIFO)的存储结构。Queue是Collection的子接口,具有所有集合基本操作,除此之外,Queue还提供了一些新的插入、提取、查询等方法。
1、Queue队列
- 一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
- 优点:它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。
- Queue常用方法
-
- offer():来加入元素
-
- poll():来获取并移出元素
-
- element():获取但是不移除此队列的头。
-
- peek():获取但不移除此队列的头;如果此队列为空,则返回 null。
-
- 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。
- 并行和并发区别
-
- 1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;
-
- 2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
-
- LinkedBlockingQueue是一个线程安全的阻塞队列,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
- ConcurrentLinkedQueue是Queue的一个安全实现.
Queue中元素按FIFO原则进行排序.采用CAS操作,来保证元素的一致性。
Deque
- 一个线性 collection,支持在两端插入和移除元素。
- 大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
- 此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。
- 该接口有3个实现类
-
- ArrayDeque:数组实现的Deque数据结构上比较简单,只需要一个存储数据的数组以及头尾两个索引即可。由于数组是固定长度的,所以很容易就得到数组的头和尾.
-
- LinkedBlockingDeque:双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表LinkedList
-
- Linklist
-
2、List
- 继承了Collection接口,并且扩展出属于自己的方法;
- List 集合中的元素都是与索引有关系的,因此List集合扩展的方法都是与索引有关系的。
- 例如: add(int index,E)……添加元素在所对应的索引位置 。
List是个接口,有三个实现的类
-
ArrayList被称为数组列表,数据采用数组的方式存储,使用连续内存存储。ArrayList是Java语言中可变长度数组的实现。
-
- ArrayList的常用方法
- add(Object o);->集合中添加数据
- remove(Object o)->删除集合中的数据
- add(int index, Object element)->给集合中某个索引位置添加一个数据
- get(int index)->获取集合中某个位置的信息
-
LinkedList称为链表,该集合类型实现了“链表”的数据结构。值得一提的是,LinkedList不仅实现了List接口,还实现了Queue接口,可以说链表同时也可以作为一个队列对象使用。使用方式与ArrayList类似。
-
- 常用方法
- add(E element)—向链表末尾添加一个新的节点,该节点中的数据是参数element指定的对象。
- add(int index, E element)—向链表的指定位置添加一个新的节点,该节点中的数据是参数element指定的对象。
-
- 扩展的方法
- addFirst(E element)—向链表的头添加新节点,该节点中的数据是参数element指定的对象。
- addLast(E element)—向链表的末尾添加新节点,该节点中的数据是参数element指定的对象。
-
- Vector是JDK1.0版本中的集合类,后来修改为实现了List接口。Vector的功能几乎都可以被ArrayList替代,主要区别是Vector是同步的,而ArrayList不是同步的。
-
3、Set
- Set接口继承了Collection接口。
- Set中所存储的元素是不重复的,但是是无序的。
- 也就是说,Set中的元素是没有索引的。
- Set接口有两个实现类
-
- HashSet:底层是哈希码值,基于HashMap实现的。按照哈希算法来存取对象,当向集合中加入一个新对象时,会调用对象的hashCode()方法得到对象的哈希码,然后根据这个码计算出对象在集合中存储的位置。
-
- TreeSet:元素不重复,并且元素实现了排序。可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
-
- 常用方法
- add(E o)将指定的元素添加到 set(如果尚未存在于该set中)。
- first() 返回已排序set中当前的第一个(最小)元素。
- last()返回已排序set中当前的最后一个(最大)元素。
- HashSet的使用和ArrayList是相同的。
-
四、Map接口
- Map中保存的是键值对Map key,Value ,Key值不允许重复。
- 常用方法: put(K key,V value)该方法可以将key和value存到Map对象
get(Object key)该方法可以根据key值返回对应的value。
size()返回Map对象中键值对的数量。
……
- HashMap:较常用的Map集合类,key值的hashCode和equals保证元素唯一性。HashMap通过hashcode对其内容进行快速查找, HashMap中元素的排列顺序是不固定的。
- TreeMap:不仅可以保证key不重复,还可以对value数据进行排序。所有的元素都保持着某种固定的顺序,如果需要得到一个有序的Map就应该使用TreeMap。
- HashTable: jdk1.0中定义的类,实现同步。
- 常用方法
-
- put key,value —>存放对象
-
- get(key); —>获取key所对应的数据。
-
- keySet() —> 返回此映射中所包含的键的 set 视图
- keySet() —> 返回此映射中所包含的键的 set 视图
-
五、Iterator接口
- 实际应用中,常常需要对集合元素进行迭代,Iterator接口提供了迭代集合对象的功能,是一个泛型接口.
- 常用方法:
-
- hasNext();此方法用来判断被迭代的集合中是否存在元素。
-
- next();返回集合中的当前元素。
-
- Collection对象都有返回Iterator的方法,因此都可以用迭代器来进行遍历。
- List集合
public static void main(String[] args) {
//创建用户对象
User user1=new User("张三");
User user2=new User("李四");
//创建集合对象,存放用户对象
List<User> userList=new ArrayList<User>();
//List<User> userList=new LinkedList<User>();
userList.add(user1);
userList.add(user2);
Iterator<User> userIter=userList.iterator();
while(userIter.hasNext()){
User userInfo=userIter.next();
}
}
- Set集合
public static void main(String[] args) {
User user1=new User("qw");
User user2=new User("er");
User user3=new User("rw");
Set<User> userSet1=new HashSet<User>();
//Set<User> userSet1=new TreeSet<User>();
userSet1.add(user3);
userSet1.add(user1);
userSet1.add(user2);
Iterator<User> it= userSet1.iterator();
while(it.hasNext()){
System.out.println(it.next().getUserName());
}
}
- Map集合
-
- Map集合是以键值对存放的,Map接口中提供了将key与value分别转变成Collection对象的方法,然后就可以使用Iterator分别遍历Map的key以及value。
-
public static void main(String[] args) {
Test06 user1 = new Test06();
user1.setName("王华");
user1.setAge(12);
UserInfo user2 = new UserInfo();
user2.setName("小华");
user2.setAge(8);
UserInfo user3 = new UserInfo();
user3.setName("张华");
user3.setAge(12);
Set<UserInfo> userSet = new TreeSet<UserInfo>();
// Set<UserInfo> userSet=new HashSet<UserInfo>();
userSet.add(user);
userSet.add(user1);
userSet.add(user2);
Iterator<UserInfo> it = userSet1.iterator();
while (it.hasNext()) {
UserInfo info = it.next();
System.out.println(info.getName() + info.getAge());
}
}