12.九号公司

12.1.StringBuffer和StringBuilder的底层数据结构

  String在jdk1.8和StringBuilder以及StringBuffer都是以char[]实现,String在jdk1.9后是使用byte数组实现。

12.2 Bean如何在IOC中创建

  1. 加载xml文件
  2. 扫描注解
  3. 配置类中使用@Bean注解
  4. 使用BeanFactory的静态或实例方法

12.3 打破类加载的方法

  1. 继承ClassLoader类重写loadClass方法:可以选择不委托给父类加载器,而是直接尝试自己加载类,或者改变委派的逻辑顺序
  2. 重写findClass()方法(推荐):loadClass(保留了双亲委派),而findClass实现自己的类查找逻辑
  3. 使用线程上下文类加载器:涉及插件或服务提供者框架时,会使用线程上下文类加载器来加载类,这允许类加载的请求绕过默认的双亲委派规则,直接由特定的类加载器处理
  4. 利用JNI:直接在本地代码层面加载类绕过Java类加载机制
  5. 自定义类加载层级

12.4 三种类加载器

Bootstrap:加载jre/lib文件夹下的文件

Extension:加载jre/lib/ext文件夹下的文件

Applocatin:一般加载类使用的加载器

12.5 类加载过程

验证:验证Class文件的安全性和正确性

准备:为类变量进行内存分配和初始化零值

解析:将常量池的符号引用编译时生成,描述目标在类层次结构中的一个位置,如类、接口、方法、字段)转换为直接引用内存中的实际位置

12.6 为什么float与double进行运算会损失精度,而bigdicimal不会,其不会损失精度的原因在哪

因为计算机是基于二进制计算的,但是BigDecimal是基于十进制的字符串形式存储数字,它可以直接以十进制进行数字计算无需像floatdouble那样转换为二进制表示,从而避免了二进制表示十进制小数时产生的不可精确表示的问题

12.7 泛型中T与?的区别

T

  • T表示类型占位符,代表某种未知的具体类型。
  • T可以用于修饰类、方法和参数

  • ?表示通配符,代表“某种未知”,表示属于某一类型(任何类型)
  • ?接收多种类型的参数,尤其是在不需要知道确切类型或者要表示类型灵活性的场景中
  • 有两种主要的通配符形式:无界通配符 ?(表示可以是任何类型)和有界通配符 ? extends SomeType 或 ? super SomeType,分别表示“某种未知的继承自 SomeType 的类型”或“某种未知的 SomeType 的超类型”。
  • 与 T 不同,? 不能作为类或方法的类型参数直接使用,主要用于参数传递返回类型或者局部变量声明,以提供更大的灵活性或限制类型参数的使用方式。

12.8 聚簇索引与主键索引的区别?

  1. 定义与作用

    • 主键索引:是一种唯一性索引,其目的是确保表中每一行数据都有一个唯一的标识符。主键可以是单一列或组合列,并且要求值唯一且非空(NULL)
    • 聚簇索引:是一种数据存储方式,它决定了表中数据行的物理存储顺序。在聚簇索引中,数据行按照索引列的值排序存储,使得索引的叶节点直接包含表的数据行。因此,对于给定的索引列值,查找操作可以迅速定位到实际的数据行。
  2. 关系

    • 在许多数据库系统中,尤其是MySQL的InnoDB存储引擎,默认情况下,如果一个表定义了主键,那么这个主键就是作为聚簇索引的。这意味着主键索引和聚簇索引在物理存储布局上是一致的。
    • 如果表没有定义主键,InnoDB会尝试使用第一个唯一非空索引作为聚簇索引。如果连这样的索引都没有,InnoDB会自动创建一个隐藏的主键并用它作为聚簇索引
  3. 区别:

    • 适用性:主键索引强调数据的唯一性和标识性,而聚簇索引关注的是数据的物理存储和访问效率
    • 唯一性:主键索引要求索引列的值必须唯一,而聚簇索引则不一定要求唯一性,虽然实践中常见的做法是用唯一性的列(如主键)作为聚簇索引。
    • 数据存储:聚簇索引直接影响数据的物理排列,而主键索引则不一定,它可以是聚簇索引也可以是非聚簇索引(尽管在InnoDB中通常主键索引就是聚簇索引)。
    • 数量限制:一个表只能有一个聚簇索引,但可以有多个非聚簇索引包括主键索引,如果主键不是聚簇索引的话)。

总的来说,主键索引和聚簇索引在概念上是不同的,但实际应用中,特别是在InnoDB引擎下,主键索引常常被实现为聚簇索引,从而影响了数据的存储和访问方式。

posted @ 2024-05-21 12:32  求知律己  阅读(4)  评论(0编辑  收藏  举报