`
Rss 文章列表
简单动态字符串: 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 ...
插入排序分两种: 1.直接插入排序 直接插入排序默认一个已经有序的集合,然后把待排节点插入到这个有序集合中去. /**      * 直接插入算法:      * 思路:将一个元素插入到一个已经有序的集合中去.      * 最好的情况是:O(n).      * 最坏的情况是:O(n ^ 2).      * 稳定算法.      * 使用:当 n 很小的时候,适用,当 n 很大的时候,则不宜采用该算法.      */     @Test     public void testDirectInsertSort(){         int[] arr = {4,2,5,1,2,9,8,3, ...

MySQL 基础知识

1.MySQL 体系结构: 最上层的 JDBC 相当于一个抽象,针对不同的数据库,编写同样的数据库连接代码,可以连接不同的数据库,例如(MySQL/Oracle/Sybase等) 连接池 然后是在插件化的存储引擎之上的定义语言,解析器,优化器,缓存等. 插件化的存储引擎 文件系统 + 日志 2.存储引擎: InnoDB: 支持事务,行锁设计、支持外键、默认读不会产生锁 MyISAM: 不支持事务,表锁设计,支持全文索引,MyISAM 的缓冲池只缓存索引文件 NDB: 数据全部放在内存中,用于集群 Memory: 将表中的数据放在内存中,如果重启或崩溃,数据丢失,默认使用哈希索引,只支持表锁 Ar ...
Global site tag (gtag.js) - Google Analytics