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. Mysql生产指定时间段随机日期函数

    UPDATE basicsale_b2b2c.basic_customer SET registerDate = ( from_unixtime( unix_timestamp('2017-01-01 ...

  2. pip安装问题

    一,安装pyecharts 出现问题的2个提示 failed to import pyecharts_snapshot   成功解决 第一个升级问题 you are using pip version ...

  3. 将一个js项目改造成vue项目

    本地环境:node版本:8.11.4 vue版本:3.4.1; 开发工具vscode 1.创建一个空的vue项目(vue create bigdata_reprot_web) 2.找到项目的空白页,改 ...

  4. JQuery 方法合集(懒人备记)

    原创文章,转载请私信.谢谢~ PS:请将jquery的引用文件放在head的标签内 语法:$(selector).action() $(document).ready(function(){ // 开 ...

  5. 用VS2017编写C语言的Hello World

    1.新建项目 2.选择新建空项目 3.在源文件处右键单击,选择添加-新建项 4.选择“c++文件”,将名称后缀改成.c即可用C语言编写程序 5.编写代码: #include <stdio.h&g ...

  6. 五、docker网络技术

    五 docker网络技术 1.本章环境: 源码文件目录: 2.网络基础回顾 通道: NAT将私有地址和端口号翻译成公有的地址和端口号项某网站发出数据包.某网站根据数据表查出私有ip和端口号返回数据. ...

  7. R语言最优化(多维)

    线性搜索的最速上升法 #### max.search <- function(f, x, y, tol=1e-9, a.max = 2^5){ if(sum(abs(y)) == 0) retu ...

  8. php不用正则表达式实现身份证号验证详解

    写了一个身份证号验证类,php小白,写的不好,欢迎各位大神给我多提意见和建议 身份证号分为四部分,第一部分是前6位为地址码,7-14位是出生日期,15-17位是同一地方同一天出生的男孩为奇数,女孩是偶 ...

  9. Android 访问地址

    private String url_data = "https://api.douban.com/v2/movie/top250?start=0&count=10"; 免 ...

  10. 初识Hibernate框架,进行简单的增删改查操作

    Hibernate的优势 优秀的Java 持久化层解决方案  (DAO) 主流的对象—关系映射工具产品 简化了JDBC 繁琐的编码 将数据库的连接信息都存放在配置文件 自己的ORM框架 一定要手动实现 ...