Java类库中帮助我们在程序设计中实现了传统的数据结构。本文章跳过理论部分,主要介绍如何使用标准库中的集合类。

1 将集合的接口与实现分离

  Java集合类库将接口与实现分离。以队列为例:

 public interface Queue<E> extends Collection<E> {
boolean add(E e); E remove(); /*
其他方法
*/
}

上述代码为Java类库中队列的一部分代码,可以看到,这个接口没有说明队列是如何实现的。

队列通常有两种实现方式:

1.使用循环数组

2.使用链表

而在Java中,每一种实现都可以通过一个实现了Queue接口的类表示:

实现循环数组方式的双端队列,Java中使用 ArrayDeque类实现,这个类实现了继承自Queue接口的Deque接口,并使用一个数组存储队列中的元素。

实现链表方式的双堆队列,Java中的 LinkedList类通过实现同样的Deque接口实现。

使用接口与实现的模式,当程序中使用到队列时,一旦构建了集合便不需要知道使用了那种实现,当一旦改变了想法,可以轻松的在构建集合的位置改成另外一种实现。

2 Collection 接口

public interface Collection<E>
{
boolean add(E element);
Iterator<E> iterator();
...其他方法
}

add 方法用于添加元素,如果添加元素改变了集合就返回true,否则返回false。如果试图想一个集中添加一个已有对象,添加请求就不会生效,因为集中不允许存在重复对象。

iterator 方法返回一个实现了Iterator 接口的对象。

3 迭代器

 package java.util;

 import java.util.function.Consumer;

 public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
void forEachRemaining(Consumer<? super E> action);
}

Iterator 接口中包含4个方法:

  next() :通过反复调用next()方法,可以逐个访问集合中的元素,但是如果到达了集合的末端,next方法将抛出一个 NoSuchElementException,因此,一般在调用next()方法前调用hasNext()方法。

  hasNext() :如果迭代器对象还有供访问的对象,则返回true。

  forEachRemaining:Java8中的遍历方法,参数为一个lambda表达式,迭代器将对每一个元素执行这个lambda表达式。

  remove() :删除上次调用next方法时返回的元素,如果调用remove前没有调用next方法,这将是不合法的,会抛出一个 IllegalStateException 异常。

    如果要删除两个相邻的元素,不能直接调用两次remove

iterator.remove();
iterator.remove(); //error iterator.remove();
iterator.next();
iterator.remove(); //true

Collection 接口声明了许多实用的方法,为了让实现者更好实现Collection接口,Java提供了一个AbstractCollection的类,它将基础方法size和iterator抽象化了,而其他的方法提供了默认的实现,实现者只需要一个具体的集合类继承AbstractCollection类,就可以实现Collection接口。

4 集合框架中的接口

  Java集合框架为不同类型的集合提供了大量的接口

  

集合中的两个基本接口:

  •   Collection:

    List 是一个有序集合,可以支持迭代器访问和随机访问。

    Set 其add方法不允许增加重复的元素,因此使用时应 适当地定义Set的equals方法:只要两个集包含同样的元素就认为是相等的;适当地定义hashCode方法 :保证包含相同的元素的两个集会得到相同的散列码。

      SortedSet 会提供用于排序的比较器对象,定义了可以得到集合子集的视图。

      NavigableSet 包含一些用于搜索和遍历有序集的方法,TreeSet实现了这个接口。

    Queue 是一个先进先出的队列。

    Deque 双端队列

  • Map:包含键值对的映射

   SortedMap 会提供用于排序的比较器对象,定义了可以得到集合子集的视图。

   NavigableMap 包含一些用于搜索和遍历映射的方法,TreeMap实现了这个接口。

   

  ListIterator 是Iterator 的一个子接口。它定义了一个方法用于在迭代器位置前面增加一个元素:void add(E element)

  为了避免对链表进行随机访问操作,Java引入了RandomAccess标记接口,该接口不包含任何方法,但可以用它来测试一个集合是否支持随机访问。

if(c instanceof RandomAccess){
使用随机访问
}else{
使用迭代器访问
}

