StringBuilder是复用好还是new好?

  有时候遇到一些拼接字符串的需求,上一个字符串拼接完了下一个字符串需要再次用到StringBuilder了,此时到底是为了减少memory allocate去复用上一个StringBuilder好还是干脆直接新建一个StringBuilder好呢?

例如有这么一个需求:

1
2
3
4
StringBuilder b = new StringBuilder();
//build up a string
b.delete(0, b.length());
//reuse it

这样在后期代码交接维护的时候会带来疑惑? 这个StringBuilder到底是来干嘛的? 与其话几行的注释去解释为何要这么做, 还不如写一个方法, 来改变这一个StringBuilder的名称(利用final保持引用不改变即可)从而避免遇到这样的问题 :

1
2
3
4
public StringBuilder renameForReuse(StringBuilder sb){
sb.delete(0, sb.length());
return sb;
}

于是乎, 上述的代码可以写成:

1
2
3
4
StringBuilder b1 = new StringBuilder();
//build up a string use b1
StringBuilder b2 = renameForReuse(b1);
//reuse it and rename to b2

这样看起来就清爽多了,也不需要注释因为函数名称足够解释b2是干嘛的了 ;)

虚拟机遇到new指令,发生了什么

从代码 Clazz instance = new Clazz; 编译成class中的new指令,
虚拟机在遇到这个new的指令的时候,具体会去做什么呢?
大概分为了如下几个大的步骤:

* 检验
* 为对象分配内存
* 考虑线程安全问题

而每一个大的步骤下还有很多细节步骤:

Read More

Shell主要的命令笔记

  • cat:

    • 原始用法: cat file1 file2 输出为两个文件的内容的一个合成结果
    1. 接受来自标准输出作为输入流: echo ‘hello i am standard output stream | cat - test1.txt’ 就是把echo出来的内容和test1.txt内容拼接
    2. 看看如何用cat压缩连续的空白行:cat -s file (-s就是把多个连续的空白行只留存一个下来)
    3. 如果想要去掉所有的空白行 则需要添加一个tr命令: cat -s file | tr -s ‘\n’ 这样就可以去掉所有的空白行了。
    4. 输出文件的时候如果想要看看行号在cat 后面添加一个-n即可。
  • rsync命令:
    主要用于一次性大量删除指定文件夹下的所有文件 具体用法:
    先建立一个空白文件夹 blank
    rsync –delete-before -d blank/ 指定删除文件夹文件 即可一次性大量删除文件 同时保留文件夹 虽然也可以rm -R dir 但是还需要重新建立文件夹

  • export命令:
    export是用来设置环境变量参数用的.诸如$HOME,PATH,PDW都是可以使用exprot来修改的.
    例如原来的$HOME => /home/qiansheng 修改为 /home/qiansheng/bin如下:
    export HOME=”$HOME/bin/“即可完成修改环境变量.

  • linux文件的简单操作

    • cat命令一般用户显示 拼接 读取文件.实际能力不止于此.
    • 把一个echo 内容传输到指定的文件内=> echo “hello” > target.txt;如果想要在文件后面追加内容=> echo “world” >> target.txt。如果想要查看文件的内容 => cat target.txt
    • 当我们执行一个命令行的时候,结果太多在终端不好查看.可以直接把结果存放到指定的文件中去: ls > target.txt
  • 使用alias别名命令可以简化命令:

    • 例如在使用apt-get 来安装指定的包需要:sudo apt-get install;我想使用install来代替前者: alias install=”sudo apt-get install” 这样就可以使用install来安装包了。
    • 但是需要注意的是alias设置的别名只是暂时的,如果关闭了terminal在此开启,之前设置的alias就会失效。如果说想要持久话这个别名的话,需要把它添加到~/.bashrc里面去的.=> echo “alias install=’sudo apt-get install’” >> ~/.bashrc
    • 每当一个新的 shell进程生成的时候,都会执行下~/.bashrc的命令。
  • 尝试组合多个命令和工具一起输出;一个命令的输出可以作为另外一个命令的输入(需要使用到管道这个概念);

    • 注意 ‘|’ 这个符号,表示的是“管道”的概念,就是把前面一个命令的输出作为输入源传到下一个命令行里面去.
    • 比如说: ls | cat -n target.txt;=>这个例子就是把ls命令的输出作为了输入数据输入到了target.txt文件中.并且显示行号.
  • find的一些其他的实用搜索技术

    • 根据文件访问/创建/变化时间来进行检索 => find . -type f -amin(访问时间)/-mmin(修改时间)/-cmin(变化时间) +7(超过七分钟) -print
    • 根据文件大小来进行检索的 => find . -type f -size +2k/-2k/2k
    • 删除匹配到的文件=> find . -type f -name “*.java” -delete
  • 某些命令只能接受命令行参数形式接受数据,而无法正常的通过stdin接受数据流,这样我们可以利用xargs命令,它可以把标准的 stdin 转换成特定的命令行参数.

    • 可以将多行输出文本作为单行输出: 假设target.txt是一个多行文本 => cat target.txt | xargs
    • 同样的 把一个单行文本转化成多行文本=> cat target.txt | xargs -n 3
    • 处理标准stdin输出流称为一个规范的输入流=> echo “123a123a123” | xargs -d a 结果就处理成为 123 123 123 .
    • xargs命令就是把前面的命令的输出作为后面命令的输入
  • 精美的小工具tr的实用技巧(translate命令)

    • tr只能接受标准输入流, => tr [options] set1 set2 从set1映射到set2去
    • 加密的简单哪应用 echo “123456” | tr ‘0-9’ ‘9876543210’ =>输出876543 解密就是=> echo “876543” | tr ‘0-9’ ‘9876543210’ => 123456.著名的ROT13加密算法就是基于字母表向右移位13对原文进行加密。
    • 删除输入流内的一些内容: echo “123adbe678” | tr -d ‘0-9’ =>adbe.也就是只需要一个set就可以 相当于一个限定条件。 -d就是删除的options , 当然还有一个-c 它含义是取set的补集.-s也是很有用的一个options,可以指定字符进行压缩string.
    1. tr只能接受来自标准的输入流作为处理对象 不可以接受参数
    2. echo ‘sadjaASJHFKas’ | tr ‘A-Z’ ‘a-z’ 就是把echo输出全部转化成小写 也就是 前面的是需要转换的目标的正则表达式 后者则是目的表达式的正则表达式
    3. 删除指定的字符: 通过参数-d 来指定要删除的对象。
    4. 压缩指定的字符对象: 通过参数-s 来指定需要被压缩的对象.
  • 自动大量生成模版测试文件 例如从0~100.txt:

    1. 采用touch这个命令。它可以生成空白文件,
