有趣的问题

本文主要是摘录一些有趣的问题和相关的一些优秀博文。

编码那些事

首先需要理清楚Unicode,UTF-8,UTF-16和UTF-32之间的关系:

  • Unicode:是字符集,不是具体的编码格式
  • UTF-8:变长编码格式,通过一定的规则使用不同个数(1~6)的字节进行编码。
  • UTF-8缩略编码:使用的字节个数相较UTF-8标准编码更少,仅使用1~3个。
  • UTF-16:变长编码格式,通过一定规则使用不同个数(2、4)的字节数进行编码。
  • UTF-32:定长编码格式,使用4个字节进行编码。实现简单,可直接由Unicode码位作为索引,但是由于前导为零(仅表示$2^{21}$个Unicode码位)空间使用率低。

详情参见:
细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4
utf-8缩略编码和标准编码

字节序和位序

字节序:在计算机科学领域中,指电脑内存中或在数字通信链路中,组成多字节的字的字节的排列顺序。

举个例子,字节序就是int类型的4个字节按怎样的顺序存放在内存中。字节序分为大端序(低地址存最高有效字节)和小端序(低地址处存最小有效字节)。字节序受操作系统和PC影响,目前x86和一般的OS(如windows、Linux)使用的是小端序,而MacOS使用的是大端序。另外还需要注意的是,网络传输中一般使用大端序。
位序:一个字节内部各比特位的存放顺序。也分为大端序和小端序,一般和字节序相同,通常情况下我们不需要关心位序。有意思的是,在以太网协议中,虽然高字节先传,但每一字节内低位先传。这个处理过程由网卡负责,在接收端网卡会对每个字节的比特流转换成接收端对应的位序,得到对应的字节值。
详情参见:
字节序
字节序和位序:这篇博客的“小端->大端比特发送示例图”有误

Postman自动获取Cookie

在实际情况中,Postman需要使用Cookie去完成后端交互调试。这时候就需要Postman Interceptor了。
Postman Interceptor是一款Chrome插件,可以拦截Chrome中的Request保存到Postman应用中,也可以将Cookie等保存下来,自动附加在Postman发起的请求上。
详细的安装及说明见:Postman Interceptor使用

Java Stream实现原理

Jdk8提供的Stream处理方式相较于常用的for更加简洁明了,但是其是如何实现的呢?事实上,Stream的核心思想是在一次迭代中尽可能多地执行用户操作,其实现机制在于将每一轮操作都抽象成Stage,并且为所有的操作以Sink接口的形式进行规范,从而能够迭代调用。Stream的实现原理主要有四个方面:

  1. 记录用户操作:使用Stage抽象。
  2. 对用户操作进行叠加:对于无状态操作可叠加。
  3. 叠加后操作执行时机:当结束操作被调用时,即触发真正执行。
  4. 执行结果存储:需要分情况讨论

详细内容可参考深入理解Java Stream流水线

参考资料