String, Integer> h = new HashMap<>(33); h.put("one", 1); h.put("two", 2); h.put("three", 3) Integer> lh = new LinkedHashMap<>(33); lh.put("one", 1); lh.put("two", 2); lh.put("three", 3) System.out.println("key:" + key + "value:" + lh.get(key)); } } 输出 key:twovalue:2 key:threevalue:3 key:fourvalue:4 key:onevalue:1 key:onevalue:1 key:twovalue:2 key:threevalue:3 key:fourvalue:4 底层数组结构 参考资料 LinkedHashMap 源码详细分析(JDK1.8) 【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解 本文首发于我的个人博客 http://chaohang.top
好,我们今天认真的讲一下枚举类型,大家肯定都用过,比如这样的 1//定义枚举类型 2enum Day { 3 MONDAY, TUESDAY, WEDNESDAY, 4 THURSDAY, FRIDAY , SATURDAY, SUNDAY 5} 那我们先来看一下他的概念是啥,枚举类型是Java5新增的特性,他是一种特殊的数据类型,是因为他既是一种类(class)类型,又比普通的类型多了写特殊的约束。 2.枚举是什么 我们先编译一个上面写的Day.java文件,然后反编译他,看他编译出来的结果是什么,如下图: ? 如果我们定义一个枚举类型,其实Java替我们做了定义常量这件事情,也就是上图1的区域。区域3,4是由编译器插入的,下面的图借的人家的。 ? 3.阅读源码 我们找到Enum类,看一下他里面有哪些方法,以及各方法的作用。 ? compareTo:比较我的序数与你的序数之间的差别。 equals:比较枚举类型是否相等。
二、Collections源码之大类方法 1.提供不可变集合 2、提供同步的集合 3、类型检查 4.提供空集合或者迭代器 5.提供singleton的集合或者迭代器 三、从源码看其他常用方法 1. (这里描述的多态算法是Java平台提供的可重用功能的一部分。它们都来自Collections类,都采用静态方法的形式,其第一个参数是要执行操作的集合。 Java平台提供的绝大多数算法都对列表实例进行操作,但也有少数算法对任意集合实例进行操作。) 3. reverse(反转) 老样子,看源码: public static void reverse(List<? 旋转(Rotate) 将一个List旋转,假如有个序列列list是[1,2,3,4],调用方法Collections.rotate(list, 1)后,得到list就变成[4,1,2,3],public
iterable接口 整个接口框架关系如下(来自百度百科): [b3fb43166d224f4a5cebf37901f790529822d16e.jpg] iterable接口其实是java集合大家庭的最顶级的接口之一了 [20200212223925.png] 源码如下: // 返回一个内部元素为T类型的迭代器(JDK1.5只有这个接口) Iterator<T> iterator(); // 遍历内部元素,action (ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at IterableTest.iteratorHasNext forEach方法在java8中参数是java.util.function.Consumer,可以称为消费行为或者说动作类型。 以发挥多核时代的处理器性能,java默认在集合框架中提供了一个默认的Spliterator实现,底层也就是Stream.isParallel()实现的,我们可以看一下源码: // stream使用的就是
通过上一篇《Java 并发(2)AbstractQueuedSynchronizer 源码分析之独占模式》的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取 虽然说 AbstractQueuedSynchronizer 源码有一千多行,但是重复的也比较多,所以读者不要刚开始的时候被吓到,只要耐着性子去看慢慢的自然能够渐渐领悟。 就我个人经验来说,阅读 AbstractQueuedSynchronizer 源码有几个比较关键的地方需要弄明白,分别是独占模式和共享模式的区别,结点的等待状态,以及对条件队列的理解。 理解了这些要点那么后续源码的阅读将会轻松很多。 当然这些在《Java 并发(1)AbstractQueuedSynchronizer 源码分析之概要分析》这篇文章里都有详细的介绍,读者可以先去查阅。 3、设置超时时间的获取 //以限定超时时间获取锁(共享模式) public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout)
1.whypython拥有的某些库要比Java强大,也拥有一些比Java更擅长的领域,python可以搭建后端让Java调用接口,但某些时候我们用到的python代码可能并不多也许只有一个算法,此时就需要以下方法了 2.核心依赖毫无疑问【自然是python的Java执行器了】<dependency><groupId>org.python</groupId><artifactId>jython-standalone< /artifactId><version>2.7.0</version></dependency>3.使用3.1类型一【直接执行python代码】public class ExecPythonCode ) { PythonInterpreter interpreter = new PythonInterpreter(); interpreter.exec("a=[5,2,3,9,4,0 ];"); // 此处python语句是3.x版本的语法 interpreter.exec("print(sorted(a));"); // 此处是python
Java实现 1.1 使用add方法首位插入 /** * public class ListNode { * int val; * ListNode next = null ; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.ArrayList next = null; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.ArrayList x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3]
我们接着main的文件,出现了新的函数 其定义和实现在这里 就是一种通用的组件 我们关注的py exe c的实现在这里 头文件所在 这个是引入的这份boot文件 还引入了一个例子 这地方是又是一个判断,如果宏传了 就执行一次线程的初始化 否则取消一切的工作,强行退出。初始化失败 如果说main文件是灵魂,那app_main更是一个灵魂中的灵魂 它将存储器初始化成功,然后开启线程 看不懂了,是我不行。看书去了 我再看C吧,我好菜啊。。。
mybatis梳理 官方入门 数据库表 mybatis配置 demo 源码 SqlSessionFactoryBuilder-官方提示: SqlSessionFactory-官方提示: SqlSession DefaultSqlSession MapperRegistry MapperAnnotationBuilder MapperProxy MapperMethod 官方入门 官方文档: mybatis-3 AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 null); System.out.println("listAll = " + listAll); } } 一个简单的执行流程图 流程图.png 源码 官方文档的后面基本都是在上面demo的基础上进行高级配置的说明,如类型处理器(自定义java与数据库类型) ,插件(比如自定义拦截)等功能; 如果可以跟着敲一遍确实很不错; SqlSessionFactoryBuilder
Java ArrayList 源码 ArrayList 概述 ArrayList 是基于数组实现,是一个动态数组,容量可以自动增长,动态增加内存。 // 3、将数据后移 System.arraycopy(elementData, index, elementData, index + 1, size - index); // = a.length; // 2、确保容量 ensureCapacityInternal(size + numNew); // Increments modCount // 3、 rangeCheckForAdd(index); // 2、暂存数据 Object[] a = c.toArray(); int numNew = a.length; // 3、
HashMap1.2才有,而Hashtable在1.0就已经出现了.HashMap和Hashtable实现原理基本一样,都是通过哈希表实现.而且两者处理冲突的方式也一样,都是通过链表法.下面就详细学习下这个类. 2 源码解析 类总览 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable } public void clear() { Hashtable.this.clear(); } } 3
= 3; System.arraycopy(a, 2, a, 3, 3); a[2]=99; for (int i = 0; i < a.length; java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。 若在多线程环境下使用fail-fast机制的集合,建议使用“java.util.concurrent包下的类”去取代“java.util包下的类”。 import java.util.*; import java.util.concurrent.*; /* * @desc java集合中Fast-Fail的测试程序。 我们先看看Iterator的源码。ArrayList的Iterator是在父类AbstractList.java中实现的。
ArrayList 源码分析 package Note.cistern; import java.util.ArrayList; public class ArrayListDemo { public
Life is not a ridiculous number of life, the meaning of life lies in life itself HashMap源码 散列集 数组和链表可以保持元素插入的顺序 散列集(hash table)可以说是数组与链表的组合, 往散列集中添加元素时,通过hash函数可以得到一个该元素的一个哈希值,Java中哈希值的范围在-2147483648~2147483647之间 不能直接使用hashCode,因为它的范围将近40亿,不可能有这么大的数组空间,所以需要对hashCode值做一定的处理,使之在数组容量范围内,最简单的办法是对数组容量取余,但取余有效率问题,所以Java 就一定存在运算后得到同样索引值的情况,称为哈希碰撞,解决哈希碰撞有两种方法:开放地址法和拉链法 ,开放地址法是指如果当前的数组已经有元素了,就通过别的算法算出一个新位置插入,像python中dict的实现就使用了开放地址法;而Java >> 4); } static int indexFor(int h, int length) { return h & (length-1); } 出于性能的考虑,在获得最终的index时,Java
cleanSomeSlots这个方法在开篇的set方法的源码截图中用红框标注过,也算是我们见过面的方法了。但是expungeStaleEntry方法我们是第一次见到了,那么我们就先来分析它吧。 还是老样子,源码和注释如下所示: 【解释】 以slotToExpunge作为起点进行遍历,如果发现k==null(即:“陈旧”Entry),那么就赋值e.value=null,当前位置的Entry=null 找到新的位置后,把Entry放到新的位置上,即:tab[h]=e; 流程图如下所示: ---- 后面的内容,参见:ThreadLocal源码精讲(4)
spring源码分析3 强烈推介IDEA2020.2破解激活,IntelliJ 下回分解注册beanDefition 原文链接:https://gper.club/articles/7e7e7f7ff3g5bgc4
关注前端达人,与你共同进步 作者:方应杭 链接: https://juejin.im/post/5d977f47e51d4578453274b3 来源:掘金 5号凌晨,尤雨溪公布了 Vue 3 源代码 话不多说,我们趁热对 Vue 3 源码进行一些简要的分析。 如果你还没有阅读过 Composition API RFC,可能无法完全看懂下面的内容。 如果你还没有学习 TypeScript,请尽快学习,否则可能看不懂源码。 另外有件事情说出来可能会让你非常惊讶,Vue 3 的源代码完全没有使用 class 关键字! 源代码扫了一遍,发现其 TypeScript 代码结构清晰,非常好读,于是我写了一篇《Vue 3 源码导读》,点击下方的「阅读原文」即可查看全文。 我没有直接把文章内容复制过来,是因为微信后台的编辑器实在太垃圾啦 :) 强烈推荐大家用假期这段时间把 Vue 3 的源码通看一遍,因为目前的代码结构清晰,而且代码量相对较少。
源码介绍 public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, iMemPointer; audio_track_cblk_t* cblk; status_t status; static const int32_t kMaxCreateAttempts = 3; (mTransfer == TRANSFER_SYNC) || // use case 3: obtain/release mode (mTransfer // return handle to client recordHandle = new RecordHandle(recordTrack); // 包装成binder, 证明了猜想3 a whole notification period (minNotificationsByMs) static const size_t kMinNotifications = 3;
---- 三、 源码解析——execute(Runnable command) 针对与execute方法可以分为四部分来分析,我们下面就针对这四部分,一一去深入解析 第一部分:什么是ctl 第二部分:线程池中的线程数量小于核心线程数的代码逻辑 ---- 后面的内容,参见:源码解析:ThreadPoolExecutor(4)
介绍:重写了一遍扫雷,代码更加规范,修复了一些小bug,优化了部分代码的算法,将各等级英雄榜独立