java核心面试题解析(持续更新)

1.索引

1.1创建索引:

create index  索引名称 on 某张表 (列名)

示例:

create index  index_name on table (Column names)

1.2索引优化

MySQL数据库索引优化是提高查询性能的重要手段。以下是一些关键的索引优化策略:

  1. 选择正确的索引列
    • 经常需要排序、分组和联合操作的字段,如使用ORDER BYGROUP BYDISTINCTUNION等操作的字段,应该建立索引。
    • 常作为查询条件的字段也应该建立索引,因为查询速度会受到影响。
  2. 限制索引数量
    • 每个索引都需要占用磁盘空间,并且当表的内容发生变化时,索引也需要更新,有时还需要重构。因此,过多的索引会导致更新表的时间增长,并且MySQL在生成执行计划时也要考虑更多的索引,这会增加额外的开销。
  3. 使用数据量少的索引
    • 如果索引的值很长,查询速度会受到影响。因此,尽量使用数据量少的索引。
  4. 考虑覆盖索引
    • 覆盖索引是指SQL查询只需要通过遍历索引树就可以返回所需数据,无需回表操作。这可以显著提高查询性能。
  5. 遵循最左前缀匹配
    • 联合索引命中必须遵循最左前缀法则。即SQL查询的WHERE条件字段必须从索引的最左前列开始匹配,不能跳过索引中的列。
  6. JOIN优化
    • 在进行联表操作时,考虑使用Index Nested-Loop Join优化。这种优化方式主要为了减少内层表数据的匹配次数,当用来进行JOIN的字段在被驱动表中建立了索引时,匹配次数会显著减少。
  7. 使用前缀索引
    • 对于较长的字符串字段,如果前缀已经足够区分数据,可以考虑使用前缀索引,以减少索引的大小和查询时间。
  8. 避免不必要的索引操作
    • 不对索引字段进行逻辑操作,尽量全值匹配,避免使用不等于操作,字符类型查询时务必加上引号,OR关键字左右尽量都为索引列等,这些都能提高索引的使用效率。
  9. 数据量小的表优化
    • 对于数据量小的表,索引可能不会产生优化效果,因为查询花费的时间可能比遍历索引的时间还要短。因此,在这些情况下,最好不要使用索引。
  10. 定期审查和优化索引
    • 随着数据库的使用和数据的变化,之前有效的索引可能不再是最优的。因此,定期审查和优化索引是很重要的。可以使用EXPLAIN命令来查看查询的执行计划,了解索引的使用情况,并根据需要进行调整。

2.spring

2.1 spring容器初始化

Spring容器的初始化过程包括以下主要步骤:

  1. 加载配置文件Spring容器会从XML文件、Java注解或者Java Config等方式加载配置信息。这些配置信息定义了应用中的bean、依赖关系、切面等内容。
  2. 创建容器实例:一旦配置文件被加载,Spring容器会实例化并初始化容器对象。这意味着容器开始了解应用的组件和它们之间的关系。
  3. 实例化Bean:容器根据配置信息实例化各个Bean对象,这可能涉及到构造函数的调用或者工厂方法的调用。
  4. Bean的初始化:如果Bean实现了InitializingBean接口或者定义了初始化方法,容器会在依赖注入完成后调用这些初始化方法,以进行一些额外的初始化工作。
  5. 注册Bean:容器将实例化并初始化的Bean注册到自己的内部数据结构中,以便后续的管理和使用。

在这个过程中,还会涉及到依赖注入的过程,即Spring容器会自动地将Bean之间的依赖关系注入到相应的属性中,以确保Bean能够正常工作。

需要注意的是,Spring容器的初始化过程是一个复杂的过程,涉及到多个组件和机制的协同工作。为了确保Spring容器的正确初始化,需要仔细配置和检查配置文件,并确保所有的Bean都正确地定义和依赖注入。

此外,Spring容器还提供了许多扩展点和配置选项,可以根据具体的应用需求进行定制和优化。例如,可以通过Java Config或者注解的方式更加灵活地配置Bean,也可以使用AOP(面向切面编程)等功能来增强应用的功能和性能。

总之,Spring容器的初始化是Spring框架的核心功能之一,它使得开发者能够更加方便地管理和组织应用中的组件和依赖关系,提高了应用的可维护性和可扩展性。

2.1.1 Spring容器 有哪些

Spring容器主要提供了两种类型的容器:BeanFactoryApplicationContext

  1. BeanFactory:是基础类型的IoC容器,提供完整的IoC服务支持。如果没有特殊指定,默认采用延迟初始化策略。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IoC容器选择。
  2. ApplicationContext:它是在BeanFactory的基础上构建的,是相对比较高级的容器实现。除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布、国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。

