好长时间没有认真写博客了,过去的一年挺忙的。负责过数据库、线上运维环境、写代码、Code review等等东西挺多。
学习了不少多方面的东西,不过还是需要回归实际、加强内功,方能扛鼎。
去年学习Mysql列举了大纲,书写了一部分。后来进入到工作状态,就没有继续书写。当然其实没有书写的内容部分已经总结到了公司内部的wiki中,或者在工作过程中大半也应用过,也懒得书写下来了。看什么时候又有心情,重新回顾总结一下吧。
下一步的学习计划
数据结构、算法、源代码解读、多线程(哎,学无止境)
为什么先说String呢?
其实绝大部分业务开发过程中String都是最常用的类。常常利用JProfiler这类工具做内存分析时,能看到char[](为什么是char[]在接下来的源码解读中会有提现)能站到70%以上。
类关系图
简要对比
| 差别 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 常量 / 变量 | 常量 | 变量 | 变量 |
| 线程是否安全 | 安全 | 安全 | 非安全 |
| 所在内存区域 | Constant String Pool(常量池) | heap | heap |
| 是否能被继承 | 否 | 否 | 否 |
| 代码行数 | 3157 | 718 | 448 |
| 使用场景 | 在字符串不经常变化的场景 | 在频繁进行字符串运算(如拼接、替换、删除等), 并且运行在多线程环境 |
在频繁进行字符串运算(如拼接、替换、和删除等), 并且运行在单线程的环境 |
| 场景举例 | 常量的声明、少量的变量运算 | XML 解析、HTTP 参数解析和封装 | SQL 语句的拼装、JSON 封装 |
从代码行数来上说String类更大,其中大量的方法重载拓展了篇幅。同时注释文档详细,注释的行文风格常常看到一个简短的定义之后,紧跟一个由that或the引导的定语从句(定语从句一般皆放在被它所修饰的名(代)词之后)。
例:
1 /** 2 * Allocates a new {@code String} that contains characters from a subarray 3 * of the <a href="Character.html#unicode">Unicode code point</a> array 4 * argument. The {@code offset} argument is the index of the first code 5 * point of the subarray and the {@code count} argument specifies the 6 * length of the subarray. The contents of the subarray are converted to 7 * {@code char}s; subsequent modification of the {@code int} array does not 8 * affect the newly created string. 9 **/