00base
本文最后更新于 2021-08-05 11:42:59
Base
接口和抽象类区别
- 抽象类事“类”,接口只是一个“接口”,两者的概念和应用场景不同,这是主要区别
- jdk8接口也可以实现方法,但是不能写构造方法,而抽象类可以写构造方法,这意味着抽象类参与实例化过程
- 抽象类可以定义各种成员变量,并且可以通过自己的非抽象方法进行更改,而接口中的变量全部是
public static final,都是常量 - 接口可以多继承,抽象类只能单继承
编码
ASCII
早期人们用8位二进制来编码英文字母(最前面的一位是0),也就是说,将英文字母和一些常用的字符和这128中二进制0、1串一一对应起来,比如:大写字母“A”所对应的二进制位“01000001”,转换为十六进制为41。
Unicode码
Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“马”的Unicode是U+9A6C。
Unicode就相当于一张表,建立了字符与编号之间的联系
它是一种规定,Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。
UTF-8,UTF-16,UTF-32。(UTF-8、UTF-16、UTF-32……都是 Unicode编码 的一种实现。
UTF-32
这个就是字符所对应编号的整数二进制形式,四个字节,这个就是直接转换。 比如:马的Unicode为:U+9A6C,那么直接转化为二进制,它的表示就为:1001 1010 0110 1100。
注意:转换成二进制后计算机存储的问题。计算机在存储器中排列字节有两种方式:大端法和小端法,大端法就是将高位字节放到底地址处,比如0x1234, 计算机用两个字节存储,一个是高位字节0x12,一个是低位字节0x34,它的存储方式为下

UTF-32用四个字节表示,处理单元为四个字节(一次拿到四个字节进行处理),如果不分大小端的话,那么就会出现解读错误,比如我们一次要处理四个字节 12 34 56 78,这四个字节是表示0x12 34 56 78还是表示0x78 56 34 12 ,不同的解释最终表示的值不一样。
我们可以根据他们高低字节的存储位置来判断他们所代表的含义,所以在编码方式中有 UTF-32BE 和 UTF-32LE ,分别对应大端和小端,来正确地解释多个字节(这里是四个字节)的含义。
UTF-16
UTF-16使用变长字节表示
对于编号在U+0000到U+FFFF的字符(常用字符集),直接用两个字节表示。
编号在 U+10000到U+10FFFF之间的字符,需要用四个字节表示。
同样,UTF-16 也有字节的顺序问题(大小端),所以就有UTF-16BE表示大端,UTF-16LE表示小端。
UTF-8
UTF-8就是使用变长字节表示
- 对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unicode码,因此对于英文字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制位,全部为这个符号的Unicode码 。
- 比如说一个字符的Unicode编码是130,显然按照UTF-8的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是0),所以需要两个字节(n = 2)。
- “马”的Unicode编号是:0x9A6C,整数编号是39532,对应第三个范围(2048 - 65535),其格式为:1110XXXX 10XXXXXX 10XXXXXX,39532 对应的二进制是 1001 1010 0110 1100,将二进制填入进入就为: 11101001 10101001 10101100 。


