5.JDK
Java · 28 篇笔记
- 5.1 Cloneablehistorical
1. Cloneable接口是什么 一个标识性接口。实现了这个接口的对象可以调用 Object.clone 方法复制一份当前对象,这里复制的是 属性 2. 什么是对象克隆 将一个对象的属性拷贝到另一个有着相同类类型的对象中去 3. 如何实现对象克隆 3.1. 浅克隆 如果属性是基本类型,拷贝的就是基
- 5.2 Integerhistorical
1. 使用 2. 原理分析 2.1. 构造方法 Integer是不可变的,所谓的不可变是指: - 类使用final修饰 - 内部属性value使用final修饰 - 没有对外提供修改内部属性value的方法 2.2. valueOf方法 2.2.1. 范围正在-128-127的从缓存中取 - Int
- 5.3 ArrayListhistorical
1. 是什么 底层由数组实现的,可扩容的顺序表 有序、可以重复 2. 如何使用 3. 原理分析 3.1. uml 可以看出ArrayList是个List、可克隆、可序列化、可以使用下标访问 3.2. 构造方法 使用object数组,并且初始化长度为0 3.3. add方法 - 不扩容O(1),扩容O
- 5.4 Hashtablehistorical
1. 是什么 线程安全的hashmap 2. 如何使用 3. 原理分析 3.1. uml 可克隆,可序列化,实现了Map接口 3.2. 构造方法 使用链地址法(单链表)解决Hash冲突 初始化容量为11,默认的加载因子为0.75 3.3. put方法 3.3.1. 使用synchronized加锁
- 5.5 Objecthistorical
1. 方法 1.1. getClass 返回对象实例的class对象 1.2. hashCode 当需要使用hash table之类的数据结构时才会使用到这个方法,用来计算在数组中的位置。 当重写了equals方法的时候需要重写hashCode方法,必须保证 a.equals(b) 为true时,
- 5.6 PriorityQueuehistorical
1. PriorityQueue是什么 是一个队列,只不过加上了优先级的概念,换句话说队列里的元素是根据某种规则排好序的 2. 使用 - 输出 3. 源码分析 3.1. 属性 3.2. 有参构造 - initFromCollection 可以看出主要有两个步骤,一个是建立初始化元素到数组中,另一个是
- 5.7 Serializablehistorical
1. 序列化与反序列化 序列化:把内存中的对象以某个格式保存在磁盘中或者在网络上传输 反序列化:把磁盘中保存的或者从网络上传输过来的数据按照某个格式转换成内存中的对象 2. 如何使用 2.1. 实现Serializable接口 2.2. 使用ObjectInputStream、ObjectOutpu
- 5.8 HashSethistorical
1. 是什么 无序、不重复的集合,使用HashMap实现 2. 如何使用 3. 源码分析 3.1. uml 可序列化,可克隆 3.2. 构造方法 3.3. 属性 3.4. add方法 效率为O(1) 3.5. contains方法 效率为O(1) 3.6. remove方法 效率为O(1) 4. 总
- 5.9 Stringhistorical
1. 是什么 不可变、线程安全的字符串 2. 使用 3. 源码分析 3.1. 类的定义 String是不可变的 - 类使用final修饰 - 内部属性char value[]使用final修饰,说明引用不能改变 - 且内部没有对外提供修改内部属性char value[]的方法 3.2. 构造方法 3
- 5.10 LinkedListhistorical
1. 是什么 底层由双向链表实现的顺序表 有序、可以重复 2. 如何使用 3. 原理分析 3.1. uml 可以看出LinkedList是个List、双端队列、可序列化、可克隆 3.2. 构造方法 由头节点、尾节点、长度构成 3.2.1. 队列的节点Node 结构如下图: 3.3. add方法 -
- 5.11 LinkedHashMaphistorical
1. 是什么 - 使用双向链表+HashMap(数组+链表+红黑树)实现 - 相比于HashMap保存了顺序 - 迭代时输出的顺序是 - 按照插入节点的顺序来输出 - 也可以指定成按照访问的顺序输出(LRU) 2. 使用 - 按照插入节点的顺序来输出 - 按照访问的顺序输出 3. 实现 3.1. u
- 5.12 不可变对象historical
如何创建一个不可变对象 - 类使用final修饰 - 内部属性使用final修饰 - 如果是这个属性是引用对象 - 没有对外提供修改内部属性value的方法 - 如果对外返回的是copy过的对象
- 5.13 LinkedHashSethistorical
1. 是什么 2. 如何使用 3. 源码分析 3.1. 1.构造方法 3.2. 2.属性 3.3. 3.其他方法 同LinkedHashMap.md 4. 总结 底层使用LinkedHashMap实现,value使用newObject作为占位符
- 5.14 StringBufferhistorical
1. 是什么 线程安全的、可变字符串 其实就是在StringBuilder的基础上加了synchronized关键字 2. 如何使用 3. 原理分析 3.1. 构造函数 3.2. append方法 3.3. toString 3.4. subString
- 5.16 Map比较historical
1. HashMap1.7 vs HashMap1.8 HashMap1.7 HashMap1.8 ---------------------------- ---------- --------------- 数据结构 数组+链表 数组+链表+红黑树 冲突时链表中是头插法还是尾插法 头插 尾插 -
- 5.18 StringBuilderhistorical
1. 是什么 可变的、线程不安全的字符串 有点像ArrayList的实现,底层使用char数组,不够容量时需要扩容 2. 如何使用 3. 原理分析 3.1. 构造方法 3.2. append方法 直接在内部的char数组后面添加字符 如果容量不够需要扩容,为原来的2倍+2 - AbstractBui
- 5.19 List对比historical
1. ArrayList vs LinkedList ArrayList LinkedList ----------- ---------------------------------------------------- -------------------- 底层实现 数组 双向链表 复杂度
- 5.21 TreeSethistorical
1. 是什么 无序、不重复的集合,使用TreeMap实现 2. 使用 3. 源码分析 3.1. 构造方法 3.2. 属性 3.3. 其他方法 调用的TreeMap的方法,效率O(logN) 4. 总结 底层使用TreeMap实现,value使用newObject作为占位符
- 5.22 String比较historical
1. StringBuilder vs StringBuffer vs String String StringBuffer StringBuilder ----------- ------ ------------ ------------- 是否线程安全 √ √ × 是否可变 × √ √
- 5.23 SynchronizedListhistorical
1. 是什么 线程安全的list 2. 如何使用 3. 源码分析 3.1. synchronizedList方法 3.1.1. 调用SynchronizedList的构造方法 3.1.2. 初始化锁对象为当前正在构造的list 3.2. 其他方法 3.2.1. 使用synchronized代码块加锁
- 5.24 TreeMaphistorical
1. 是什么 基于红黑树(平衡二叉搜索树)实现,效率为O(logN)的key-value对。 迭代时输出的顺序是 - 按照key的自然顺序来遍历的 - 也可以使用自定义的Comparator进行排序 2. 使用 3. 源码分析 3.1. uml 3.2. 构造方法 3.3. put 3.4. get
- 5.25 Vectorhistorical
1. 是什么 线程安全的list 2. 如何使用 3. 源码分析 3.1. uml 可以看出是个List,可以克隆,可以序列化,可以使用下标访问 3.2. 构造方法 默认初始化长度为10,扩容时候的增量为两倍 3.3. add方法 不扩容的时候O(1),扩容O(N) 3.3.1. 加了synchro
- 5.26 fail-fasthistorical
1. fail-fast与fail-safe fail-fast:如果一个系统,当有异常或者错误发生时就立即中断执行,这种设计称之为fail-fast fail-safe:如果一个系统,可以在某种异常或者错误发生时继续执行,不会被中断,这种设计称之为fail-safe 2. Java迭代器的设计 f
- 5.27 JDK1.7historical
1. 问题 1.1. 手写HashMap 1.1.1. Entry 1.1.2. put操作 1.1.3. get操作 1.1.4. remove操作 1.2. 为什么构造函数中需要把capacity转成2的power 跟indexFor计算数组下标有关 不是计算Hash后对table.length
- 5.28 JDK1.8historical
1. 是什么 实现O(1)存取效率的key-value对数据结构 2. 如何使用 3. 原理分析 3.1. uml 可克隆,可序列化,实现了Map 3.2. 构造方法 3.3. put方法 总体伪算法如下: - 计算key的hash值 - 使用hash值&数组长度1计算改数据存放的位置i - tab