JDK核心源码

Jdk的包中,除开了lang包下面的类,用得最多的应该要属于util包下面的类了,

本篇文章主要针对Jdk的util包下面的类(util目录下面的类,暂时不包括util 包下面的子包,子包将在后面继续进行)进行一个总结,

主要是用来帮助大家进行梳理知识,让大家对jdk的代码更加熟悉。

Util包里面主要就是常见的集合类和常见的工具类,集合类就是一些常见的数据结构的实现,工具类就是一些常见的数学、时间、字符串等操作的方法类。

下面先针对集合类来进行分析:

集合类主要分成了三类集合:队列类型、集合类型、哈希类型。

1.队列类型,它是一种线性的数据结构

(1)ArrayList: 底层存储是通过数组进行存储的,所以他可以直接通过数组下标进行访问,所以随机访问速度很快。但是在扩容方面效率很低,他需要把数据进行重新进行拷贝。

(2)LinkedList: 底层是通过链表进行存储的,他不能支持随机访问,只能从头节点或者尾节点进行遍历,增加元素成本很低,不存在拷贝数据的操作。

(3)Vector: 底层存储和ArrayList一样是通过数组进行存储的,但是它的方法是同步操作的,所以说他是线程安全的,性能方面差于ArrayList,扩容方面Vector元素是翻倍,是要多于ArrayList的50%的增长率。

(4)Stack: 是Vector的子类,他是实现栈的操作,只有push、pop、peek几个操作,他也是线程安全的类

(5)ArrayDeque: 底层存储室通过数组进行存储的双端队列,拥有一个头指针和一个尾指针,当头指针和尾指针在同一个位置的时候,会进行翻倍扩容。同时他支持栈和队列的操作,但是不支持随机访问。

(6)PriorityQueue: 默认是基于堆的数据结构进行实现的,默认是可以取到最小的值,如果最小值有多个,则是随机选取,然后可以通过设置Comparator接口进行排序。内部是用数组进行存储的,但是除开第一个元素,后面的元素是没有顺序的。

2.集合类型,它是一种非线性的数据结构,但是集合里面只会保留一个相同的元素

(1)HashSet: 底层通过HashMap进行存储,里面不允许重复的值,是一种最常用的集合类的数据结构

(2)EnumSet: 是一个枚举类型的集合,它里面的元素必须全部来自单个枚举类型,在内部所有元素只占长整型的一位,所以时间和空间性能相当的好。

(3)LinkedHashSet: 它是继承于HashSet的,但是它保证了插入元素的插入顺序,所以能够保证迭代时候的顺序和插入时候的顺序保持一致。

(4)TreeSet: 它是基于树型结构来构造的集合,它底层通过TreeMap来进行存储,又因为TreeMap是基于数据结构里面的红黑树,所以它内部的元素是可以进行排序的。因为结构是树形结构,所以在读取或者写入的速度方面要慢于HashSet。

3.哈希类型,它是一种key-value的结构,可以通过key可以快速定位到value

(1)HashMap: 最常用的Map结构,它是通过数组加链表的形式进行存储的。

(2)EnumMap: 枚举类型的Map结构,它的key是一个枚举类型,它效率要高于HashMap,因为它内部是只有数组进行存储的,可以通过直接定位到具体元素,而不用像上面的HashMap去进行计算,所以效率比HashMap要大大提高。

(3)IdentityHashMap: 它可以保存多个一样值的key,只有当k1==k2的时候才认为是重复的。然后进行查找的时候,也是根据具体的key地址进行查找,而不是通过key的值进行查找的。

(4)LinkedHashMap: 类似于HashMap,但是能够保证迭代时候的顺序和插入时候的顺序保持一致。

(5)TreeMap: 它基于树型结构来存储的,树形结构是基于数据结构里面的红黑树,所以它内部的元素也是可以进行排序的。

(6)HashTable: 它类似于HashMap, 区别就是HashTable是一个线程安全的,同时它的key和value都是不能为null的。

(7)Properties: 继承于HashTable,所以它也是线程安全的,并且可以通过io操作来读取文件里面的内容,来构成Properties对象。

(8)WeakHashMap: 它里面的key都是弱引用的哈希实现,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。某个键被终止时,它对应的键值对也就从映射中有效地移除了。它是通过ReferenceQueue来进行实现的,这个是前面的lang包里面的类。其他方面和HashMap没有差别。

上面总结讲完了util包里面的集合类,下面针对util包里面的工具类进行讲解

1.对象工具类: Objects类主要用于操作单个对象,Arrays类主要用于操作数组对象,Collections类主要用于操作集合类对象。

2.货币工具类: Currency是用于操作各国不同类型的货币的类。

3.时间工具类: Date、Calendar和SimpleTimeZone主要是之前遗留下来的类,但是到了JDK1.8之后,jdk包里面增加了专门处理时间的time包来处理时间操作,所以在JDK1.8之后不建议使用这些老的时间操作类了。

4.字符串工具类: 主要用来进行字符串分割、连接和格式化的操作的类

