一、Java集合框架

Java集合类库也将接口与实现分离。

队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数。

队列通常有两种实现方式:一种是使用循环数组;另一种是使用链表。

可以使用接口类型存放集合的引用。

循环数组要比链表更高效,但循环数组是一个有界集合,如果对象数量没有上限,最好使用链表来实现。

在Java类库中,集合类的基本接口是Collection接口,这个接口有两个基本方法:

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

add方法用于向集合中添加元素。如果添加元素确实改变了集合就返回true,如果集合没有发生变化就返回false。

Iterator方法用于返回一个实现了Iterator接口的对象。可以使用这个迭代器对象依次访问集合中的元素。

Iterator接口中包含四个方法:

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

通过反复调用next方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next方法将会抛出一个NoSuchElementException。因此,需要在调用next之前调用hasNext方法,如果迭代器对象还有多个供访问的元素,这个方法就会返回true。

编译器简单的将“for each”循环编译为带有迭代器的循环。

Collection接口扩展了Iterable接口,因此,对于标准类库中的任何集合都可以使用“for each”循环。

在Java SE8中,可以调用forEachRemaining方法并提供一个lambda表达式,将对迭代器的每一个元素调用这个lambda表达式,直到再没有元素为止。

Java迭代器应该被认为是位于两个元素之间。当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。

Iterator接口的remove方法将会删除上次调用next方法时返回的元素,如果想要删除指定位置上的元素,仍然需要越过这个元素。

对next方法和remove方法的调用具有互相依赖性,如果调用remove之前没有调用next将是不合法的,会抛出一个IllegalStateException异常。

集合框架的接口:

集合有两个基本接口:Collection和Map。

List是一个有序集合。元素会增加到容器中的特定位置。可以采用两种方式访问元素:用迭代器访问;是用一个整数索引来访问。后一种方法称为随机访问,因为这样可以按任意顺序访问元素。与之不同,使用迭代器访问时,必须顺序的访问元素。

集(Set)的add方法不允许增加重复的元素。要适当的定义集的equals方法:只要两个集包含同样的元素就认为是相等的,而不要求这些元素有相同的顺序。hashCode方法的定义要保证包含相同元素的两个集会得到相同的散列码。

二、具体的集合

在Java程序设计语言中,所有链表实际上都是双向链接的——即每个结点还存放着指向前驱结点的引用。

链表是一个有序集合。

add方法只依赖于迭代器的位置,而remove方法依赖于迭代器的状态。

可以根据需要给容器增加很多个迭代器,但是这些迭代器只能读取列表,另外,再单独增加一个既能读,又能写的迭代器。

使用链表的唯一理由是尽可能减少在列表中间插入或删除元素所付出的代价。

散列表是一种可以快速查找到所需要对象的数据结构。散列表为每个对象计算一个整数,称为散列码。

树集是一个有序集合,要使用树集,必须能够比较元素,这些元素必须实现Comparable接口,或者构造集时必须提供一个Comparator。

树的排序必须是全序,任意两个元素必须是可比的,并且只有在两个元素相等时结果才为0。

有两个端头的队列,即双端队列,可以让人们有效的在头部和尾部同时添加和删除元素。

优先级队列中的元素可以按照任意的顺序插入,却总是按照顺序的顺序进行检索。

三、映射

Java类库为映射提供了两个通用的实现:HashMap和TreeMap。

散列映射对键进行散列,树映射用键的整体顺序对元素进行排序,并将其组织成搜索树。

四、遗留的集合

1、HashTable类

2、枚举(Enumeration)

3、属性映射(Properties):有三个特性:

  A、键与值都是字符串。

  B、表可以保存到一个文件中,也可以从文件中加载。

  C、使用一个默认的辅助表。

4、栈(Stack)

5、位集(BitSet)

