1.int与Integer的区别
int与Integer的区别有很多,我简单罗列三个方面
第一个作为成员变量来说Integer的初始值是null,int的初始值是0;
第二个Integer存储在堆内存,int类型是在直接存储在栈空间;
第三个integer是个对象类型,封装了很多的方法和属性,我们在使用时更加灵活
至于为什么要设计成封装类型,我认为主要的原因是,java本事他是一个面向对象的语言,一切操作都是以对象作为基础,比如像集合里面存的元素,也只支持存储Object类型,普通类型是无法通过集合来存储的,以上就是我的理解
2.cookie和session的区别是什么
好的,我先解释一下cookie他是客户端浏览器用来保存服务端数据的 一种机制,当我们通过浏览器去进行网页访问的时候服务器可以把某一些状态数据以key-value的形式写入到cookie里面存储到客户端浏览器然后呢客户端下一次再访问服务器的时候,我们可以携带这一些状态数据发送到服务器端,服务器端可以根据Cookie里面携带的内容去识别使用者;
而session他表示一个会话,他是属于服务器的一个容器对象,默认情况下它会针对每个浏览器的请求Server容器都会分配一个session对象,session本质上我们可以认为他是一个ConcurrentHashMap,他可以用来存储当前会话产生的一些状态数据,我们都知道http协议本身是一个无状态的协议,也就是说服务器端并不知道客户端发送过来的多次请求是属于同一个用户,所以session是用来弥补http无状态的一个不足,简单来说呢,服务器端可以利用session来存储客户端在同一个会话里面产生的多次请求了的一个记录那么基于服务器端的session的存储机制再结合客户端的cookie机制我们就可以去实现一个有状态的http协议,它的具体工作原理非常简单,客户端第一次访问服务器端上的时候呢,服务器端会针对这次请求创建一个会话,并且生成一个唯一的sessionid来标注这个对象,然后服务器端把这个sessionid写入到客户端浏览器的cookie里面用来去实现客户端状态的一个保存,那么在后续的请求里面,每次都会生成一个sessionId,服务器端就可以根据sessionid来识别当前这个会话的状态,
所以总的来说cookie是客户端的存储机制而session是服务端的存储机制,以上就是我对这个问题的理解
SQL 优化?
SQL优化首先我们找到有问题的SQL,可以按照这三步来
第一、慢 SQL 的定位和排查
我们可以通过慢查询日志和慢查询日志分析工具得到有问题的 SQL 列表。
第二、执行计划分析
针对慢 SQL,我们可以使用关键字 explain 来查看当前 sql 的执行计划.可以重点关注 type key rows filterd 等字段 ,从而定位该 SQL 执行慢的根本原因。再有方向的进行优化
第三、使用 show profile 工具
Show Profile 是 MySQL 提供的可以用来分析当前会话中,SQL 语句资源消耗情况的工具,可用于 SQL 调优的测量。在当前会话中.默认情况下处于 show profile是关闭状态,打开之后保存最近 15 次的运行结果针对运行慢的 SQL,通过 profile 工具进行详细分析.可以得到 SQL 执行过程中所有的资源开销情况. 如 IO 开销,CPU 开销,内存开销等. 以上就是我对 MySQL 性能优化的理解。
好的,看完高手的回答后,相信各位对 MySQL 性能优化有了一定的理解了,最后我在给各位总结一下常见的 SQL 优化规则:
l SQL 的查询一定要基于索引来进行数据扫描
l 避免索引列上使用函数或者运算,这样会导致索引失效
l where 字句中 like %号,尽量放置在右边
l 使用索引扫描,联合索引中的列从左往右,命中越多越好.
l 尽可能使用 SQL 语句用到的索引完成排序,避免使用文件排序的方式
l 查询有效的列信息即可.少用 * 代替列信息
l 永远用小结果集驱动大结果集
关于“你对 Spring Cloud 的理解”
Spring Cloud 是一套分布式微服务的技术解决方案。
它提供了快速构建分布式系统的常用的一些组件,比如说配置管理、服务的注册与发现、服务调用的负载均衡、资源隔离、熔断降
级等等
不过 Spring Cloud 只是 Spring 官方提供的一套微服务标准定义而真正的实现目前有两套体系用的比较多
一个是 Spring Cloud Netflix 一个是 Spring Cloud Alibaba
Spring Cloud Netflix 是基于 Netflix 这个公司的开源组件集成的一套微服务解决
方案,其中的组件有
1.Ribbon——负载均衡 2. Hystrix——服务熔断
3.Zuul——网关 4. Eureka——服务注册与发现 5. Feign——服务调用
Spring Cloud Alibaba 是基于阿里巴巴开源组件集成的一套微服务解决方案,其
中包括
1.Sentinel——熔断降级 2.gateway——网关
3.Dubbo——消息通讯 4. Nacos——服务注册与发现 5.Seata——事务隔离
有了 Spring Cloud 这样的技术生态使得我们在落地微服务架构时不用去考虑第三方技术集成带来额外成本只要通过配置组件来完成架构下的技术问题从而可以让我们更加侧重性能方面。
springboot的自动装配原理?
自动装配简单来说就是自动去吧第三方组件的bean装载到IOC容器里面,不需要开发人员再去写bean相关的一个配置,在springboot应用里面,只需要在启动类上去加上@SpringBootApplication注解就可以去实现自动装配,@SpringBootApplication这个注解是一个复合注解,真正去实现自动装配的注解是@EnableAutoConfiguration这样一个注解。
自动装配的实现主要依靠三个核心的关键技术,
第一个:引入starter,启动依赖组件的时候,这个组件里面必须要包含一个@Configuration配置类,而在这个配置类里面我们要有通过@Bean这个注解去声明需要装配到IOC容器里面的bean对象
第二个:这个配置类是放在第三方的jar包里面的然后通过springboot中的约大于配置的理念,去把这个配置类的全路径放在classpath:/META-INF/spring.factories文件里面这样springboot就可以知道第三方jar包里面这个配置类的位置,这个步骤主要用到了spring里面的springFactoriesLoader来完成的
第三个:springBoot拿到所有第三方jar包里面声明的配置类以后再通过spring提供的importSelector这样一个接口,来实现对这些配置类的动态加载,从而去完成自动装配这样一个动作,在我看来呢SpringBoot是约定优于配置这一理念下的一个产物,所以在很多的地方度会看到这一类的思想,它的出现呢让开发人员可以更加聚焦的在业务代码的编写上,而不需要去关心和业务无关的配置,其实自动装配的思想在SpringFramework3.x版本里面的@Enable注解就已经有实现的一个雏形,@Enable注解是一个模块驱动的意思,也就是说我们只需要增加@Enable注解就能自动打开某个功能,而不需要针对这个功能去做Bean的配置,@Enable注解的底层呢也是去帮我们自动去完成这样一个模块相关Bean的注入的。以上就是我对springBoot自动装配的一个理解
什么是守护线程?它有什么特点?
守护线程是专门为用户线程提供服务的一种线程,它的声明周期是依赖于用户线程的,只有jvm依然存在用户线程正在运行的情况下,守护线程才会有存在的一个意义,否则一旦jvm进程结束了,那么守护线程也会随之结束,也就是说守护线程不会阻止JVM 的退出但是用户线程会,守护线程和用户线程的创建方式其实是完全一样的。我们只需要去调用用户线程里面的一个setDaemon方法去设置成true就好了,那么就表示这个线程是守护线程,而基于守护线程这样一个特性,所以我认为他更适合一些后台的通用型服务的一些场景里面,比如说像jvm里面的垃圾回收,就是一个典型的使用场景,这个场景的特殊点在于当jvm的线程结束的时候,内存的回收线程本身就没有存在的意义了所以不能因为正在有线程进行垃圾回收导致JVM进程无法结束这样一个问题,而基于守护线程这样一个特性,所以他不能应用在一些线程池,或者一些IO的一些任务场景里面,因为一旦JVM退出以后,守护线程也会直接退出。那么就会导致任务还没有执行完或者资源还没有正常释放的一些问题。以上就是我对这个问题的理解。
HashMap是怎么解决哈希冲突的
这个问题我从三个方面来回答
第一,想要了解hash冲突,首先我们需要了解Hash算法和hash表(像以下结构),hash算法就是把任意长度的输入通过散列算法编程固定长度的输出,这个输出结果就是一个散列值。
第二,hash表又叫做“散列表”,他是通过key直接访问到内部存储位置的数据结构再具体的实现上,我们通过hash函数把key映射到表中的某个位置,来获取这个位置,来加快数据的查找。
第二 所谓hash冲突是由于hash算法被计算的数据时无限的,而计算后的结果的范围是有限的,所以总会存在不同的数据,经过计算之后得到的值是一样的,那么这个情况下就会出现所谓的hash冲突。
第三 通常解决hash冲突的方法有四种:
1.开放定址法,也称线性探测法,就是从发生冲突的位置开始按照一定的次序从hash表中找到一个空闲的位置,然后把发生冲突的元素存入到这个位置,而在java中 ThreadLocal就用到了线性探测法来解决hash冲突,
2.