一、核心包有哪些?

  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目录下的配置文件中加载子类或者接口的实现类,返回一个实例。

    可以通过配置文件来配置具体实现的类,这样可以具有更好的扩展性。

JDK核心源码的更多相关文章

  1. JDK核心源码(2)

    Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码, jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面 ...

  2. Java内存管理-掌握类加载器的核心源码和设计模式(六)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇文章介绍了类加载器分类以及类加载器的双亲委派模型,让我们能够从整体上对类加载器有 ...

  3. 并发编程之 SynchronousQueue 核心源码分析

    前言 SynchronousQueue 是一个普通用户不怎么常用的队列,通常在创建无界线程池(Executors.newCachedThreadPool())的时候使用,也就是那个非常危险的线程池 ^ ...

  4. 6 手写Java LinkedHashMap 核心源码

    概述 LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少 ...

  5. 3 手写Java HashMap核心源码

    手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...

  6. 2 手写Java LinkedList核心源码

    上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素.在查找需求比较重要的 ...

  7. Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明

    Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明 作者: Grey 原文地址: 博客园:Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明 ...

  8. Android版数据结构与算法(五):LinkedHashMap核心源码彻底分析

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的 ...

  9. iOS 开源库系列 Aspects核心源码分析---面向切面编程之疯狂的 Aspects

    Aspects的源码学习,我学到的有几下几点 Objective-C Runtime 理解OC的消息分发机制 KVO中的指针交换技术 Block 在内存中的数据结构 const 的修饰区别 block ...

随机推荐

  1. python的*args和**kwargs基础用法

    *args表示任何多个无名参数,它是一个tuple **kwargs:传入的字典,就如:a=1,传入键值,默认就传入到**kwargs中,如下面代码: class FOO: def __init__( ...

  2. PhoneGap 介绍

    一.PhoneGap 是什么 1.PhoneGap 是一个用基于 HTML,CSS 和 JavaScript 的,创建移动跨平台移动应用程序的快速开发框架. 2.它使开发者能够利用 iPhone,An ...

  3. redis几种加锁的实现

    1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执 ...

  4. 【vue】饿了么项目-页面骨架开发

    1.页面骨架开发 1.1组件拆分 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没 ...

  5. 32、SpringBoot-整合Dubbo

    分布式应用 在分布式系统中,国内常用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring, Spring Boot+Spring Cloud. 分布式系统: Zook ...

  6. List泛型的应用

    在我看一个源程序的时候看到这个例子使用了IList<T>返回类型,因为上午刚刚总结过List<T>的详细用法,突然出现了IList<T>,感觉很奇怪,于是上网搜集了 ...

  7. windows下使用Git

    如何在windows下使用Git? 通过这里下载Git bash,你就可以像在Linux命令行一样操作git工具. 进入Git bash环境,默认是在当前用户路径下. 在Linux下,我们有根目录,在 ...

  8. selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点

    在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...

  9. mysql存储过程学习(一)

    转载 什么是存储过程,存储过程的作用及优点  mysql存储过程详细教程  mysql 使用存储过程批量插数据 一.存储过程介绍: 存储过程(Stored Procedure)是一组为了完成特定功能的 ...

  10. 用Maven创建动态Web工程

    前言 maven是一个强大的工具.如果你知道如何使用它,你只要付出最小的努力,但可以获得最大的回报.一般来说,maven可以帮助你管理项目,包括管理依赖库.构建工程等. 下面将通过一个简单的教程来描述 ...