![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 69
cerish404
代码这条路,你走的越慢,走的就越快!
展开
-
Java 解析 xml 的四种方式的使用篇
在使用框架时,基本上都有 xml 文件的配置,那么又是怎么进行解析的呢?XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。首先定义一个公用的 xml 文件,方便后面讲解。<?xml version="1.0" encoding="UTF-8"?><persons> <person id="1"> <name>lee</name> .原创 2021-01-15 00:29:42 · 142 阅读 · 0 评论 -
Java CountedCompleter 与 ForkJoinTask 的代码篇
在看 ConcurrentHashMap 的源码时,BulkTask extends CountedCompleter,CountedCompleter extends ForkJoinTask,那么我们也按照这个继承顺序,一探究竟。1. invoke 看 ForkJoinTask 的各种状态值原创 2020-12-14 22:57:21 · 189 阅读 · 0 评论 -
java CountedCompleter 源码详解
1. CountedCompleter 的类定义CountedCompleter 继承了 ForkJoinTask,即为一个异步任务public abstract class CountedCompleter<T> extends ForkJoinTask<T> {}1.1 CountedCompleter 的构造函数CountedCompleter 共有三个构造函数protected CountedCompleter(CountedCompleter<?&原创 2020-12-12 00:14:18 · 263 阅读 · 3 评论 -
java 分而治之的框架 ForkJoinTask
Java 提供 Fork/Join 框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务的执行结果得到这个大任务的最终结果。1. ForkJoinTask 的类定义从定义可以看出,ForkJoinTask 实现 Future,Serializable。即 ForkJoinTask 是可异步、可序列化的抽象类任务。public abstract class ForkJoinTask<V> implements Future<V>,.原创 2020-12-11 23:17:55 · 885 阅读 · 0 评论 -
ConcurrentHashMap 源码分析11完结篇之 merge()、treeifyBin()、untreeify()及线程安全
1. size()获取当前map的元素个数public int size() { long n = sumCount(); return ((n < 0L) ? 0 : (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)n);}/* 真正获取元素个数的方法 */final long sumCount() { /* 元素个数 = baseCount + c原创 2020-12-11 00:43:59 · 441 阅读 · 0 评论 -
ConcurrentHashMap 源码分析09函数篇之 reduce 详解
与 forEachTask 类似,new 对应的内部类,执行 invoke() 方法,底层调用 compute() 方法。1. reduce 相关函数public <U> U reduce(long parallelismThreshold, BiFunction<? super K, ? super V, ? extends U> transformer, BiFunction<? sup.原创 2020-12-09 23:59:03 · 711 阅读 · 0 评论 -
ConcurrentHashMap 源码分析08函数篇之 forEach、 search详解
1. forEach(BiConsumer<? super K, ? super V> action)使用 Traverser 类的 advance 方法获取下一元素,遍历直至获取到 nullpublic void forEach(BiConsumer<? super K, ? super V> action) { if(action == null) throw new NullPointerException(); Node<K,V>[] t;原创 2020-12-09 01:44:08 · 2117 阅读 · 0 评论 -
ConcurrentHashMap 源码分析07之函数篇 get、compute方法详解
1. get()public V get(Object key) { Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek; int h = spread(key.hashCode()); // 获得 hash 值 /* tab 不为 null && tab数组长度 > 0 && tab对应桶位不为空 */ if ((tab = table) != null &原创 2020-12-07 23:08:26 · 2504 阅读 · 0 评论 -
ConcurrentHashMap 源码分析06之函数篇 移除方法详解
1. remove移除 key 元素对应的节点/* 两个重载函数,区别在于是否指定元素的value值,底层都是调用 replaceNode */public V remove(Object key) { return replaceNode(key, null, null);}public boolean remove(Object key, Object value) { if(key == null) throw new NullPointerExcepti原创 2020-12-07 00:12:32 · 1260 阅读 · 0 评论 -
ConcurrentHashMap 源码分析05之函数篇 put 详解
前面巨多属性与内部类,看得我云里雾里,结合函数的执行过程,可能就比较容易懂了吧。1. put(K key, V value)指定 key,value,若存在,则替换value值并返回旧值,若不存在,则新建节点值并返回null。public V put(K key, V value) { return putVal(key, value, false);}/* onlyIfAbsent: 若为true,表示旧值不给替换 */final V putVal(K key, V value.原创 2020-12-06 01:28:37 · 297 阅读 · 3 评论 -
ConcurrentHashMap 源码分析04之内部类ReduceTask
1.3.35 ReduceKeysTask@SuppressWarnings("serial")static final class ReduceKeysTask<K,V> extends BulkTask<K,V,K> { final BiFunction<? super K, ? super K, ? extends K> reducer; K result; ReduceKeysTask<K,V> rights, ne原创 2020-12-02 01:19:42 · 273 阅读 · 0 评论 -
ConcurrentHashMap 源码分析03之内部类ForEachTask、SearchTask
1.3.22 BulkTask处理批量任务,众多子类,基本上包含Task的内部类就是其子类abstract static class BulkTask<K,V,R> extends CountedCompleter<R> { Node<K,V>[] tab; // tab 数组 Node<K,V> next; // 下一节点 TableStack<K,V> stack, spare; // 存储信息原创 2020-12-02 01:07:07 · 328 阅读 · 2 评论 -
ConcurrentHashMap 源码分析02之内部类Traverser、View篇
1.3.8 TableStack<K,V>保存当前正在遍历的数组以及索引信息static final class TableStack<K,V> { int length; // 长度 int index; // 索引 Node<K,V>[] tab; // 数组 TableStack<K,V> next; // next 指针}1.3.9 Traverser<K,V>主要用于遍历操作,有Base原创 2020-12-01 22:21:25 · 361 阅读 · 0 评论 -
TreeMap 源码分析04之forEach()、replace()、replaceAll()、buildFromSorted() 及线程安全问题
1. forEach遍历每个节点,执行 action 动作@Overridepublicvoid forEach(BiConsumer<? super K, ? super V> action) { /* null 异常检测 */ Objects.requireNonNull(action); int expectedModCount = modCount; /* 获取第一个节点getFirstEntry(),e 设置为后继节点 successor(e) */原创 2020-11-30 01:24:01 · 422 阅读 · 0 评论 -
TreeMap 源码分析03函数篇之迭代器、子map
1. keySet()、navigableKeySet()key 值集合,底层都是使用 KeySet 集合public Set<K> keySet() { return navigableKeySet();}public NavigableSet<K> navigableKeySet() { KeySet<K> nks = navigableKeySet; return (nks != null) ? nks : (navigableK原创 2020-11-29 23:46:25 · 210 阅读 · 0 评论 -
TreeMap 源码分析02函数篇之添加、获取、导航方法
1. 简单函数系列/* 返回元素个数 */public int size() { return size; }/* 是否包含指定的key */public boolean containsKey(Object key) { return getEntry(key) != null; }/* 是否包含指定的value值,从 getFirstEntry()获取首节点(最小节点)开始 */public boolean containsValue(Object value) { /* 查找 e 的后继原创 2020-11-29 18:11:13 · 266 阅读 · 0 评论 -
TreeMap 源码分析01之类定义、属性、内部类
1原创 2020-11-29 11:21:35 · 163 阅读 · 0 评论 -
ConcurrentHashMap 源码分析01之类定义、属性、内部类
都知道 HashMap 是线程不安全的。那应该怎么解决呢?除了 Collections 工具类实现(底层重要方法加上Synchronize关键字),就是本文的ConcurrentHashMap,采用了粒度更小的片段加锁方式。1. 类的定义虽然名字中也有 HashMap,但是并没有继承 HashMap。ConcurrentHashMap 继承 AbstractMap,实现 ConcurrentMap、Serializable,即表示是一个可序列化的 Mappublic class Concur.原创 2020-11-30 23:03:34 · 130 阅读 · 0 评论 -
LinkedHashMap源码分析03之函数使用及线程安全
1. 函数使用示例package cn.cerish.container.map.linkedHashmap;import java.util.HashMap;import java.util.LinkedHashMap;public class LinkedHashMapTest { public static void main(String[] args) { HashMap<String, Integer> hashMap = new HashMap&原创 2020-11-25 18:13:51 · 2063 阅读 · 0 评论 -
LinkedHashMap源码分析02之函数篇
1. get(Object key)获取指定 key 的 value 值,找不到返回 nullpublic V get(Object key) { /* 获取 key节点,为 null 直接返回 null */ Node<K,V> e; if ((e = getNode(hash(key), key)) == null) return null; /* 不为 null 判断 accessOrder,为true 执行 afterNodeAccess原创 2020-11-25 01:09:27 · 481 阅读 · 0 评论 -
HashMap的扩容因子为什么是0.75?为什么链条长度超过8转化为红黑树?
1. 扩容因子为什么是0.75?static final float DEFAULT_LOAD_FACTOR = 0.75f;源码中给出的解释如下:负载因子是0.75的时候,空间利用率比较高,而且避免了相当多的Hash冲突,使得底层的链表或者是红黑树的高度比较低,提升了空间效率。给出的扩容因子过高,提升了空间占用,但 hash 冲突比较严重,影响查找效率。过低查找效率高,但空间占用低,0.75 是进行多次试验后的最佳均衡点。 /* * <p>As a general rule, t原创 2020-11-24 20:07:27 · 1691 阅读 · 0 评论 -
LinkedHashMap源码分析01之类定义与内部类
有了 HashMap,为什么还要有 LinkedHashMap 呢?细心的人可能注意到,HashMap put 的顺序与输出顺序不一致,LinkedHashMap 刚好解决了这一点。1. 类的定义可以看到,LinkedHashMap 继承了 HashMap,即 HashMap 有的特性,LinkedHashMap 都有。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map&.原创 2020-11-24 20:08:16 · 98 阅读 · 0 评论 -
HashMap 源码分析08之merge()、comparableClassFor()、compareComparables() 及 线程安全问题
1. merge()给定 key、value,若找到 key 对应的节点Node,执行 v = Node.value != null ? remappingFunction.apply(Node.value, value): v,根据 v 是否为 null 判断更新节点还是删除节点找不到 Node 则直接添加新节点(key,value)@Overridepublic V merge(K key, V value, BiFunction<? super V, ? super V,原创 2020-11-23 01:28:57 · 247 阅读 · 0 评论 -
HashMap 源码分析07之compute()、computeIfAbsent()、computeIfPresent()
1. compute指定 key,找到对应的Node节点,执行remappingFunction.apply(key,value),返回新的 value 值,会出现四种情况Node 为 null,value为 null :不用进行操作,返回 valueNode 不为 null,value为 null :删除 Node 节点,返回 valueNode 为 null,value 不为 null :新建节点(key, value),返回 valueNode 不为 null,value 不为 null原创 2020-11-22 11:40:28 · 309 阅读 · 0 评论 -
HashMap 源码分析06之keySet()、values()、entrySet()、forEach()
1. keySet()、values() 、entrySet()获取 keys、values 、entrySet集合,keySet、values 是AbstractMap的变量,entrySet是hashMap 的变量,HashMap继承了AbstractMap,所以HashMap三个变量都能使用源码很简单,变量为null,则new 对应的类型,否则直接返回/* keySet 为 null 就新建一个 */public Set<K> keySet() { Set<K&g原创 2020-11-21 23:04:40 · 380 阅读 · 0 评论 -
HashMap 源码分析05之remove()、clear()、putIfAbsent()、replace()、replaceAll()
1. removeremove 有两个重载函数V remove(Object key):移除指定 key 的元素,删除成功返回 value 值,没找到返回 nullboolean remove(Object key, Object value):移除指定 key 的元素,但对应key节点的value必须与 传入的value值相等,才会进行删除,返回值为 boolean/* 可以看到,两个函数的区别就是 removeNode() 的第四个参数,与返回值类型不同 */public V rem原创 2020-11-21 15:24:22 · 784 阅读 · 0 评论 -
HashMap 源码分析04之get()、getOrDefault()、containsKey()、containsValue()、putAll()
1. 获取元素 get()获取指定 key 值的元素值,找不到返回 null/* 底层调用 getNode() 方法,获取节点,在获取其 value 值 */public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value;}/* hash: key的 hash 值, key: 指定的 key */final Node<K原创 2020-11-21 01:19:52 · 549 阅读 · 0 评论 -
HashMap 源码分析02之内部类红黑树TreeNode
1. 内部类TreeNodeTreeNode 继承了LinkedHashMap.Entry,而 Node 继承 Map.Entry,注意LinkedHashMap 继承 HashMap,即 TreeNode 也可以使用 Node 节点的属性TreeNode 就是一颗红黑树,把它啃下,升职加薪稳了。static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { TreeNode<K,V>原创 2020-11-19 00:01:13 · 411 阅读 · 1 评论 -
HashMap 源码分析03之put()、resize()、treeifyBin()
HashMap 的重要函数理解1.1 put(K key, V value)添加一个键值对/* 底层调用 putVal */public V put(K key, V value) { return putVal(hash(key), key, value, false, true);}/* param1: key的hash值,param2: 添加节点的key值,param3: 添加节点的value值, param4: 替换时是否保留原有值,即不给替换,默认为false,可以原创 2020-11-20 01:14:36 · 194 阅读 · 0 评论 -
HashMap 源码分析01之构造函数、属性、内部类
作为面试必问的 HashMap,是学习集合的重中之重,也是最难的一个。1. HashMap 的类定义继承 抽象map,实现Map 接口,可复制,可克隆public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable1.1 HashMap 的构造方法HashMap 有 4 个构造方法,分别可用于指定加载因子,初始容量,初.原创 2020-11-18 00:58:30 · 647 阅读 · 0 评论 -
HashSet 源码分析及线程安全问题
Set 集合最常见的实现类就是 HashSet,就以它为例来讲。1. HashSet 的定义详解定义很简单,继承抽象set,实现接口Set,可复制、可序列化public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable1.1 HashSet 的构造函数HashSet 有五个构造函数,可以指定初始集合,初始.原创 2020-11-24 14:10:46 · 2121 阅读 · 2 评论 -
Java 之 Type类型详解
1. 源码看定义1.1 Type 接口Type 是 reflect 反射包下的一个接口,Java语言中所有类型的公共接口。/** * Type is the common superinterface for all types in the Java * programming language. These include raw types, parameterized types, * array types, type variables and primitive types.原创 2020-11-23 01:26:45 · 977 阅读 · 0 评论 -
Java 构建 HashCode 相同的字符串
在查看 hashcode 源码的时候,想模拟红黑树的生成,发现不知如何构建 HashCode 相同的值。从源码看HashCode 的生成(jdk1.8 为例)都知道 Object 有一个通用的 hashcode() 方法,但该方法被 native 修饰,无从下手public native int hashCode();再来看 String 类重写的 hashCode()public int hashCode() { int h = hash; // 计算过 hash,直接取值.原创 2020-11-20 18:17:34 · 1826 阅读 · 2 评论 -
探索红黑树插入和删除的平衡原理
相信在看这篇文章的时候,你已经清楚普通的二叉树。废话不多说,直接开始!红黑树的性质原创 2020-11-20 01:13:13 · 431 阅读 · 5 评论 -
Spliterator 源码详解
最近在看集合的源码,发现底层基本都使用了 Spliterator(分解迭代器)。在此之前,对 Spliterator 并不了解,今天照着源码,系统的认识一遍。Spliterator 的定义详解Spliterator 是 java.lang.util 包下的一个接口,官方对 Spliterator 的解释如下:用于遍历与分解资源的对象。资源可以是数组,IO通道,或者生成器函数。分解器 Spliterator 可用于执行单个元素 tryAdvance() 或者按顺序批量执行forEachRe.原创 2020-11-17 23:40:40 · 342 阅读 · 2 评论 -
LinkedList 源码分析03之函数使用与线程安全问题
1. element()、contains()、indexOf()、lastIndexOf()、set()、push()E element() :获取第一个元素,调用 getFirst();boolean contains(Object o):是否包含某个元素,底层调用 indexOf(o) 来判断int indexOf(Object o):前序循环遍历查找元素,找到返回下标,找不到返回 -1int lastIndexOf(Object o):后序循环遍历查找元素,找到返回下标,找不到返回 -1原创 2020-11-16 19:15:33 · 303 阅读 · 0 评论 -
LinkedList 源码分析02之remove()、iterator()
1. 删除类1.1原创 2020-11-16 13:27:54 · 465 阅读 · 2 评论 -
LinkedList 源码分析01之获取元素详解
1. LinkedList 定义详解从类定义可知 ,LinkedList 是一个 按顺序的列表,同时还是一个队列,并且可复制,可序列化public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable1.1 LinkedList 的构造函数LinkedL原创 2020-11-15 16:39:35 · 773 阅读 · 0 评论 -
ArrayList 源码分析02之iterator()、forEach()遍历注意点
1 遍历迭代器 iterator()1.1 Iterator< E > iterator()iterator() 返回一个通用的遍历迭代器 new Itr(),只有四个对外的方法/* 直接返回一个遍历器 */public Iterator<E> iterator() { return new Itr();}/* Itr 实现 Iterator 遍历器 */private class Itr implements Iterator<E> {原创 2020-11-14 20:57:35 · 354 阅读 · 0 评论 -
ArrayList 源码分析03之函数使用与线程安全问题
1. sort()、trimToSize()、clear()、clone()import java.lang.reflect.Field;import java.util.ArrayList;public class ArrayTest01 { public static void main(String[] args) throws Exception { ArrayList<Integer> arrayList = new ArrayList<>(原创 2020-11-14 01:42:26 · 111 阅读 · 0 评论