除了上述两种主要的容器类型,Spring容器还有一些其他的特性,例如支持父级容器和子容器的概念,以及提供了多种方式来获取和管理容器中的Bean,如静态工具类方式等。

总的来说,Spring容器是Spring框架的核心组成部分,通过它,我们可以实现依赖注入、管理Bean的生命周期等功能,从而简化应用的开发和维护。

2.2#{ }和${ }区别

(1)$(key)表示获取参数,先获取参数的值拼接到SQL语句中,再编译执行SQL,可能会引起SQL注入的问题

(2)#(key)表示获取参数,先完成SQL编译(预编译),预编译之后再将获取的参数设置到SQL语句中,可以避免SQL注入问题

2.3 AOP通知

增强的部分叫通知

2.4 AOP术语

AOP术语:

1、连接点

类里面哪些方法可以被增强,这些方法称为连接点

2、切入点

实际被真正增强的方法,称为切入点

3、通知(增强)

(1)实际增强的逻辑部分称为通知(增强)

(2)通知有多种类型

*前置通知

*后置通知

*环绕通知

*异常通知

*最终通知 finnlly

4、切面(是动作)

把通知应用到切入点过程

2.5 IOC

2.5.1什么是IOC

IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。

Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。

在 Spring 应用中,Java 对象创建的控制权是掌握在 IoC 容器手里的,其大致步骤如下。

  1. 开发人员通过 XML 配置文件、注解、Java 配置类等方式,对 Java 对象进行定义,例如在 XML 配置文件中使用 <bean> 标签、在 Java 类上使用 @Component 注解等。
  2. Spring 启动时,IoC 容器会自动根据对象定义,将这些对象创建并管理起来。这些被 IoC 容器创建并管理的对象被称为 Spring Bean。
  3. 当我们想要使用某个 Bean 时,可以直接从 IoC 容器中获取(例如通过 ApplicationContext 的 getBean() 方法),而不需要手动通过代码(例如 new Obejct() 的方式)创建。

IoC 带来的最大改变不是代码层面的,而是从思想层面上发生了“主从换位”的改变。原本调用者是主动的一方,它想要使用什么资源就会主动出击,自己创建;但在 Spring 应用中,IoC 容器掌握着主动权,调用者则变成了被动的一方,被动的等待 IoC 容器创建它所需要的对象(Bean)。

这个过程在职责层面发生了控制权的反转,把原本调用者通过代码实现的对象的创建,反转给 IoC 容器来帮忙实现,因此我们将这个过程称为 Spring 的“控制反转”。

2.5.2 ioc过程

IOC过程
//第一步 xm1配置文件,配置创建的对象
<bean id="dao” class="com. At. UserDao"></bean>  进一步降低耦合度
//第二步 有service类和dao类 ,创建工厂类
class UserFactory {
public static UserDao getDao() {
String classValue = class属性值: //1 xml解析
Class clazz= Class.forName(classValue): //2 通过反射创建对象
return(UserDao)clazz. Newinstance() ;}
}

2.5.3 IOC接口(重点)

  1. IOC思基于 i0C容器完成,IOC容器底层就是对象工厂

2、Spring 提供IOC容器实现两种方式: (两个接口)

(1) BeanFactory: IOC容器基本实现,是Spring 内部的使用接口,不提供开发人员进行使用

*加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象

(2)ApplicationContext: BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人

员进行使用,

*加载配置文件时候就会把在配置文件对象进行创建

2.5.4 IoC 的工作原理

我们在程序设计时,所秉承的思想一般都是在不影响系统功能的前提下,最大限度的降低耦合度。

IoC 底层通过工厂模式、Java 的反射机制XML 解析等技术,将代码的耦合度降低到最低限度,其主要步骤如下。

  1. 在配置文件(例如 Bean.xml)中,对各个对象以及它们之间的依赖关系进行配置;
  2. 我们可以把 IoC 容器当做一个工厂,这个工厂的产品就是 Spring Bean;
  3. 容器启动时会加载并解析这些配置文件,得到对象的基本信息以及它们之间的依赖关系;
  4. IoC 利用 Java 的反射机制,根据类名生成相应的对象(即 Spring Bean),并根据依赖关系将这个对象注入到依赖它的对象中。


由于对象的基本信息、对象之间的依赖关系都是在配置文件中定义的,并没有在代码中紧密耦合,因此即使对象发生改变,我们也只需要在配置文件中进行修改即可,而无须对 Java 代码进行修改,这就是 Spring IoC 实现解耦的原理

