浅析java集合框架

浅析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 视图

五、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());
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值