| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 基础八股文精简背诵版! -> 正文阅读 |
|
[Java知识库]基础八股文精简背诵版! |
? ? ? ? ? ? 常见八股: 多线程部分: SpringSpring和SpringBoot的区别
对于应用程序启动引导配置,Spring支持传统的web.xml引导方式以及最新的Servlet3+方法,SpringBoot仅使用 Servlet3功能来引导应用程序。
Spring Boot 的启动流程SpringBoot 有哪些优点?它和 Spring 有什么区别? - 链滴 1.创建并启动计时监控类 此计时器是为了监控并记录 Spring Boot 应用启动的时间的,它会记录当前任务的名称,然后开启计时器。 2.声明应用上下文对象和异常报告集合 此过程声明了应用上下文对象和一个异常报告的 ArrayList 集合。 3.设置系统属性 headless 的值 设置 Java.awt.headless = true,其中 awt(Abstract Window Toolkit)的含义是抽象窗口工具集。设置为 true 表示运行一个 headless 服务器,可以用它来作一些简单的图像处理。 4.创建所有 Spring 运行监听器并发布应用启动事件 此过程用于获取配置的监听器名称并实例化所有的类。 5.初始化默认应用的参数类 也就是说声明并创建一个应用参数对象。 6.准备环境 创建配置并且绑定环境(通过 property sources 和 profiles 等配置文件)。 7.创建 Banner 的打印类 Spring Boot 启动时会打印 Banner 图片。此 banner 信息是在 SpringBootBanner 类中定义的,我们可以通过实现 Banner 接口来自定义 banner 信息,然后通过代码 setBanner() 方法设置 Spring Boot 项目使用自己自定义 Banner 信息,或者是在 resources 下添加一个 banner.txt,把 banner 信息添加到此文件中,就可以实现自定义 banner 的功能了。 8.创建应用上下文 根据不同的应用类型来创建不同的 ApplicationContext 上下文对象。 9.实例化异常报告器 它调用的是 getSpringFactoriesInstances() 方法来获取配置异常类的名称,并实例化所有的异常处理类。 10.准备应用上下文 此方法的主要作用是把上面已经创建好的对象,传递给 prepareContext 来准备上下文,例如将环境变量 environment 对象绑定到上下文中、配置 bean 生成器以及资源加载器、记录启动日志等操作。 11.刷新应用上下文 此方法用于解析配置文件,加载 bean 对象,并且启动内置的 web 容器等操作。 12.应用上下文刷新之后的事件处理 这个方法的源码是空的,可以做一些自定义的后置处理操作。 13.停止计时监控类 停止此过程第一步中的程序计时器,并统计任务的执行信息。 14.输出日志信息 把相关的记录信息,如类名、时间等信息进行控制台输出。 15.发布应用上下文启动完成事件 触发所有 SpringApplicationRunListener 监听器的 started 事件方法。 16.执行所有 Runner 运行器 执行所有的 ApplicationRunner 和 CommandLineRunner 运行器。 17.发布应用上下文就绪事件 触发所有的 SpringApplicationRunListener 监听器的 running 事件。 18.返回应用上下文对象 到此为止 Spring Boot 的启动程序就结束了,我们就可以正常来使用 Spring Boot 框架了。 SpringMVC 五大核心组件
SpringMVC执行流程
bean的生命周期1、实例化Bean对象 2、设置Bean的属性 3、注入Aware的依赖 4、执行前置处理函数,postProcessorBeforeInitialization() 5、执行afterPropertiesSet()方法, 6、执行Bean自定义的初始化方法,可用@PostConstruct注解标注 7、执行后置处理函数,POSTProcessorAfterInitialization() 8、对象创建完毕 9、执行对象销毁方法destory() 10、执行自定义的销毁方法,可用@PreDestory注解标注 11、对象销毁完毕 springboot的核心技术依赖注入、事件、资源、i18n、验证、数据绑定、类型转换、SpEL、AOP 修改自带的tomcat在pom.xml去除tomcat相关的配置,再引入其他的servlet容器 SpringMVC常用注解
@Component和@Bean的区别
Spring事务JavaGuide/Spring事务总结.md at master · Snailclimb/JavaGuide · GitHub Spring 支持事务管理的方式有两种:
@Transactional的作用范围:
Spring的自动装配淘宝一面:“说一下 Spring Boot 自动装配原理呗?” - JavaGuide - 博客园 构造注入和setter注入有时在做配置时比较麻烦。“自动装配”指的是spring容器依据某种规则,自动建立对象之间的依赖关系。而spring框架式默认不支持自动装配的,要想使用自动装配,则需要修改spring配置文件中<bean>标签的autowire属性。 自动装配的规则:
Spring注入方式常用的注入方式主要有三种:
Spring循环依赖产生循环依赖问题的前提条件:Spring管理的Bean默认都是单例模式。 解决循环依赖的思路:三级缓存+标记缓存。 Spring的三级缓存:
注意:第三级缓存经过代理包装或替换后,进入到第二级缓存。 无法解决循环依赖的场景:Spring可以正常解决通过属性进行依赖注入的循环依赖场景,但是无法解决通过构造方法进行注入的循环依赖场景。 IOC、DI、AOP
Spring AOP 实现原理浅析Spring中AOP的实现原理——动态代理 - 特务依昂 - 博客园 通过动态代理实现,分别是JDK的动态代理和CGLib的动态代理。如果我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。 Spring默认使用JDK的动态代理实现AOP,类如果实现了接口,Spring就会使用这种方式实现动态代理。JDK的动态代理是基于反射实现。 JDK的动态代理存在限制,那就是被代理的类必须是一个实现了接口的类,代理类需要实现相同的接口,并实现代理接口中声明的方法。若需要代理的类没有实现接口,此时JDK的动态代理将没有办法使用,于是Spring会使用CGLib的动态代理来生成代理对象。CGLib直接操作字节码,生成类的子类,重写类的方法完成代理。 Java面向对象和面向过程的区别面向过程的开发方法中最重要的是对事件的处理过程。处理的对象多以变量的形式存在,且与处理过程之间不存在约束关系。开发简单。由于使用面向过程方法设计的程序把处理的主体与处理的方法分开,因此各种成分错综复杂地放在一起,难以理解,易出错,并且难于调试。 面向对象的开发方式中,以数据为中心,将数据及对数据的操作放在一起,形成对象。使用类来刻画有类似属性的不同对象,使用继承来简化开发过程,使用接口来规范对数据的操作,使用多态达到操作的灵活性。 面向对象易维护、易复用、易扩展。并且由于面向对象有封装、继承、多态性特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。 抽象类和接口的区别
类和抽象类的区别
socket建立连接的过程图解Java服务端Socket建立原理_一群专业码农的笔记本-CSDN博客_java服务端socket STW(Stop The World)JVM STW(Stop The World)到底怎么回事(三) | 李世佳的博客 FullGC发生过程中,整个应用程序线程都会被暂停(native代码可以执行,但不能与JVM交互),没有任何响应, 有点像卡死的感觉。被STW中断的应用程序线程会在完成GC之后恢复。STW是JVM在后台自动发起和自动完成的。 减少系统的停顿时间(STW)的增量收集算法 和分区算法_一个长不胖的程序YUAN的博客-CSDN博客 减少系统的停顿时间有两种算法:一种是增量收集算法,另一种是分区算法。 锁的优化和注意事项https://www.jb51.net/article/92453.htm 1、减少锁持有的时间和范围 2、减小锁的粒度,将大对象拆为小对象,如ConcurrentHashMap的做法 3、读/写锁分离 4、锁对象不要是字符串或基本类型的包装类,因为会缓存 秒杀场景下如何保证数据一致性如何设计分布式锁常见的分布式锁:MySql、Zk、Redis JVM调优Java数据类型基本数据类型:
引用数据类型:类、接口、数组、枚举、标注 集合Java反射Java在编译之后会生成一个class文件,反射通过字节码文件找到其类中的方法和属性等。 获取Class对象的方式:
反射机制的优缺点:
反射底层https://segmentfault.com/a/1190000039302149 Java反射底层原理以及应用_WAXXD的博客-CSDN博客 threadlocalJava面试必问:ThreadLocal终极篇 淦! - 敖丙 - 博客园 https://segmentfault.com/a/1190000024438006 ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。在多线程环境下,可以防止自己的变量被其它线程篡改。 Spring采用Threadlocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式可以使业务层使用事务时不需要感知并管理connection对象,通过传播级别,巧妙地管理多个事务配置之间的切换,挂起和恢复。 内存泄漏和内存溢出【221期】面试官:谈谈内存泄漏和内存溢出的联系与区别-Java知音 内存泄漏 内存泄漏是指程序中已动态分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统奔溃等严重后果。 几种典型的内存泄漏:
如何检测内存泄漏:
内存溢出 内存溢出指程序在申请内存时,没有足够的内存供申请者使用。 内存溢出原因:
AIO和NIO面试官问我:如何理解BIO、NIO、AIO的区别?我差点拉胯! - 知乎 进程中的IO调用步骤大致可以分为以下四步:
当操作系统在把外部数据放到进程缓冲区的这段时间(即上述的第二,三步),如果应用进程是挂起等待的,那么就是同步IO,反之,就是异步IO,也就是AIO 。 nio的实现方式nio的三种实现方式:select, poll, epoll_Lucky小黄人的博客-CSDN博客 select、poll、epoll 零拷贝零拷贝的“零”是指用户态和内核态间copy数据的次数为零。零拷贝完全依赖于操作系统,不依赖Java本身。 传统的数据copy(文件到文件、client到server等)涉及到四次用户态和内核态切换、四次copy。四次copy中,两次在用户态和内核态间copy需要CPU参与、两次在内核态与IO设备间copy为DMA方式不需要CPU参与。零拷贝避免了用户态和内核态间的copy(共2次)、减少了两次用户态内核态间的切换,因此数据传输效率高(4、4变2、2)。 零拷贝可以提高数据传输效率,但对于需要在用户传输过程中对数据进行加工的场景(如加密)就不适合使用零拷贝。 Java NIO中的FileChannel拥有transferTo和transferFrom两个方法,可直接把FileChannel中的数据拷贝到另外一个Channel 分布式和微服务的区别
网络HTTP 1.0/1.1HTTP1.0、HTTP1.1与HTTPS_bian_qing_quan11的博客-CSDN博客 HTTP是客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。是一个应用层协议,基于TCP/IP通信协议。 ① HTTP是无连接的:无连接的含义是限制每次连接只能处理一个请求,服务器处理完客户端的请求并收到回复之后立刻断开。(节省传输时间) ? ② HTTP是媒体独立的:只要客户端和服务端知道如何处理数据内容,任何类型的数据都可以通过HTTP发送; ? ③ HTTP是无状态协议:无状态协议指协议对事务处理没有记忆能力。
HTTP2.0:
HTTP长连接一次TCP连接可以传输多次request,而不需要每个request建立一次TCP连接。 HTTP1.0默认关闭,需要在头信息中加入 HTTP1.1默认是开启状态,可以使用 长连接可以避免连接建立和释放的开销。但长时间的Tcp连接容易导致系统资源无效占用,浪费系统资源。 长连接有一个保活时间,一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。 TCP的Keep-Alive:用于每隔一段时间发送一个侦测包,以判断对方是否在线。与HTTP的Keep-Alive不一样。 HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。 HTTP长连接实现原理HTTP协议本质是OSI七层参考模型中的应用层协议,而网络进行通信的时候都是通过上层协议封装头部后作为下层协议的数据部分进行封装的,而实际中我们经常接触的是TCP/IP协议簇,也就是传输层利用TCP协议和网络层利用IP协议。因此HTTP协议的长连接本质上就是TCP的长连接。 http、websocket、socket面试题之---http,websocket和socket详解 - 程序员大本营 http: http是单向的非持久连接的协议。服务端只有在客户端发起请求时才能发送数据。 WebSocket: WebSocket是基于TCP的应用层的双向通信的持久化协议。协议标识符是ws和wss。在建立握手时,通过 HTTP/1.1 协议的101协议切换状态码进行握手。但是建立之后,在真正传输时候是不需要HTTP协议的,而是使用TCP协议。可以主动向客户端发送信息。 Websocket使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。 Socket: Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输层之间的一组接口。 在程序内部提供了与外界通信的端口,也就是端口通信。它通过建立socket连接,可以为通信双方的数据传输提供一个通道。 Socket有udp的scoket和tcp的socket,一般采用的是tcp的socket。 浏览器输入URL后1、域名解析:浏览器自身DNS缓存 -> PC自身的DNS缓存 -> host文件 -> 本地域名服务器 -> 根域名服务器。 2、TCP3次握手建立连接。 3、发起HTTP请求。 4、服务端响应HTTP请求,浏览器得到请求的内容。 5、浏览器解析HTML代码,并请求需要的资源。 6、浏览器对页面进行渲染,展现给用户。 TCP、UDPTCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP是一种无连接的、不可靠的、基于报文的传输层通信协议。 TCP的可靠通信是通过3次握手4次挥手、流量控制、拥塞控制、确认应答标志、错误重传等机制保证的,因此也会造成实时性较差,开销比较大,适用于可靠性要求高的场合,如文件传输。而UDP不保证可靠通信,因此开销小,适用于实时性要求不高的场合,如视频通话、网络游戏。 另外,TCP只能点对点通信,而UDP支持多对多通信。 沾包与拆包UDP 是基于报文发送的,UDP首部采用了 16bit 来指示 UDP 数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。 而 TCP 是基于字节流的,在 TCP 的首部没有表示数据长度的字段。当发送数据超过TCP最大长度时,就会发生拆包;当发送数据不足 时,会先存在缓冲区内,就会发生沾包。 对于UDP协议来说,整个包的最大长度为65535-IP头20-UDP头8; 对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS)决定,MSS就是TCP数据包每次能够传输的最大数据分段。往往MSS为1460(1500-IP头20-TCP头20)。 RPC和HTTP和FeignRPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。 RPC 和 HTTP 调用是没有经过中间件的,它们是端到端系统的直接数据交互。 主流的RPC框架有:dubbo、dubbox、motan Feign是微服务中最常见的PRC框架,Feign封装了负载均衡Ribbon和服务熔断保护Hystrix,底层用的是RestTemplate,也就是HTTP的形式进行的远程调用,所以也称“伪HTTP客户端”。它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
MySQL表连接方式
索引失效面试题: MySQL 索引失效的10大原因 - 维宇空灵 - 博客园
索引优化
Redis数据结构String:字符串类型,可用于缓存、共享session List:列表类型,可用于消息队列、文章、任务列表 Set:无序集合类型,可用于好友、标签 SortedSet:有序集合类型,可用于排行榜 Hash:哈希表类型,可用于映射管理操作 缓存一致性缓存雪崩、缓存穿透、缓存击穿
数据结构红黑树红黑树是一种自平衡的二叉搜索树。 “二叉搜索树”的特点是任何一个结点的值都大于其左子树的所有结点的值,任何一个结点的值都小于其右子树的所有结点的值。 “平衡”就是当结点数量固定时,左右子树的高度越接近,这棵二叉树越平衡(高度越低)。而最理想的平衡就是完全二叉树/满二叉树,高度最小的二叉树。 二叉树在特殊情况下会退化为链表。 B树是一种平衡的多路搜索树。 其他如何看待测试工作面试题记录-- 对于软件测试的理解,测试的核心,测试策略_bingolina的博客-CSDN博客_对测试的理解 面试 测试的主要目的是保证质量,同时现在的软件测试也讲究质量和速度。测试在需求分析阶段就应该介入,把设计上的缺陷,或产品经理、开发、测试间理解不一致的问题都找出来,并达成一致,预防由于理解不一致导致的不必要的缺陷的发生。测试人员必须要深入理解业务。 怎么写测试用例① 首先是根据产品的需求提炼出测试点,然后根据测试点扩展写成测试用例,像等价类、边界值这种方法在设计测试用例的过程中我就会潜移默化的用到了。 ? ② 另外写测试用例的时候,会考虑到正例和反例,事实上在写测试点的阶段我就会把正例和反例标记出来了,以及他们的优先级。(理论上来说反例的优先级都是三级,在回归测试的是理论上是可以不做反例的回归测试的→看情况说)我觉得这样其实对后续的工作是一个很大的减负。 ? ③ 我觉得测试用例设计工作应该有个准出标准,避免陷入测试用例感觉写不完的漩涡。(比如一个注册页面,10几个空,排列组合,都写不完)。所以在整个测试用例设计过程中, 我们要考虑出所有的用户场景(也就是说,当用户的场景都被想全了,就准出了) 测试流程->需求确定(出一份确定的需求文档) ->开发设计文档(开发人员在开始写代码前就能输出设计文档) ->想好测试策略,写出测试用例 ->发给开发人员和测试经理看看(非正式的评审用例) ->接到测试版本 ->执行测试用例(中间可能会补充用例) ->提交bug(有些bug需要开发人员的确定(严重级别的,或突然发现的在测试用例范围之外的,难以重现的),有些可以直接录制进TD) ->开发人员修改(可以在测试过程中快速的修改) ->回归测试(可能又会发现新问题,再按流程开始跑)。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:11:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |