12.九号公司
12.1.StringBuffer和StringBuilder的底层数据结构
String在jdk1.8和StringBuilder以及StringBuffer都是以char[]实现,String在jdk1.9后是使用byte数组实现。
12.2 Bean如何在IOC中创建
- 加载xml文件
- 扫描注解
- 配置类中使用@Bean注解
- 使用BeanFactory的静态或实例方法
12.3 打破类加载的方法
- 继承ClassLoader类重写loadClass方法:可以选择不委托给父类加载器,而是直接尝试自己加载类,或者改变委派的逻辑顺序。
- 重写findClass()方法(推荐):loadClass(保留了双亲委派),而findClass实现自己的类查找逻辑。
- 使用线程上下文类加载器:涉及插件或服务提供者框架时,会使用线程上下文类加载器来加载类,这允许类加载的请求绕过默认的双亲委派规则,直接由特定的类加载器处理。
- 利用JNI:直接在本地代码层面加载类,绕过Java类加载机制。
- 自定义类加载层级
12.4 三种类加载器
Bootstrap:加载jre/lib文件夹下的文件
Extension:加载jre/lib/ext文件夹下的文件
Applocatin:一般加载类使用的加载器
12.5 类加载过程
验证:验证Class文件的安全性和正确性
准备:为类变量进行内存分配和初始化零值
解析:将常量池的符号引用(编译时生成,描述目标在类层次结构中的一个位置,如类、接口、方法、字段)转换为直接引用(内存中的实际位置)
12.6 为什么float与double进行运算会损失精度,而bigdicimal不会,其不会损失精度的原因在哪
因为计算机是基于二进制计算的,但是BigDecimal是基于十进制的字符串形式存储数字,它可以直接以十进制进行数字计算,无需像float
和double
那样转换为二进制表示,从而避免了二进制表示十进制小数时产生的不可精确表示的问题。
12.7 泛型中T与?的区别
T
- T表示类型占位符,代表某种未知的具体类型。
- T可以用于修饰类、方法和参数
?
- ?表示通配符,代表“某种未知”,表示属于某一类型(任何类型)
- ?接收多种类型的参数,尤其是在不需要知道确切类型或者要表示类型灵活性的场景中
- 有两种主要的通配符形式:无界通配符
?
(表示可以是任何类型)和有界通配符? extends SomeType
或? super SomeType
,分别表示“某种未知的继承自SomeType
的类型”或“某种未知的SomeType
的超类型”。 - 与
T
不同,?
不能作为类或方法的类型参数直接使用,主要用于参数传递、返回类型或者局部变量声明,以提供更大的灵活性或限制类型参数的使用方式。
12.8 聚簇索引与主键索引的区别?
-
定义与作用:
- 主键索引:是一种唯一性索引,其目的是确保表中每一行数据都有一个唯一的标识符。主键可以是单一列或组合列,并且要求值唯一且非空(NULL)。
- 聚簇索引:是一种数据存储方式,它决定了表中数据行的物理存储顺序。在聚簇索引中,数据行按照索引列的值排序存储,使得索引的叶节点直接包含表的数据行。因此,对于给定的索引列值,查找操作可以迅速定位到实际的数据行。
-
关系:
- 在许多数据库系统中,尤其是MySQL的InnoDB存储引擎,默认情况下,如果一个表定义了主键,那么这个主键就是作为聚簇索引的。这意味着主键索引和聚簇索引在物理存储布局上是一致的。
- 如果表没有定义主键,InnoDB会尝试使用第一个唯一非空索引作为聚簇索引。如果连这样的索引都没有,InnoDB会自动创建一个隐藏的主键并用它作为聚簇索引。
-
区别:
- 适用性:主键索引强调数据的唯一性和标识性,而聚簇索引关注的是数据的物理存储和访问效率。
- 唯一性:主键索引要求索引列的值必须唯一,而聚簇索引则不一定要求唯一性,虽然实践中常见的做法是用唯一性的列(如主键)作为聚簇索引。
- 数据存储:聚簇索引直接影响数据的物理排列,而主键索引则不一定,它可以是聚簇索引也可以是非聚簇索引(尽管在InnoDB中通常主键索引就是聚簇索引)。
- 数量限制:一个表只能有一个聚簇索引,但可以有多个非聚簇索引(包括主键索引,如果主键不是聚簇索引的话)。
总的来说,主键索引和聚簇索引在概念上是不同的,但实际应用中,特别是在InnoDB引擎下,主键索引常常被实现为聚簇索引,从而影响了数据的存储和访问方式。