看书的时候难免遇到一些问题, 在查阅清楚后在这里做一个汇总在这里做一个汇总
# 《Java核心技术 卷一》
# 什么是码点与码元
# 字符集
文字与符合统称为字符,所有字符的总称就是字符集,常见的字符集有ASCII、Unicode、GB18030等
字符集一般可以由一张或者多张表组成,每张表又是以二维表的形式存储,有X和Y轴
# 码点(Code Point)
字符集中X与Y的坐标就代表一个码点,通常来讲,码点值等同于字符编码,但并不是每一个码点都有与之对应的某个字符,还是存在着非字符码点和保留码点
以Unicode字符集为例.码点值的书写方式为U+四位十六进制数或者五位十六进制数(特殊字符),例如A的码点值是0041,写作U+0041,😁的码点是1f601,写作U+1f601
所有码点数量的总和,称之为编号空间(Code Space),随着Unicode添加的字符数越来越大,Unicode將字符按照类别分成了17个平面(Plane),每个平面存放的码点数为2^16,也就说Unicode的编码空间为为17*2^16=1114112
# 码元(Code Unit)
码元是存储符号的最小单位,一个码点通常由一个或者多个码元来构成
常见的码元与其对应的常见的编码格式为
1字节(8个bit) UTF-8
2字节(16个bit) UTF-16
4字节(32个bit) UTF-32
像"A","B","C",1,2,3以及一些常见的中文这类简单的符号,通常用一个码元就可以找到符号所对应的码点,如A的码点是U+0041 码元也是U+0041
而像一些特殊字符:如😁等,通常会通过一定的转换规则,將一个码点转换成两个码元,如😁的码点是U+1f601,但是他的码元有两个,分别是U+d83d与U+de01
// 通过码元反编译成字符
System.out.println("\ud83d\ude01");
2
# 为什么String设计成final
实现字符串池,Java中充斥着大量的字符串,也就衍生出字符串池这种技术,设置成final可以保证当前字符串对象引用池中的值不会被其他对象修改
实现线程安全,并发读是安全的,但是并发写就会出现问题,除非把他设置成不可变的
保证Hash唯一,以HashSet举例,若HashSet存的是字符串,比如当前HashSet有两个值,分别是"value1"和"value2",HashSet只在插入的时候对值的唯一性做校验,如果此时把"value2"修改成"value1",那么HashSet就会出现两个"value1"从而导致值不唯一
# 面向对象与面向过程
借用书中的一张图,面向过程与面向对象本质都是操作数据
区别:
面向过程是通过各种各样的算法逻辑直接操作数据库里的数据,而面向对象是將数据库的字段封装到对象内,再基于对象来对数据进行操作
面向过程基本是针对一个需求来制定,可复用性低,但是执行效率高,而面向过程则是將程序模块化,更加符合人类的思维习惯,代码复用性高,也更易扩展
因为实现方式的不同,面向过程往往简单直接,适用于小规模问题,如门禁开关等,而面向过程比较适合复杂的程序,如Web开发