2.5.5 IoC 容器的两种实现

IoC 思想基于 IoC 容器实现的,IoC 容器底层其实就是一个 Bean 工厂。Spring 框架为我们提供了两种不同类型 IoC 容器,它们分别是 BeanFactory 和 ApplicationContext。

2.5.5.1BeanFactory

BeanFactory 是 IoC 容器的基本实现,也是 Spring 提供的最简单的 IoC 容器,它提供了 IoC 容器最基本的功能,由 org.springframework.beans.factory.BeanFactory 接口定义。

BeanFactory 采用懒加载(lazy-load)机制,容器在加载配置文件时并不会立刻创建 Java 对象,只有程序中获取(使用)这个对对象时才会创建。

示例 1

下面我们通过一个实例演示,来演示下 BeanFactory 的使用。

1. 在 HelloSpring 项目中,将 MainApp 的代码修改为使用 BeanFactory 获取 HelloWorld 的对象,具体代码如下。

public static void main(String[] args) {
    BeanFactory context = new ClassPathXmlApplicationContext("Beans.xml");
    HelloWorld obj = context.getBean("helloWorld", HelloWorld.class);
    obj.getMessage();
}


2. 运行 MainApp.java,控制台输出如下。

message : Hello World!

注意:BeanFactory 是 Spring 内部使用接口,通常情况下不提供给开发人员使用。 

2.5.5.2 ApplicationContext

ApplicationContext 是 BeanFactory 接口的子接口,是对 BeanFactory 的扩展。ApplicationContext 在 BeanFactory 的基础上增加了许多企业级的功能,例如 AOP(面向切面编程)、国际化、事务支持等。

ApplicationContext 接口有两个常用的实现类,具体如下表。

实现类

描述

示例代码

ClassPathXmlApplicationContext

加载类路径 ClassPath 下指定的 XML 配置文件,并完成 ApplicationContext 的实例化工作

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

FileSystemXmlApplicationContext

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s的Pod出现Init:ImagePullBackOff问题的解决,(以calico网络插件为例)

问题描述&#xff1a; 对于这类问题的解决思路应该都差不多&#xff0c;本文以calico插件安装为例&#xff0c;发现有个Pod的镜像没有pull成功 第一步&#xff1a;查看这个pod的描述信息 kubectl describe pod calico-node-t9rql -n kube-system从上图发现是docker拉取"…

第十三届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 星期计算试题 B: 山试题 C: 字符统计试题 D: 最少刷题数试题 E \mathrm{E} E : 求阶乘试题 F : \mathrm{F}: F: 最大子矩阵试题 G: 数组切分试题 H: 回忆迷宫试题 I: 红绿灯试题 J 拉箱子 发现宝藏 前些天发现了一个巨牛的人工智能学习…

精密空调制冷量计算公式

制冷系统设计 环境设计参数 空调系统以《采暖通风与空气调节设计规范》GB50019-2003、《数据中心设计规范》GB50174-2017、《 数据中心用恒温恒湿空调系统》YD/T2061-2009 及《核心机房节能热管理技术规范》QB-H-001-2009 等国家及行业标准规范作为设计依据,总体把握安全可靠、…

Apache FtpServer在Windows上下载安装与使用

Apache FtpServer在Windows上下载安装与使用 1、Apache Ftp Server下载 进入apache官网 https://mina.apache.org/ftpserver-project/old-downloads.html 下载自己使用的版本。 Apache FtpServer 1.1.1及以下的版本需要JDK1.7的支持 Apache FtpServer 1.1.1以上的版本需要JDK…

【Kafka系列】Kafka事务一般在什么场景下使用呢

面试官&#xff1a;听说你精通Kafka&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 以【面试官面试】的形式来分享技术&#xff0c;本期是《Kafka系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1a;生产者重…

ros time 时间戳改为机器开机时间

一、问题描述 因项目需要,需要"ros::Time::now()" 改成获取机器开机时间,此处针对rospy的机器时间修改。 二、修改方法 修改ros源码的文件 /opt/ros/noetic/lib/python3/dist-packages/rospy/rostime.py 修改如下: 定位到 get_rostime() &#xff0c;并将 float_…

多ip多进程代理的实现方法

目录 写在前面 一、背景 二、实现方法 1. 使用多线程处理代理请求 2. 使用多进程处理代理请求 3. 实现多IP代理 三、总结 写在前面 实现多IP多进程代理需要使用Python的多线程和多进程模块。本文将介绍如何使用这些模块来实现多IP多进程代理&#xff0c;并提供相关的代…

