源码

数据结构--ArrayList源码摘要

风格不统一 提交于 2020-01-07 15:01:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ArrayList源码 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { ...... /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. */ private transient E[] elementData; /** * The size of the ArrayList (the number of elements it contains). * * @serial */ private int size; ...... } ArrayList 的底层最重要的两个属性:Object 数组和 size 属性。 ArrayList 的底层数组的调整 add方法--ArrayList源码摘要: public boolean add(E o) { ensureCapacity(size + 1)

JDK源码分析-HashMap

徘徊边缘 提交于 2020-01-07 14:08:55
HashMap包含的KV键值对的数量,也就是我们通常调用Map.size()方法的返回值 1 2 3 public int size() { return size; } 1.1.2 modCount HashMap的结构被修改的次数(包括KV映射数量和内部结构rehash次数),用于判断迭代器梳理中不一致的快速失败。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 abstract class HashIterator { ... final Node<K,V> nextNode() { Node<K,V>[] t; Node<K,V> e = next; if (modCount != expectedModCount) throw new ConcurrentModificationException(); if (e == null) throw new NoSuchElementException(); if ((next = (current = e).next) == null && (t = table) != null) { do {} while (index < t.length && (next = t[index++]) == null); } return e; } ... } 1.1.3 threshold

java 装箱和拆箱

风流意气都作罢 提交于 2020-01-07 13:05:23
每次看到某篇博客里面说要静下心来欣赏源码,我都很感慨,我的耐心没人家好。是真的要静下心来读源码,因为说不定就像作者说的那样 “说不定你就发现了一个优秀的设计呢!!!” 才不久就被同事说了,学知识的时候不要看野史,要看官方。我还是做不到。官方是一定要看的,但是野史还是照样翻,因为我觉得很多野史写的很生动,甚至有滋有味,有声有色,能从作者的言词中感受到人家的认真,不知不觉中能成为自己的榜样。 都是同行,为什么人家就能那么优秀,我要向其学习。 题外话 今天早上在学习公司代码,然后准备学习下MVP框架,于是找了个简单的MVP框架例子,结果在框架中,发现了一个类叫SparseArray的类,秉持着一种遇到问题就深究下去的精神,我就转去看SparseArray相关的知识,结果发现了一片新天地,顺带研究了一番Android里的几个集合类,主要是SparseArray和ArrayMap,然后我就想,Java里不是有了很多集合类了嘛,比如HashMap,TreeMap,ArrayList,LinkList等等,为啥Android还要再弄一个呢,何况Android本身就是基于Java的,于是我又屁颠屁颠去找相关资料,结果,又发现一个小岛(这个应该不是新大陆,额嘿嘿!),这个小岛就是Java装箱和拆箱,,为了弄清楚Android为啥还要专门弄个自己的集合类,于是就有了这篇文章

源码编译安装GO1.6

笑着哭i 提交于 2020-01-07 13:03:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、问题 GO1.6的编译过程需要GO1.4的二进制来实现bootstrap(自举)(简单来说:GO需要GO自身来编译 ) 二、解决方案 从Github的GO仓库镜像来获取GO的源码,首先编译GO1.4(只需要gcc和glibc,不需要GO来编译),使用编译好的GO1.4的二进制来编译GO1.6。 三、步骤 1. 如果之前已经安装过老版本的GO,清除$GOPATH,$GOROOT变量。 2. 安装好Git 3. 安装好gcc和glibc 4. 从源码编译安装GO1.4 cd ~/ git clone git@github.com:golang/go.git cd go git checkout -b 1.4.3 go1.4.3 cd src ./all.bash 5. 复制 ~/go 到 $GOROOT_BOOTSTRAP(默认值是 ~/go1.4) cp -rf ~/go ~/go1.4 6. 从源代码编译安装GO1.6 cd ~/go git clean -dfx git checkout -b 1.6 go1.6 cd src ./all.bash 7. 设置 $GOPATH 以及添加GO二进制路径到 $PATH 来源: oschina 链接: https://my.oschina.net/u

LinkedList源码分析

↘锁芯ラ 提交于 2020-01-07 08:40:27
简介 LinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性; LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法: List list=Collections.synchronizedList(new LinkedList(...)); 内部结构分析 如下图所示: 看完了图之后,我们再看LinkedList类中的一个内部私有类Node就很好理解了: private static class Node<E> { E item;//节点值 Node<E> next;//后继节点 Node<E> prev;//前驱节点 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } 这个类就代表双端链表的节点Node。这个类有三个属性,分别是前驱节点,本节点的值,后继结点。 LinkedList源码分析 构造方法 空构造方法: public LinkedList() { }

Objective-C 源码(五) Associated Objects 的实现原理

孤人 提交于 2020-01-07 08:07:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 原文链接: http://blog.leichunfeng.com/blog/2015/06/26/objective-c-associated-objects-implementation-principle/ 我们知道,在 Objective-C 中可以通过 Category 给一个现有的类添加属性,但是却不能添加实例变量,这似乎成为了 Objective-C 的一个明显短板。然而值得庆幸的是,我们可以通过 Associated Objects 来弥补这一不足。 在阅读本文的过程中,读者需要着重关注以下三个问题: 关联对象被存储在什么地方,是不是存放在被关联对象本身的内存中? 关联对象的五种关联策略有什么区别,有什么坑? 关联对象的生命周期是怎样的,什么时候被释放,什么时候被移除? 与 Associated Objects 相关的函数主要有三个,我们可以在 runtime 源码的 runtime.h 文件中找到它们的声明: OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) OBJC_EXPORT id objc

nginx源码分析——http多阶段处理

帅比萌擦擦* 提交于 2020-01-07 07:56:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 多阶段处理概述 nginx将一个http请求分为顺序的多个处理阶段,前一个阶段的结果会影响后一个阶段的处理。例如,ngx_http_access_module模块根据IP信息拒绝一个用户请求后,本应接着执行的其他HTTP模块将没有机会再处理这个请求。 nginx之所以要把http请求的处理过程分为多个阶段,是因为nginx的模块化设计使得每一个http模块可以仅专注于完成一个独立的、简单的功能,而一个请求的完整处理过程可以由无数个HTTP模块共同合作完成。这种设计有非常好的简单性、可测试性、可扩展性,然而,当多个HTTP模块流水式地处理同一个请求时,单一的顺序是无法满足灵活性需求的,每一个正在处理请求的HTTP模块很难灵活、有效地指定下一个HTTP处理模块时哪一个。而且,不划分处理阶段也会让HTTP请求的完整处理流程难以管理,每一个HTTP模块也很难正确的将自己插入到完整流程的合适位置中。 nginx依据常见的处理流程将处理阶段划分为11个阶段,其中每个处理阶段都可以由任意多个HTTP模块流水式地处理请求。对于这11个处理阶段,有些阶段是必备的,有些阶段是可选的,当然也可以有多个HTTP模块同时介入同一处理阶段。 2. 多阶段处理相关的结构体 阶段的枚举定义 typedef enum { //

nginx源码分析——http处理流程

对着背影说爱祢 提交于 2020-01-07 07:28:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. http处理流程概述 nginx对于http请求处理的大概流程是:接收客户端发起的连接,然后接收并解析http请求行,接收并解析http头部;再根据配置文件nginx.conf找到相关http模块,使这些模块依次合作处理http请求,最后发送http响应并结束http请求。 在整个http请求处理过程中,nginx通过连接的读写事件,以及定时器机制,异步回调完成其处理流程。 2. http新连接的建立 在 事件模块 一文中我们知道,当新连接建立后会回调对应侦听的处理方法。对于http模块,该回调方法为ngx_http_init_connection。在该方法中,主要完成的事情是:设置连接的读事件回调处理方法为ngx_http_wait_request_handler,设置连接的写事件回调处理方法为ngx_http_empty_handler;然后查看读事件是否已经准备好,即连接对应的套接字缓冲区上是否已经接收到用户的请求数据了,如果是,则直接调用ngx_http_wait_request_handler进入下一处理步骤;如果还没有准备好,则对连接的读事件设置定时器,同时将读事件添加到事件驱动中,等待下一次回调处理。 void ngx_http_init_connection(ngx_connection

使用Samba构建工程

大兔子大兔子 提交于 2020-01-07 07:06:40
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在构建工程和调试过程中,按照传统方式(Windows下开发,Linux服务器端编译和运行),需要本地修改代码后,同步至服务器端进行编译并运行。这难免会带来一些麻烦,比如本地修改了却忘了同步或者同步源码文件出错,由此造成调试过程中一些无用功或者莫名其妙的错误。所以最好的方式是,直接在服务器上修改、编译源码并运行可执行程序(前提是你足够牛X)。如果需要在Windows下进行开发(阅读和修改源码),而在Linux服务器端编译和运行,并且不需要同步源码,那么使用Samba可以达到相同的效果。 本文适用于C/C++,对Java可能需要做适当调整,但搭建Samba服务器过程一样。 安装samba Samba是一个能让Linux与Windows互通和共享的软件,非常实用。组成Samba运行的有两个服务,一个是SMB,另一个是NMB。前者必需,后者可选。 SMB是Samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问。 NMB服务是负责解析用的,把Linux系统共享的工作组名称与其IP对应起来,类似DNS。 安装Samba可以在线源安装或者软件包安装。CentOS在线源安装命令如下: $sudo yum install samba

Timer与TimerTask源码阅读杂记

孤街醉人 提交于 2020-01-07 06:49:49
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> TimerTask 实现Runnable接口。可以被Timer调度执行一次或者周期性执行的任务类。位于java.util包内。 实例属性: int state; // 包括VIRGIN、SCHEDULED、EXECUTED、CANCELLED long nextExecutionTime; // 下一次任务执行时刻 long period; // 周期性任务的执行时间间隔 方法: TimerTask() 构造方法 abstract void run() boolean cancel() 取消任务,更改任务状态state为CANCELLED。如果一次性任务还没有被执行或者是周期性任务,返回true。对于一次性任务,如果任务已经处于SCHEDULLED状态但还没 有执行则永远不会被执行。而对于周期性任务,如果任务还没有被调度,则任务将不会被执行;而如果已经在执行,则执行完当前周期,但之后再也不会被执行。 这个方法可以被多次调用,但第二次以及之后的调用没有任何效果。 long scheduledExecutionTime(): 返回本任务将要被执行的时刻,对于周期性任务没有什么意义。 Timer 线程安全的,多个线程可以共享一个Timer实例。 用来调度任务在将来执行一次或者周期性执行的辅助类。