一、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. 修改jupyter默认保存文件的目录

    1.打开 Anaconda Prompt输入命令 jupyter notebook --generate-config 2.可以看到生成了目录及jupyter notebook的配置文件,打开该文件. ...

  2. 一文带你学会国产加密算法SM4的vue实现方案

    前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案.没有看过的小伙伴可以看一下这篇文章. https://www.cnblogs.com/jichi/p/12907453.html 本篇 ...

  3. flex布局学习总结--阮一峰

    基本概念:   采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器".它的所有子元素自动成为容器成员,称为 Flex 项目(flex it ...

  4. 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理

    什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...

  5. spark机器学习从0到1支持向量机SVM(五)

        分类 分类旨在将项目分为不同类别. 最常见的分类类型是二元分类,其中有两类,通常分别为正数和负数. 如果有两个以上的类别,则称为多类分类. spark.mllib支持两种线性分类方法:线性支持 ...

  6. 【Java_SSM】(三)maven中的配置文件setting的配置

    这篇博文我们介绍两方面:如何修改setting.xml文件及相应配置(本文maven版本为3.5.0) (1)首先打开maven文件目录--conf,会看见如下目录 (2)复制setting.xml文 ...

  7. 项目中 SimpleDateFormat 的正确使用

    项目中 SimpleDateFormat 的正确使用 日常开发中,我们经常需要使用时间相关类,说到时间相关类,想必大家对 SimpleDateFormat 并不陌生.主要是用它进行时间的格式化输出和解 ...

  8. 才华能力出众的ReentrantLock

    主要内容 1. synchronized介绍 2. ReentrantLock介绍 3. ReentrantLock和synchronized的可伸缩性比较 4. Condition变量 5. Ree ...

  9. AD17无法复制原理图到Word的解决方法

    标题: 解决AD17无法复制原理图到WORD 作者: 梦幻之心星 347369787@QQ.com 标签: [AD, Word, 原理图] 目录: 软件 日期: 2019-3-17 目录 前提说明: ...

  10. Python之TestLink篇

    如何让时间变慢? 你们不知道吧,这个时候翻开书,时间又变慢了一倍,可以这样延年益寿,哈哈哈 ------------------------------------------------------ ...