今天简单聊聊容器化

什么是容器化 容器化&#xff08;Containerization&#xff09;是一种软件开发和部署的方法&#xff0c;其核心思想是将应用程序及其所有依赖项打包到一个独立的运行环境中&#xff0c;这个环境被称为容器。容器化技术使得应用程序可以在不同的计算环境中以一致的方式运行&…

千万别让老板知道,这套80%海报,是我用生成式 AI 设计的!

继淡人、浓人近期大幅席卷职场&#xff0c;一类新兴稀有人群正在隐秘的角落悄悄蓄力&#xff0c;等待爆发。 他们的特质是&#xff1a; 眼看一脸平静&#xff0c;其实内心汹涌&#xff1b; 嘴上说着收到&#xff0c;实则无语连篇&#xff1b; 他们的幸运色是五彩斑斓的黑&am…

掌握C语言结构体,开启编程新世界

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 前言 前面我们也涉及到了结构体的讲解&#xff0c;但是只是粗略的讲了一下。 接下…

MySQL基础(DDL,DML,DQL)

目录 一DDL 1.1数据库操作 1.1.1查询所有数据库&#xff1a; 1.1.2创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2表操作 1.2.1表操作 1.2.1.1创建表 1.2.1.1.1约束 1.2.1.1.2 数据类型 1.2.1.1.2.1 数值类型 1.2.1.1.2.2 字符串类型 1.2.1.1.2.3日期类型 1.…

【C语言】动态内存管理及其常见错误

文章目录 1、前言&#xff1a;为什么要有动态内存分布2、三种动态内存的创建方式及其释放2.1 malloc2.2 calloc2.3 ralloc2.4 free 3、常⻅的动态内存的错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使⽤free释放⼀块动态开…

2016年认证杯SPSSPRO杯数学建模B题(第二阶段)多帧图像的复原与融合全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 多帧图像的复原与融合 原题再现&#xff1a; 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制&#xff0c;拍摄设备只能在较低的分辨率下成像。为简单起见&#xff0c;我们只考虑单色成像。假设成像的分辨率为 32 64&#x…

如何在Java中调用DLL动态库

在Java编程中&#xff0c;有时我们需要调用本地代码库&#xff0c;特别是Windows平台上的DLL&#xff08;动态链接库&#xff09;。这种技术允许Java程序利用操作系统特定或性能敏感的功能。在本文中&#xff0c;我们将详细讨论如何在Java中加载和调用DLL动态库&#xff0c;并通…

react中useContext的用法

先在context文件中使用createContext创建初始值 import React from react;const TestContext React.createContext(true);export { TestContext };然后在父组件中引入&#xff0c;利用Provider传入新值 import { TestContext } from /utils/context;<TestContext.Provide…

【Golang入门教程】Go语言变量的声明

Go语言的变量声明是非常灵活和强大的。在Go语言中&#xff0c;你可以通过几种不同的方式来声明变量。下面是一些基本的示例来帮助你理解Go语言中如何声明变量。 ### 1. 使用var关键字 最基本的方式是使用var关键字&#xff0c;后跟变量名、变量类型。你可以在声明的时候初始化变…

NFT Insider #124:Aavegotchi 开启新一季稀有度挖矿,德克萨斯州奥斯汀市登陆 The Sandbox

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members&#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、…

多线程libtorch推理问题

一、环境 我出问题的测试环境如下: pytorch1.10+cu113 pytorch1.10+cu116 pytorch2.2+cu118 libtorch1.10.1+cu113 libtorch1.10.1+cu111 libtorch1.9.0+cu111 二、问题现象 最近封装libtorch的推理为多线程推理的时候,遇到一个现象如下: (1)只要是将模型初始化放到一个…

什么是few-shot learning

什么是few-shot learning Few-shot learning is a kind a meta learningmeta learning: learn to learn 与传统监督算法的不同 传统监督算法&#xff1a;要求模型识别训练数据&#xff0c;并且泛化到测试数据。meta learning的目标是自己学会学习。 教小朋友判断动物的异同…

【主函数参数和 fork 讲解】

主函数参数 main函数是有参数的&#xff0c;而且主函数可以在运行时传参数&#xff0c;举例如下&#xff1a; 【编写main.c文件】 主函数的三个参数&#xff1a;**参数个数&#xff0c;参数内容&#xff0c;环境变量**也可以这样写&#xff1a;环境变量最后一个元素为Null f…