JDK 核心包结构概述(上)

> 所谓无底深渊,下去,也是前程万里。
> ——木心《素履之往》

在研读 JDK 源码之前,让我们先总览 JDK 几个核心包的内容,对 JDK 有个整体把握。

1 java.lang 语言包

提供利用 Java 编程语言进行程序设计的基础类。最重要的类是 Object(类层次结构的根)和 Class(其实例表示正在运行的应用程序中的类)。

把基本类型的值当成一个对象来表示通常很有必要。包装器类 Boolean、Character、Integer、Long、Float 和 Double 就是用于这个目的。例如,一个 Double 类型的对象包含了一个类型为 double 的字段,这表示如果引用某个值,则可以将该值存储在引用类型的变量中。这些类还提供了大量用于转换基值的方法,并支持一些标准方法,比如 equals 和 hashCode。Void 类是一个非实例化的类,它保持一个对表示基本类型 void 的 Class 对象的引用。

类 Math 提供了常用的数学函数,比如正弦、余弦和平方根。类似地,类 String 和 StringBuffer 提供了常用的字符串操作。

类 ClassLoader、Process、Runtime、SecurityManager 和 System 提供了管理类的动态加载、外部进程创建、主机环境查询(比如时间)和安全策略实施等“系统操作”。

类 Throwable 包含了可能由 throw 语句抛出的对象。Throwable 的子类表示错误和异常。

字符编码

java.nio.charset.Charset 类的规范描述了字符编码的命名约定,以及每个 Java 平台实现必须支持的标准编码集。

2 java.util

简介

包含 collection 框架、遗留的 collection 类、事件模型、日期和时间工具、国际化和各种实用的工具类(字符串标记生成器、随机数生成器和位数组)。

限于篇幅和重要性,我们这里只讨论最常用的 collection 容器类库的设计规划。

Java平台包括一个集合框架。集合是代表一组对象的对象(例如经典的Vector类)。集合框架是用于表示和操作集合的统一体系结构,使集合可以独立于实现细节进行操作。
集合框架的主要优点是:

  • 通过提供数据结构和算法来减少编程工作,因此不必自己实现它们
  • 通过提供数据结构和算法的高性能实现来提高性能。因为每个接口的各种实现都是可互换的,所以可以通过切换实现来调整程序
  • 通过建立公共语言来回传递集合,从而在不相关的API之间提供互操作性
  • 通过要求您学习多个临时集合API,减少了学习API所需的工作量
  • 通过不需要生成临时集合API,减少了设计和实现API所需的工作量
  • 通过为集合和用于操作集合的算法提供标准接口,促进软件重用

集合框架包括:

  • Collection接口。表示不同类型的集合,例如set,list和map。这些接口构成了框架的基础
  • 通用实现。集合接口的主要实现
  • 旧版实现。改造了早期版本的Vector和Hashtable的收集类,以实现集合接口
  • 特殊用途的实现。设计用于特殊情况的实现。这些实现显示非标准的性能特征,使用限制或行为
  • 并发实现。专为高度并发使用而设计的实现,下一节具体描述
  • 包装器实现。向其他实现中添加功能,例如同步
  • 便利的实现。集合接口的高性能“微型实现”
  • 抽象实现。集合接口的部分实现可简化自定义实现
  • 算法。对集合执行有用功能的静态方法,例如对列表进行排序
  • 基础设施。为集合接口提供基本支持的接口
  • 数组实用程序。原始类型和引用对象数组的实用程序函数。严格来讲,它不是集合框架的一部分,而是与集合框架同时添加到Java平台,并且依赖于某些相同的基础结构。

集合接口

分为两组。最基本的接口java.util.Collection具有以下子类或接口:

其他集合接口基于java.util.Map,而不是真实的集合。但是,这些接口包含集合视图操作,使它们可以作为集合进行操作。map具有以下子类:

集合接口中的许多修改方法都标记为可选。允许实现不执行这些操作中的一项或多项,如果尝试执行,则会抛出运行时异常(UnsupportedOperationException)。每个实现的文档必须指定支持哪些可选操作。引入了一些术语以帮助该规范:

  • 不支持修改操作(例如添加,删除和清除)的集合称为unmodifiable。非不可修改的集合是modifiable
  • 另外保证不可见Collection对象中的任何更改的集合称为immutable。非不可更改的集合是mutable
    即使元素可以更改,也要保证其大小保持不变的列表称为 fixed-size。非固定大小的列表称为variable-size。
  • 支持快速(通常为固定时间)索引元素访问的列表称为random access列表。不支持快速索引元素访问的列表称为sequential access列表。 RandomAccess标记接口使列表能够公布它们支持随机访问的事实。这使得通用算法在应用于随机或顺序访问列表时,可以更改其行为以提供良好的性能。

一些实现限制了可以存储哪些元素(或在Maps中,键和值)。可能的限制包括要求元素:

  • 属于特定类型
  • 不为空
  • 服从一些任意谓词

尝试添加违反实现限制的元素会导致运行时异常,通常是ClassCastException,IllegalArgumentException或NullPointerException。尝试删除或测试是否存在违反实现限制的元素会导致异常。一些受限制的集合允许这种用法。

集合实现

实现collection接口的类通常以Implementation-style Interface的形式来命名。下表总结了通用实现:

通用实现支持集合接口中的所有可选操作,并且对它们可能包含的元素没有限制。它们是不同步的,但是Collections类包含称为同步包装器的静态工厂,可用于将同步添加到许多未同步的集合中。所有新的实现都有fail-fast迭代器,该迭代器检测无效的并发修改,并且快速而干净地失败(而不是行为异常)。

AbstractCollection,AbstractSet,AbstractList,AbstractSequentialList和AbstractMap类提供了核心集合接口的基本实现,以最大程度地减少实现它们所需的工作量。这些类的API文档精确地描述了每种方法的实现方式,因此,在特定实现的基本操作得以执行的情况下,实现者知道必须重写哪些方法。

并发容器

使用来自多个线程的集合的应用程序必须经过仔细地编程。通常,这称为并发编程。 Java平台包括对并发编程的广泛支持。

集合是如此频繁地使用,以至于各种并发友好接口和集合的实现都包含在API中。这些类型超出了前面讨论的同步包装程序的范围,可提供并发编程中经常需要的功能。

这些并发感知接口可用:

可以使用以下并发感知实现类。

设计目标

主要设计目标是生产一种尺寸更小且更重要的是“概念重量”的API。至关重要的是,新功能与当前的Java程序员似乎并没有太大区别。它必须增加现有设施,而不是更换它们。同时,新的API必须足够强大才能提供先前描述的所有优点。

为了使核心接口的数量保持较小,接口不会尝试捕获诸如可变性,可修改性和可缩放性之类的细微差别。相反,核心接口中的某些调用是可选的,从而使实现可以引发UnsupportedOperationException来指示它们不支持指定的可选操作。集合实现者必须清楚地记录实现支持哪些可选操作。

为了使每个核心接口中的方法数量保持较小,接口仅在满足以下任一条件时才包含方法:

  • 这是真正的基本操作:可以

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java源码模拟面试解析指南 文章被收录于专栏

<p> “挨踢”业行情日益严峻,企业招聘门槛愈来愈高,大厂hc更是少之又少,而Java技术面试普遍对基础知识的掌握考察特别深,大多数同学突击所看的 Java 面试基础知识点根本达不到面试官近乎挑剔的要求。 本专刊针对如今的校招及社招痛点,深入解析 JDK 的核心源码,探究 JDK 的设计精髓及最佳实践,同时以模拟面试的场景切入,让同学们在阅读过程中也能轻松掌握面试技巧。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p>

全部评论

相关推荐

06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务