1
2
3
4
for name in {0..100}.txt
do
touch $name(即使这个name文件存在了 那么就是修改他的时间戳为最新时间)
done
  • 文件统计部分:

    1. wc=>word count.
    2. wc -l(统计行数) -w(统计单词) -c(统计字符数)
  • 使用ssh无密码登录

    1. 实现原理: 基于公钥和私钥加密技术进行自动化认证。想要实现自动化认证,就必须要把客户端的公钥存放到服务器端的中的.ssh/authorized_keys文件中。
    2. 客户端通过ssh-keygen来生成密钥, ssh-keygen -t rsa 生成。生成了一个pb公钥和一个私钥。
    3. 第一次给服务器添加客户端的公钥是需要密码的; ssh ssh_localhost “cat >> ~/.ssh/authorized_keys” < ~/.ssh/id_rsa.pub 就可以实现服务器添加客户端公钥了。
  • 进程管理的一些tips

    1. ps 查看详情加一个-f ||||| -e 是展示所有的进程信息 top 则是按照cpu占用情况来展示进程的信息
  • git的几个tips:

    • 在把修改内容放进了缓存区了的话,stash 然后做完了紧急事儿后需要恢复 那么只需要 git stash pop就可以了同时也删除掉了git stash list的stash缓存信息
    • git push 一般默认的远程的origin默认仓库,所以push 的写法就是指定一个仓库 以及分支 所以格式如下: git push origin(默认仓库) master(默认分支)
    • 有时候pull的时候需要两个分支对应好 不能本地的分支跟远程分支不对应起来git branch –set-upstream dev origin/dev 这样就建立本地分支和远程分支的关联
    • 标签管理: 用的比较少呢。

json反/序列化的优劣势

Json作为业内(web)公认的序列化协议

  • 对于跨平台跨语言的问题解决的很好
  • 可调试性好,在线解析工具支持的比较好。但是作为代价的就是保密性不佳
  • 数据量相比来讲小很多,在传输和解析(同样也depends on解析的代码)的速度上算得上是最优选择
  • 可拓展性好,对于业务频繁的更换,也能随时切换自如
  • json到obj的转化实际上是程序员通过标准化的代码来取代了序列化协议中的IDL文件,而这个文件的作用就是描述每一个属性的信息;然而json的数据就是对应着一个obj的各个属性,所以就省去了IDL compiler的角色了。
  • 不过另外一个问题就是在某些语言中解析Json转化成对应语言中的某种结构的方式有所不同,例如在Java中,解析的方式是通过reflection来实现的,众所皆知反射带来的性能缺失问题,尤其当数据量比较大的时候而且对与数据的实时性要求较高例如ms级别的请求,Json来作为序列化协议就无能为力了,这个时候就可以参考Thrift项目了满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。

flat string -> java model class(POJO):
语法解析 : flat str –> jsonObj(JSONTokener是核心类处理语法解析逻辑)
反射遍历变量 : jsonObj –> POJO(通过传入的class反射遍历变量, 把JSONObject的value一个个填坑到pojo里面)