Java 为什么使用 UTF-16 而不是更节省内存的 UTF-8？有流传说：UTF-16 对于内存非常不友好，UTF-8 更节省内存。
因为这个设计诞生得太早。

那个时候大家都认为 Unicode 只有 16bit 就足够表示，于是 微软的 Windows 内置编码用的是 UCS-2，而 Java 也选择了UCS-2 与 Windows 一致。——于是此时 UCS-2 是定长编码。

后来，众所周知，BMP 已经不够表示 Unicode 了，UCS-2 无法表示，于是就有了 UCS-4，虽然 UCS-4 暂时可以保证定长，但 UCS-4会显得过于浪费内存：所有字符都是四个字节这不浪费吗？

于是，就回到了变长编码。

变长编码是用 UTF-8 还是 UTF-16？显然 UTF-8 有很多优势，因为 UTF-8 在7bit区域跟 ASCII 兼容，而 UTF-16 仅仅只在BMP 区域与 UCS-2 兼容。

当初没有普及 Unicode 的那些体系，就从 ASCII 一步到位过渡到 UTF-8，完美适配。而当初切换到了 UCS-2 的那些软件，要么再切到UCS-4，要么换成 UTF-16（变长编码），很少有回到 UTF-8 的玩法了。

总结，当初用 UCS-2 是因为它定长，而随着 Unicode 字符数量的暴增，UCS-2无法定长，就变成了一个相对鸡肋的编码，为了保持兼容性只能继续存在。

UTF-16除了兼容UCS-2以外并无明显优势，毕竟UTF-16是变长编码，——至于那些没有历史包袱的体系自然会优先选择 UTF-8 。