【集合】Java集合框架的更多相关文章

  1. Java集合-----java集合框架常见问题

    1什么是Java集合API Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法. 简言之,API在上层完成以下几件事: ● 编程更加省力,提高城 ...

  2. [Java核心技术]第九章-集合(Java集合框架、具体的集合、映射)

    9.1Java集合框架 一些有的没的 可以使用接口类型存放集合的引用.一旦改变了想法,只需要在调用构造函数的地方做一处修改. add方法用于向集合添加元素,如果添加元素确实改变了集合就返回true. ...

  3. java 集合框架(一)概述

    一.概述 Java Collection Framework (JCF) 提供给我们一系列的类和接口,方便开发者处理集合对象. 在Java 2之前,Java是没有完整的集合框架的.它只有一些简单的可以 ...

  4. Java集合框架总览

    Java集合 Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口有 3 种子类型,Lis ...

  5. 第八章.Java集合

    Java集合类是一种特别有用的工具类,可用于存储数量不等的对象.Java集合大致可分为Set.List.Queue和Map四种体系 Set代表无序.不可重复的集合 List代表有序.重复的集合 Map ...

  6. Java集合原理分析和知识点大杂烩(多图初学者必备!!)

    一.数据结构 ​ 数据结构就是计算机存储.组织数据的方式. ​ 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. ​ 时间复杂度是同一问题可用不同算法解决, ...

  7. 深入java集合学习1-集合框架浅析

    前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...

  8. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  9. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  10. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

随机推荐

  1. AES

    ES算法之理论与编程结合篇 1 前言 AES是现在使用最多的对称密钥分组密码算法,在逆向的过程中经常碰到,这几天处于离职期,有点时间,于是乎想细细的来研究一下它的原理,也算是离职的一个纪念吧. 网上的 ...

  2. linux php7.2安装扩展memcached

    wget http://pecl.php.net/get/igbinary-2.0.8.tgz tar -xzvf igbinary-2.0.8.tgz cd igbinary-2.0.8 /usr/ ...

  3. 二分查找方法和printk打印级别

    人生就是一个茶几,上面摆满了杯具.内核也是一个大茶几,不过它上面的杯具是一个个的bug.确定bug什么时候被引入是一个很关键的步骤,在这个定位bug的过程中,不论有意或无意,都会很自然地用到二分查找的 ...

  4. lr12脚本参数化

    1.注册.登录.获取商品列表lr脚本 Action() {        lr_save_string("192.168.46.129:8080","IP"); ...

  5. EVE-NG简单入门介绍

    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等. 一.导入镜像 D ...

  6. DNS区域传送、子域授权

    前言 DNS服务器搭建参考上一篇: DNS主从复制,就是将主DNS服务器的解析库复制传送至从DNS服务器,进而从服务器就可以进行正向.反向解析了.从服务器向主服务器更新查询数据,保证数据一致性,此为区 ...

  7. Java多线程之线程状态总结

    概述 线程大家肯定不陌生,对于线程中的运行状态,自己经常搞混淆,这边按照下图记录下: 线程一般来说有如下几种状态: 新建,可运行,超时阻塞,等待阻塞,同步阻塞,死亡 yeild:当线程执行了yield ...

  8. MySql主从搭建详细步骤

    环境: linux64位,一台机器两个实例,主库3306端口,从库3307端口 步骤: 一.下载安装 先下载安装mysql,这里使用了5.7.21版本,具体过程不做详细说明,可自行查资料如何下载 二. ...

  9. react 表单受控和非受控

    参见:https://goshakkk.name/controlled-vs-uncontrolled-inputs-react/ 非受控: onSubmit = ()=>{ const val ...

  10. IRP小结 0x01 IRP & IO_STACK_LOCATION(结合WRK理解)

    写博客整理记录一下IRP相关的知识点,加深一下印象. 所有的I/O请求都是以IRP的形式提交的.当I/O管理器为了响应某个线程调用的的I/O API的时候,就会构造一个IRP,用于在I/O系统处理这个 ...