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目录下的配置文件中加载子类或者接口的实现类,返回一个实例。
可以通过配置文件来配置具体实现的类,这样可以具有更好的扩展性。
我向往的自由是通过勤奋和努力实现更广阔的人生,那样的自由才是珍贵的、有价值的。
我相信一万小时定律,我从来不相信天上掉馅饼的灵感和坐等的成就。
做一个自由又自律的人,靠势必实现的决心认真地活着。