虽然学习的路很波折,但是仍然要哭着进步。。。 其实总体来说学习不是一件枯燥的事,尤其是当学习自己所感兴趣的东西的时候,但是难免要忍受一些在享乐时所不用理会的煎熬。。 甚至有时候这些煎熬是十分痛苦的。 所以我在心中有一个奇怪的想法:那就是 哭着进步!
输出一番心情后,接着进入正题。
按照计划,本周应该查看的是charset的源码。 先上图:
依然是,这里并没有贴出所有的依赖以及展现所有的继承关系,否则这里将会是密密麻麻的一片灾区。。 这里挑了一些比较重要的,或者在逻辑实现的时候担当了不可或缺作用的类或者接口。
接着依然是记录自己按照时间间隙所记录的问题吧: 首当其冲的是charset,从图中也能看出来:
这个其实就是用自己蹩脚的英语去翻译了一下官方的权威注释,不一定准确,但一定能有所感悟,尽管这些感悟也不一定正确,但是从哲学上讲它是一种进步。。 事实上如果将自己比喻成小说里武侠的人物话,编码的经验与能力则是所处的等级,而对于修炼的感悟,则是一种潜力。 有很多的感触后面再谈,这里继续:
这里处理了我长久来的疑惑,在众多的场合中,为什么我们有时候用utf8,有时候又是用 utf-8,有时候是UTF-8,或者UTF8. 有心者可能会有这样的思考: 在什么场景下这些可以通用,在什么场景下这些可能会报错,为什么它们可以这样用,那么上面的权威说明很好的解释了这些问题。 需要注意它的标准字符名称都是全大写,并且这个不是java说的,这个是那些个国际组织说的。
这里便已经接触到我们开发中常见的一些编码,并且配有官方权威说明,注意开发中我们不是用编码字符集,而是编码。 二者有着本质的不同。
由于自己的英语问题,有一些地方除了错,比如讲翻译 翻译成了打断,不过好像总体来看还是能看懂的哈哈哈。
这里有两点记录我认为十分重要,其重要性甚至超过语言本身。 一: 对于超过一个字节的流中,会存在大小端一说,相关的解释详细可百度。 二: 一个字符编码集就是一个抽象字符集与数字集的映射,如: ascii编码集,iso编码集,unicode编码集。 这也是后面很多的编码中都需要借助数字来进行相应的逻辑实现。 这里注意图片中的又有些误区:那就是讲编码集写成了编码.继续:
当时看的时候,在这里就特地查了查unicode与utf系列的区别。 是十分必要的。 在知乎上看到的解释那是真的棒。 但是我始终认为自己写的才是自己的(其实学习的本质是传承,如果没有传承,那么整个人类的文明程度将会限制在一个十分狭窄的,可预估的区间内),尽管有很多错误与不足,但是敝帚自珍嘛,没有小菜鸟,哪来的大牛呢。 继续:
这里有两个地方需要注意: 编码依赖于字符编码集,这里出现了两个编码,它们的区别在于,前者是动词,后者是名词(咋这么熟悉呢?? 想起来了,不就是依赖注入中的依赖 为名词,而非动词),看来中华文化博大精深,单词的表意性很强。 二:java编程语言的原生字符编码集是utf-16,在上面的时候了解到,jvm的编码会根据底层操作系统而确定。 所以本身不矛盾。
这里由于看到了万国码的概念和它的一些属性,进行了一些学习上的联想。 因为鄙人以前一直认为语音识别是一个十分高大上的东西,至少对于人类来说确实比较高大上。 但是对计算机来说就有点不够看了。
不知不觉它们的说明已经看完了,这里是对它内部的一些主要方法的查看。 逻辑都很清晰便没有什么记录。
这里比较经典的有一个二级缓存的实现,其逻辑可以类比到系统中,我想对学习还是有一点帮助的。
这里其实是有点神经大条了,因为对整个类的外围关系不是很清楚,当时以为会跟Thread有一个很强的耦合性,特意进行了分析。 但是后面发现它们并不存在耦合关系,毕竟水平有限,当某一天成为了真大牛后,可能会有一个很透彻的认识。
这里是结合上上个二级缓存,它的具体的实现相关的逻辑。
这里的记录有些问题,主要是没有将编码与字符编码集的区别搞清楚。 将就着看吧。
这里是它的一个构造方法。 可以知道这个charset是针对编码的,而非字符编码字符集。 因为在有道词典上输入charset,可以看到中文注释有: 字符,编码。 这就有些迷惑了。
好了自此关于charset记录的所有问题都写写下。 在进行其它类的记录前,插播一下自己的感触就是: 何谓编码?何谓编程? 编程是基于编码的,或者说在更高的层面进行编码。 编程离我们很近,但是编码离我们更近。 脱离开了编码,便没有编程可言。 其实也很容易想明白,编码是将二进制与自然界的实体: 声(声音传输简直不要太频繁),光(图片,文字,视频所有我们在计算机可见的内容),电(高低电平),力(这个不知道有没有),热(跟光有一些关系).它们的本质是能量,也就是编码将二进制与能量联系起来了。 而编程则是将人类与二进制联系起来,二进制在中间做了一个中介者,将我们与能量联系起来了。 从这里可以看出,编码并非是要与计算机通话,我们的本质是与能量通话。 这就是我在Youtube看到的大牛所说过的: Code everything的含义吧!
瞎扯结束,继续:
接下来是其子类:FastCharsetProvider
关于这个类的感想都在图中,接下来是其子类:StandardCharset
可以看到它们有很多很多的别名,所以我们我们充其量用了下大小写,远远不要感到奇怪。
这是它内部的一个实现方式,应该是代理模式吧,oop原则是依赖倒置原则。 错了就算了吧,因为有一些原则跟设计模式本身就不好区分,而且有一些甚至是某种程度的细化。
可以看到该体系分为三个层级,抽象层,抽象实现层,具体细化层。 给它贴一个装饰模式吧。
关于结构这些基本就这些,下一篇具体看相关的编码实现类。