Java基础(八)的更多相关文章

  1. Java基础八--构造函数

    Java基础八--构造函数 一.子父类中构造函数的特点 1.1 为什么在子类构造对象时,发现,访问子类构造函数时,父类也运行了呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super( ...

  2. Java基础(八)--String(源码)、StringBuffer、StringBuilder

    String源码:基于jdk1.8 public final class String implements Serializable, Comparable<String>, CharS ...

  3. java基础八 [序列化和文件的输入/输出](阅读Head First Java记录)

    对象具有状态和行为两种属性.行为存在类中的方法中,想要保存状态有多种方法,这里介绍两种: 一是保存整个当前对象本身(通过序列化):一是将对象中各个状态值保存到文件中(这种方式可以给其他非JAVA程序用 ...

  4. 重学JAVA基础(八):锁的基本知识

    1.线程状态 如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态.这个过程 ...

  5. java基础(八)-----深入解析java四种访问权限

    Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: 指的是本类 ...

  6. 《温故而知新》JAVA基础八

    集合接口与泛型 定义: 集合接口会操作一系列相同属性数据的对象类型的数据结构,类似于数组,但是相对于数组来说更显得高端大气 集合的接口分为Collention和Map两大类,不直接操作,而是通过子类的 ...

  7. java基础(八) 深入解析常量池与装拆箱机制

    引言   本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体, ...

  8. Java基础(八)

    IO流 概述与分类 Java中的IO流技术主要用于传输数据.典型的应用场景有:读写本地文件,上传下载文件等.按照数据传输的方向可以分为两种: l  输入流(Input):既让数据进入应用程序中. l  ...

  9. java基础(八)之函数的复写/重写(override)

    复写的意思就是子类对父类的修改. 复写的条件: 1.在具有父子类关系的两个类当中:2.父类和子类各有一个函数,这两个函数的定义保持一致(返回值类型.函数名.参数列表) 还是老样子,3个文件来说明. P ...

  10. java基础知识文章汇总

    将之前的所有关于Java基础知识的随笔,整理成质量较高的十几篇随笔,几乎是好几篇比较零散的随笔合成现在的一篇,自认为还不错. java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规 ...

随机推荐

  1. 如何搭建一个WEB服务器项目(四)—— 实现安卓端图片加载

    使用Glide安卓图片加载库 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出错误,分享宝贵经验.先谢谢 ...

  2. Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序

    使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...

  3. 前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等

    前言 在前后端没有分离的时候,前端开发要么是写静态页面,数据渲染后端来做,要么就是前端的页面和后端的代码刚开始的时候就合并在一起,每次后端代码更新了之后,前端也要更新一下代码,然后重启一下服务,还是比 ...

  4. Angular知识点复习

    Angular第三方UI组件库(github搜“awesome angular ")-----lonic 概述:是一个第三方的适用于移动端App的UI组件库,可以与Angular/React ...

  5. Django之AJAX简单使用

    AJAX简介: AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输 ...

  6. 第四篇:NLP(Natural Language Processing)自然语言处理

    NLP自然语言处理: 百度AI的 NLP自然语言处理python语言--pythonSDK文档: https://ai.baidu.com/docs#/NLP-Python-SDK/top 第三方模块 ...

  7. 取经四人组SQL

    一.表结构与数据 1.create table user1 (id int not null,user_name varchar(20) not null,over varchar(20) defau ...

  8. 系统对 Device Tree Overlays 的支持方式

    问题来源: 野火 iMX 6ULL 开发板资料. https://tutorial.linux.doc.embedfire.com/zh_CN/latest/linux_basis/fire-conf ...

  9. 存储层技术:JDBC、Hibernate、Mybatis三者之间的比较学习

    JDBC     Hibernate Mybatis    (Java  DataBase Connnection) 是通过JAVA访问数据库 对JDBC的轻量封装 像操作对象操作数据库 对SQL的轻 ...

  10. Visual Studio 2019 Professional 激活

    Visual Studio 2019 Professional下载地址>https://visualstudio.microsoft.com/zh-hant/thank-you-download ...