看书的时候难免遇到一些问题, 在查阅清楚后在这里做一个汇总在这里做一个汇总

# 《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. 1字节(8个bit) UTF-8

  2. 2字节(16个bit) UTF-16

  3. 4字节(32个bit) UTF-32

像"A","B","C",1,2,3以及一些常见的中文这类简单的符号,通常用一个码元就可以找到符号所对应的码点,如A的码点是U+0041 码元也是U+0041

而像一些特殊字符:如😁等,通常会通过一定的转换规则,將一个码点转换成两个码元,如😁的码点是U+1f601,但是他的码元有两个,分别是U+d83dU+de01

// 通过码元反编译成字符
System.out.println("\ud83d\ude01");
1
2

# 为什么String设计成final

  1. 实现字符串池,Java中充斥着大量的字符串,也就衍生出字符串池这种技术,设置成final可以保证当前字符串对象引用池中的值不会被其他对象修改

  2. 实现线程安全,并发读是安全的,但是并发写就会出现问题,除非把他设置成不可变的

  3. 保证Hash唯一,以HashSet举例,若HashSet存的是字符串,比如当前HashSet有两个值,分别是"value1"和"value2",HashSet只在插入的时候对值的唯一性做校验,如果此时把"value2"修改成"value1",那么HashSet就会出现两个"value1"从而导致值不唯一

# 面向对象与面向过程

image-20220509161627453

借用书中的一张图,面向过程与面向对象本质都是操作数据

区别:

  1. 面向过程是通过各种各样的算法逻辑直接操作数据库里的数据,而面向对象是將数据库的字段封装到对象内,再基于对象来对数据进行操作

  2. 面向过程基本是针对一个需求来制定,可复用性低,但是执行效率高,而面向过程则是將程序模块化,更加符合人类的思维习惯,代码复用性高,也更易扩展

  3. 因为实现方式的不同,面向过程往往简单直接,适用于小规模问题,如门禁开关等,而面向过程比较适合复杂的程序,如Web开发

# 《OnJava8 基础卷》

# 位运算

# 构造器调用为什么要在最开始

# 对象不使用new生成的特殊的内存是什么内存

# finalize()有什么作用