`
Rss 文章列表
啥都是虚的,早上这个可能是好的,晚上可能就坏了。平淡处之。
发展: BIO -> NIO -> AIO BIO就是我们传统意义上的IO,它的特点是阻塞的。例如以前我们进行网络编程时,一个客户端使用一个线程来进行处理。这样会导致一个问题:服务器的线程数是有限制的,而不是每个客户端时时都有数据进行传输的。所以大量空的线程占了位置,但是又不工作,导致服务器的性能受限。 这会涉及到4次上下文切换和4次拷贝。 第一次切换:从用户态切换到内核态,将数据读取到内核 第二次切换:从内核态切换到用户态,读取返回 第三次切换:从用户态切换到内核态,将数据拷贝到内核 第四次切换:从内核态切换到用户态,写完返回 四次拷贝: 1.通过DMA将数据从硬件拷贝到内核 2. ...
简单动态字符串: struct{    int len    int free    char buf[]; } 简单动态字符串比 C 中字符串的优点: 1.可以很快的获取字符串的长度 2.在进行字符串操作时,防止溢出 3.减少修改字符串时带来的频繁内存分配 链表: struct listNode{     listNode * prev;     listNode * next;     void * value; } typedef struct list{     // 表头节点     listNode * head;     // 表尾节点     listNode * tail;   ...
说明:Byte 类的实现,有一部分方法是借助于 Integer 类的实现. /* * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package jdk.java.lang; /** * * The {@code Byt ...
在 Java 中字符串的执行速度是 StringBuilder > StringBuffer > String 了? 我们先说下 StringBuilder 和 StringBuffer 这两个类. 首先这两个类都是继承的 AbstractStringBuilder. 我们可以看到 AbstractStringBuilder 中使用 char[] 数组来存储字符. 换句话说,AbstractStringBuilder 相当于一个 ArrayList,不过的是 AbstractStringBuilder 只存储字符. 这和 String 的区别是,当一个字符串被频繁的修改的时候,Abs ...
看了 Boolean  的源码设计,我觉得有三个核心. 1.首先 Boolean 是基本数据类型 boolean 的一个包装类,将其封装成对象. 2.是关于 String 和 Boolean、boolean 之间的转换问题. 3.Boolean用于散列表时的 hashCode 的计算.
首先说下 redis 的数据库结构: redisServer{   redisDb *db // 存放服务器中所有的数据库   int dbnum // 服务器的数据库数量 } 默认情况下,dbnum 为 16. redisClient{   redisDb *db // 记录客户端当前正在使用的数据库 } redisDb{   dict *dict // 数据库键空间,保存数据库中所有的键值对 } 可以这么理解:dict 和 Java 中的 Map 很像,k 是一个字符串,value 可以是 StringObject,也可以是 HashObject等. 数据库原来的数据结构: dict 新增: ...
说明:这段代码很有意思,它考虑到了 Unicode 的情况,我们如何写反转的话,两头循环,然后交换. 但是这只做了第一步,而 JDK源码中,它考虑到了还原 Unicode 的情况. /**      * 导致此字符序列被序列的反序替换. 如果序列中包含任何代理对,则将这些代理对视为反向操作的单个字符.      * 因此,高低代理人的顺序永远不会逆转.(也就是说,这个方法将代码点当成了一个整体.)      *      * 在执行 reverse 方法之前,让 n 成为此字符序列的字符长度(不是 char 值中的长度).      * 然后,新字符序列中索引 k 处的字符等于旧字符序列中索引 ...
http请求报文格式: 请求方法 空格 URL 协议版本 回车 换行 头部字段名称:值 回车 换行 头部字段名称:值 回车 换行 空行 请求体 http响应报文格式: 协议版本 空格 状态码 空格 状态码描述 回车 换行 头部字段名称:值 回车 换行 头部字段名称:值 回车 换行 空行 响应体
java 守护线程: 只要 JVM 中尚存一个非守护线程(用户线程),守护线程就工作,例如(GC).当所有的非守护线程退出的时候,守护线程随同 JVM 一起停止工作. 守护进程: 脱离控制台在后台运行的进程. 孤儿进程: 没有父进程的子进程,子进程又 init 接管回收 僵尸进程: 当父进程开启了一个子进程的时候,子进程先于父进程结束,此时,父进程由于忙而没有调用 wait 方法,此时可以用 ps 查看到子进程显示 Z(僵尸进程).
二叉查找树(又:二叉排序树) 一颗m阶二叉查找树应具备如下特征: 1.若左子树不为空,那么左子树的关键字应比根节点小 2.若右子树不为空,那么右子树的关键字应比根节点大 3.左子树和右子树都为二叉查找树 平衡二叉树(又:AVL 树) 1.左子树和右子树的深度查的绝对值 <= 1 B-树 B-树的关键是:指针+关键字+地址 一颗 m 阶的 B- 树具备如下特征: 1.所有节点最多 m 颗子树 2.若根节点不为空,则至少2颗子树 3.除根节点之外的所有非终端节点最少 (m/2)向上取整颗子树. B+树 一颗 m 阶 B+ 树和一颗 m 阶 B- 树的差异: 1.只有指针和关键字了 2. ...
String 类在 Java 开发中是用到的最常见的类之一,今天说一说 String 类的 lastIndexOf 方法. 这个方法给我很奇怪的是 fromIndex 的取值. 用过 String 类 indexOf 方法的都知道,fromIndex 是从 0 开始的,比如说: 有一个字符串: String str = "helloworld"; str.indexOf("ow", 1) 是可以在 str 中匹配到的. 但是 str.lastIndexOf("ow", 1) 能匹配到吗? 给我们的感觉是不是能匹配到,从 1 开始嘛,然后 ...

堆排序

堆排序思路:建立大根堆或小根堆,然后堆顶就是有序的,将堆顶和数组的最后一个元素对调位置,那么最后一个元素就是最大的元素,然后调整堆,将堆顶元素和数组倒数第二个元素对调位置,以此类推,重复,就能得到排序序列了. 实现: /**      * 堆排序.      * 思路:第一步建立大根堆.      */     @Test     public void testHeapSort(){         int[] arr = {4,2,5,1,2,9,8,3,5,6,2,8};         // 从最后一个非叶子节点开始进行调整.         for(int i=arr.length/2 ...
外部排序:需要对超出内存容量的待排序列进行排序. 怎么做了?采用局部有序,最后合并,序列化到磁盘上. 比如说:待排序列有 10M 大小,而内存只有 1M. 现在怎么做了? 1.将 10M 大的待排序列分成10块,每块1M,先对每个 1M的数据进行排序. 2.将排序后的两个1M数据读一个就比较一个,写到缓冲区去,当缓冲容量到 1M时序列化到磁盘上,然后继续比较,以此类推,最终就可以将待排序列排序好.
希尔排序思路概括来说是:分组 + 插入排序. /**      * 希尔排序      * 思路:希尔排序,是缩小增量排序, 需要分组. 对每个分组实行直接插入排序.      * 最好的情况:O(nlog2n)      * 最坏的情况:O(n ^ 2)      * 不稳定      * 使用情况:中等大小规模      */     @Test     public void testShellSort(){         int[] arr = {4,2,5,1,2,9,8,3,5,6,2,8};         // 分组 + 直接插入排序.         for(int i=a ...
Global site tag (gtag.js) - Google Analytics