5.数学工具类: 主要用于进行对于数字类的集合进行操作,计算各种数据(比如最大、最小、平均值、总和等数据)

6.算法工具类: 常用的算法操作封装(随机算法、UUID算法、Base64算法、位图算法等)。

7.定时器类: 完成简单的定时任务的Timer类

8.Optional类: JDK1.8新加的类,主要用于避免空指针而引入的类,能够一定程度解决讨厌的空指针的问题。

9.ServiceLoader类: 它从META-INF/services目录下的配置文件中加载子类或者接口的实现类,返回一个实例。可以通过配置文件来配置具体实现的类,这样可以具有更好的扩展性。

时间: 2024-08-27 06:49:59

JDK核心源码的相关文章

JDK核心源码(2)

Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码, jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面最为基础和常用的几个部分. 1:常用的对象类型包 (1)其中最基础的类为Object,所有的对象都是继承于这个类的.我们知道所有的类如果没有显示的声明继承于哪个类的话,默认都会继承于Object类,这个类里面也有很多我们常用的方法的默认实现. (2)然后就是字符串类了,我们常用的有String.St

Backbone事件机制核心源码(仅包含Events、Model模块)

一.应用场景 为了改善酷版139邮箱的代码结构,引入backbone的事件机制,按照MVC的分层思想搭建酷版云邮局的代码框架.力求在保持酷版轻量级的基础上提高代码的可维护性. 二.遗留问题 1.backbone的升级问题,新的特性无法引入 2.backbone中的潜在BUG,若官方已修复则无法同步更新 解决办法: 关注backbone官网的更新记录. http://github.com/documentcloud/backbone/ 三.核心源码 /** * @裁剪版backbone,仅包含Ev

1 手写ArrayList核心源码

手写ArrayList核心源码 ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue,PriorityQueue等等,我们将手写这些常用的数据结构的核心源码,用尽量少的代码来揭示核心原理. 下面我们来手写ArrayList的核心源码 首先我们定义一个QArrayList,不要问为什么叫QArrayList,因为我之前写过Qt,仅此而已.源码 public class<T> QAr

1小时手写SpringMVC T5大牛带你解读Spring核心源码(附详细视频教程)

SpringMVC简介 SpringMVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高.Spring 3.0更加完善,实现了对Struts 2的超越.现在越来越多的开发团队选择了Spring MVC. Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一 Spring3.0后全面超越Struts2,成为最优秀的MVC框架 Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须

java并发之线程池Executor 核心源码解析

1.什么是线程池 定义:线程池是指管理一组同构工作线程的资源池 组成部分: 线程管理器(ThreadPool):用于创建并管理线程池.包括创建线程池,销毁线程池,添加新任务 工作线程(PoolWorker):线程池中的线程 任务接口(Task):每个任务必须实现的接口,一共工作线程调度任务的执行 任务队列:用于存放没有处理的任务,提供一种缓冲机制 2.为什么要使用线程池 通过重用现有的线程而不是创建新线程,从而减少了线程创建 和 销毁过程中的巨大开销 当请求到达时,工作线程已经存在,不用再等待线

迷你版jQuery——zepto核心源码分析

前言 zepto号称迷你版jQuery,并且成为移动端dom操作库的首选 事实上zepto很多时候只是借用了jQuery的名气,保持了与其基本一致的API,其内部实现早已面目全非! 艾伦分析了jQuery,小钗暂时没有那个本事分析jQuery,这里就恬不知耻说说自己对zepto的源码理解,希望对各位有用 首先zepto的出现其实还是很讨巧的,他看见了巨人jQuery在移动浪潮来临时的转身慢.牵挂多的问题 马上搞出了一套轻量级类jQuery框架代码,核心代码1000行不到,快速占领了移动端的市场,

Java HashMap 核心源码解读

本篇对HashMap实现的源码进行简单的分析. 所使用的HashMap源码的版本信息如下: /* * @(#)HashMap.java 1.73 07/03/13 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ 一.概述 在Java中每一个对象都有一个哈希码,这个值可以通过hashCo

spark内核揭秘-05-SparkContext核心源码解析初体验

SparkContext在获得了一系列的初始化信息后开始创建并启动TaskScheduler实例: 进入createTaskScheduler方法: 我们看一下其Standalone的方式: 在上述代码中首先实例化一个TaskSchedulerImpl: 然后构建出了masterUrls: 接着创建出关键的backend: 进入SparkDeploySchedulerBackend实现: 从以上截图可以看出来,SparkDeploySchedulerBackend核心是为了启动CoarseGra

5 手写Java Stack 核心源码

Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质. 只能在一端进行插入或者删除,即压栈与出栈 栈的实现比较简单,性质也简单.可以用一个数组来实现栈结构. 入栈的时候,只在数组尾部插入 出栈的时候,只在数组尾部删除** 我们来看一下Stack的用法 :如下 public static void main(String[] args){ //新建一个栈 Stack<String> stack = new Stack<>(); /