版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2022年Java大厂面试必备100题(一)一、基础篇1、讲讲什么是泛型?【仅供参考】Java泛型是JDK5中引入的一个新特性,允许在定义类和接口的时候使用类型参数。声明的类型参数在使用时用具体的类型来替换。泛型最大的好处是可以提高代码的复用性。以List接口为例,我们可以将String、Integer等类型放入List中,如不用泛型,存放String类型要写一个List接口,存放Integer要写另外一个List接口,泛型可以很好的解决这个问题。2、Strings=newString("xyz”)创建了几个字符串对象?【仅供参考】一个或两个。如果字符串常量池已经有“xyz”,则是一个;否则,两个。当字符创常量池没有“xyz”,此时会创建如下两个对象:一个是字符串字面量〃xyz〃所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引用。另一个是通过newString()创建并初始化的,内容与"xyz”相同的实例,也是在堆中。3、Java的特点?【仅供参考】Java具有平台独立性和移植性。Java有一句口号:Writeonce,runanywhere,一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编译的Java程序可以在任何带有JVM的平台上运行。你可以在windows平台编写代码,然后拿到linux上运行。只要你在编写完代码后,将代码编译成.class文件,再把class文件打成Java包,这个jar包就可以在不同的平台上运行了。Java具有稳健性。Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。1、我们知道了,无论我们如何设置初始容量,HashMap都会将我们改成2的幕次方,也就是说,HashMap的容量百分之百是2的幕次方,因为HashMap太依赖他了。2、HashMap的默认加载因子是0.75,虽然可以修改,但是出于安全考虑,除非你经过大量测试,请不要修改此值,HashMap使用此值基本是平衡了性能和空间的取舍。3、HashMap扩容的时机是,Node数组中的元素数量>负载因子*容量,如果负载因子是0.75,容量是16,那么当容器中数量达到13的时候就会扩容。还有,如果某个链表长度达到了8,并且容量小于64,则会用扩容代替红黑树。4、HashMap扩容的时候,不管是链表还是红黑树,都会对这些数据进行重新的散列计算,然后缩短他们的长度,优化性能。在进行散列计算的时候,会进一步优化性能,减少减一的操作,直接使用&运算。可谓神来之笔。5、迭代器Iterator是什么?【仅供参考】Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration,迭代器允许调用者在迭代过程中移除元素。6、说一下runnable和callable有什么区别?【仅供参考】runnable没有返回值,callable可以拿到有返回值,callable可以看作是runnable的补充。7、synchronized的作用?【仅供参考】在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。8、CyclicBarrier和CountDownLatch的区别【仅供参考】CountDownLatch简单的说就是一个线程等待,直到他所等待的其他线程都执行完成并且调用countDown。方法发出通知后,当前线程才可以继续执行。cyclicBarrier是所有线程都进行等待,直到所有线程都准备好进入await()方法之后,所有线程同时开始执行!CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset()方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。(4)CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。如果被中断返回true,否则返回falseo9、线程池都有哪些状态?【仅供参考】RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。TIDYING:所有的任务都销毁了,workCount为0,线程池的状态在转换为TIDYING状态时,会执行钩子方法terminated。。TERMINATED;terminated。方法结束后,线程池的状态就会变成这个。10、多线程的价值?【仅供参考】(1)发挥多核CPU的优势多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事情而不互相干扰。(2)防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。(3)便于建模这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。11、Java反射机制的作用有什么?【仅供参考】作用有⑴在运行时判断任意一个对象所属的类;(2)在运行时构造任意一个类的对象;(3)在运行时判断任意一个类所具有的成员变量和方法;(4)在运行时调用任意一个对象的方法。12、反射机制的优缺点:【仅供参考】优点⑴能够运行时动态获取类的实例,提高灵活性;(2)与动态编译结合Class.forName('com.mysql.jdbc.Driver,class');〃加载MySQL的驱动类缺点:使用反射性能较低,需要解析字节码,将内存中的对象进行解析。其解决方案是:通过setAccessible(true)关闭JDK的安全检查来提升反射速度;多次创建一个类的实例时,有缓存会快很多;ReflflectASM工具类,通过字节码生成的方式加快反射速度。13、反射的缺点?【仅供参考】1、性能问题。Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。2、安全限制。使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。3、程序健壮性。反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。14、反射的实现方式都有什么?【仅供参考】获取Class对象,有4种方法:(1)Class.forName(“类的路径”);⑵类名.class;(3)对象名.getClass();(4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象。15、java中,抽象类与接口之间有什么区别?【仅供参考】.一个类可以实现多个接口,但却只能继承最多一个抽象类。.抽象类可以包含具体的方法,接口的所有方法都是抽象的。.抽象类可以声明和使用字段,接口则不能,但接口可以创建静态的final常量。.接口的方法都是public的,抽象类的方法可以是public,protected,private或者默认的package;.抽象类可以定义构造函数,接口却不能。16、什么是设计模式?你是否在你的代码里面使用过任何设计模式?【仅供参考】设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸17、什么是代理模式?【仅供参考】代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。优点:代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。缺点:由于使用了代理模式,因此程序的性能没有直接调用性能高;使用代理模式提高了代码的复杂度。举一个生活中的例子:比如买飞机票,由于离飞机场太远,直接去飞机场买票不太现实,这个时候我们就可以上携程App上购买飞机票,这个时候携程App就相当于是飞机票的代理商。18、什么是简单工厂模式?【仅供参考】答:简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝的咖啡品类的按钮(摩卡或拿铁),它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只要告诉它你的需求即可。优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象;客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。缺点:不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护。19、说一下JVM运行时数据区?【仅供参考】不同虚拟机的运行时数据区可能略微有所不同,但都会遵从Java虚拟机规范,Java虚拟机规范规定的区域分为以下5个部分:程序计数器(ProgramCounterRegister):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;Java虚拟机栈(JavaVirtualMachineStacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈(NativeMethodStack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务Java方法的,而本地方法栈是为虚拟机调用Native方法服务的;Java堆(JavaHeap):Java虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;方法区(MethedArea):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。20、Java中都有哪些引用类型?【仅供参考】强引用:发生gc的时候不会被回收。软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。弱引用:有用但不是必须的对象,在下一次GC时会被回收。虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用PhantomReference实现虚引用,虚引用的用途是在gc时返回一个通知。三、Web篇1、TCP和UDP的区别【仅供参考】1、TCP:面向连接,UDP:面向无连接2、TCP:传输效率低,UDP:传输效率高(有大小限制,一次限定在64kb之内)3、TCP:可靠,UDP:不可靠2、0SI的七层模型都有哪些?【仅供参考】物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。数据链路层:负责建立和管理节点间的链路。网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。会话层:向两个实体的表示层提供建立和使用连接的方法。表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。3、说一下tcp粘包是怎么产生的?【仅供参考】tcp粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。4、解释一下什么是aop?【仅供参考】aop是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。5、©Autowired的作用是什么?【仅供参考】@Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过@Autowired的使用来消除set/get方法。6、@RequestMapping的作用是什么?【仅供参考】将http请求映射到相应的类/方法上。7、为什么我们需要spring-boot-maven-p1ugin?【仅供参考】spring-boot-maven-plugin提供了一些像jar一样打包或者运行应用程序的命令。1、spring-boot:run运行你的SpringBooty应用程序。2、spring-boot:repackage重新打包你的jar包或者是war包使其可执行3、spring-boot:start和spring-boot:stop管理SpringBoot应用程序的生命周期(也可以说是为了集成测试)。4、spring-boot:build-info生成执行器可以使用的构造信息。8、常用注【仅供参考】这个注解是方法级别上的注解,主要添加在©Configuration或@SpringBootConfiguration注解的类,有时也可以添加在©Component注解的类。它的作用是定义一个Bean。9、springboot核心配置文件是什么?【仅供参考】springboot核心的两个配置文件:bootstrap(.yml或者.properties):boostrap由父ApplicationContext加载的,比applicaton优先加载,且boostrap里面的属性不能被覆盖;application(.yml或者.properties):用于springboot项目的自动化配置。10、什么是SpringData?【仅供参考】SpringData的使命是在保证底层数据存储特殊性的前提下,为数据访问提供一个熟悉的,一致性的,基于Spring的编程模型。这使得使用数据访问技术,关系数据库和非关系数据库,map-reduce框架以及基于云的数据服务变得很容易。为了让它更简单一些,SpringData提供了不受底层数据源限制的Abstractions接口。11、springcloud的核心组件有哪些?【仅供参考】Eureka:服务注册于发现。Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发起请求。Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。Zuul:网关管理,由Zuul网关转发请求给对应的服务。12、什么是springcloud?【仅供参考】springcloud是一系列框架的有序集合。它利用springboot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用springboot的开发风格做到一键启动和部署。13、如何重新加载SpringBoot上的更改,而无需重新启动服务器?【仅供参考】这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启动。SpringBoot有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载SpringBoot上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。SpringBoot在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。org.springframework,bootspring-boot-devtools14、SpringCloud优点?【仅供参考】集大成者,SpringCloud包含了微服务架构的方方面面。约定优于配置,基于注解,没有配置文件。轻量级组件,SpringCloud整合的组件大多比较轻量级,且都是各自领域的佼佼者。开发简便,SpringCloud对各个组件进行了大量的封装,从而简化了开发。开发灵活,SpringCloud的组件都是解耦的,开发人员可以灵活按需选择组件。15、为什么要用springboot?【仅供参考】配置简单独立运行自动装配无代码生成和xml配置提供应用监控易上手提升开发效率16、当SpringBoot应用程序作为Java应用程序运行时,后台会发生什么?【仅供参考】如果你使用EclipseIDE,Eclipsemaven插件确保依赖项或者类文件的改变一经添加,就会被编译并在目标文件中准备好!在这之后,就和其它的Java应用程序一样了。当你启动java应用程序的时候,springboot自动配置文件就会魔法般的启用了。当SpringBoot应用程序检测到你正在开发一个web应用程序的时候,它就会启动tomcato17、运行SpringBoot有哪几种方式?【仅供参考】1)打包用命令或者放到容器中运行2)用Maven/Gradle插件运行3)直接执行main方法运行18、Springboot有哪些优点?【仅供参考】-快速创建独立运行的spring项目与主流框架集成-使用嵌入式的servlet容器,应用无需打包成war包-starters自动依赖与版本控制-大量的自动配置,简化开发,也可修改默认值-准生产环境的运行应用监控-与云计算的天然集成19、SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?【仅供参考】启动类上面的注解是@SpringBootApplication,它也是SpringBoot的核心注解,主要组合包含了以下3个注解:@SpringBootConfiguration:组合了©Configuration注解,实现配置文件的功能。@Enab1eAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})。©ComponentScan:Spring组件扫描。20、SpringBoot需要独立的容器运行吗?【仅供参考】可以不需要,内置了Tomcat/Jetty等容器。四、数据处理篇1、RabbitMQ中vhost的作用是什么?【仅供参考】vhost:每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都是mini版的RabbitMQ,它拥有自己的队列,交换器和绑定,拥有自己的权限机制。2、RabbitMQ持久化有什么缺点?异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用tiy/catch/finaHy语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。4、String类可以继承吗?【仅供参考】不行。String类使用final修饰,无法被继承。5、Java创建对象有几种方式?【仅供参考】Java创建对象有以下几种方式:用new语句创建对象。使用反射,使用Class,newlnstance()创建对象。调用对象的clone。方法。运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。6、Java中操作字符串都有哪些类?它们之间有什么区别?【仅供参考】操作字符串的类有:String、StringBuffer>StringBuilderoString和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer>StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用StringoStringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffero7、为什么不能根据返回类型来区分重载?【仅供参考】如果我们有两个方法如下,当我们调用:test(1)时,编译器无法确认要调用的是哪个。//方法1inttest(inta);//方法2longtest(inta);【仅供参考】持久化的缺地就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐量。可尽量使用ssd硬盘来缓解吞吐量的问题。3、RabbitMQ集群搭建需要注意哪些问题?【仅供参考】各节点之间使用“一link”连接,此属性不能忽略。各节点使用的erlangcookie值必须相同,此值相当于“秘钥”的功能,用于各节点的认证。整个集群中必须包含一个磁盘节点。4、RabbitMQ集群中唯一一个磁盘节点崩溃了会发生什么情况?【仅供参考】如果唯一磁盘的磁盘节点崩溃了,不能进行以下操作:不能创建队列不能创建交换器不能创建绑定不能添加用户不能更改权限不能添加和删除集群节点唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西。5、RabbitMQ怎么避免消息丢失?【仅供参考】把消息持久化磁盘,保证服务器重启消息不丢失。每个集群中至少有一个物理磁盘,保证消息落入磁盘。6、RabbitMQ节点的类型有哪些?【仅供参考】磁盘节点:消息会存储到磁盘。内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型。7、Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么?【仅供参考】ISR:In-SyncReplicas副本同步队列AR:AssignedReplicas所有副本ISR是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica,lag.time.max.ms和延迟条数replica,lag.max.messages两个维度,当前最新的版本0.10.x中只支持replica.lag.time.max.ms这个维度),任意一个超过阈值都会把follower剔除出ISR,存入0SR(0utof-SyncReplicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。8、zookeeper怎么保证主从节点的状态同步?【仅供参考】zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做zab协议。zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab就进入了恢复模式,当领导者被选举出来,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。9、集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以使用吗?【仅供参考】可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。10、说一下zookeeper的通知机制?【仅供参考】客户端端会对某个znode建立一个watcher事件,当该znode发生变化时,这些客户端会收到zookeeper的通知,然后客户端可以根据znode变化来做出业务上的改变。11、kafka为什么那么快?【仅供参考】CacheFilesystemCachePageCache缓存顺序写由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。Zero-copy零拷技术减少拷贝次数BatchingofMessages批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。Pull拉模式使用拉模式进行消息的获取消费,与消费端处理能力相符。12、Kafka消息数据积压,消费能力不足怎么处理?【仅供参考】1)可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数二分区数。(两者缺一不可)2)如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间〈生产速度),使处理的数据小于生产的数据,也会造成数据积压。13、zookeeper都有哪些功能?【仅供参考】集群管理:监控节点存活状态、运行请求等。主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用zookeeper可以协助完成这个过程。分布式锁:zookeeper提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。zookeeper可以对分布式锁进行控制。命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。14、kafka中的broker是干什么的?【仅供参考】broker是消息的代理,Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一个代理保存消息的中转站。15、当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?【仅供参考】1)会在zookeeper中的/brokers/topics节点下创建一个新的topic节点,如:/brokers/topics/first2)触发Controller的监听程序3)kafkaController负责topic的创建工作,并更新metadatacache16、kafka分布式(不是单机)的情况下,如何保证消息的顺序消费?【仅供参考】Kafka分布式的单位是partition,同一个partition用一个writeaheadlog组织,所以可以保证FIFO的顺序。不同partition之间不能保证顺序。但是绝大多数用户都可以通过messagekey来定义,因为同一个key的Message可以保证只发送到同一个partitionoKafka中发送1条消息的时候,可以指定(topic,partition,key)3个参数。partiton和key是可选的。如果你指定了partition,那就是所有消息发往同1个partition,就是有序的。并且在消费端,Kafka保证,1个partition只能被1个consumer消费。或者你指定key(比如orderid),具有同1个key的所有消息,会发往同1个partitiono17、什么情况下一个broker会从isr中踢出去?【仅供参考】leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-syncReplica),每个Partition都会有一个ISR,而且是由leader动态维护,如果一个follower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其重ISR中移除。18、Redis持久化有几种方式?【仅供参考】Redis的持久化有两种方式,或者说有两种策略:RDB(RedisDatabase):指定的时间间隔能对你的数据进行快照存储。AOF(AppendOnlyFile):每一个收到的写命令都通过write函数追加到文件中。19、Redis怎么实现分布式锁?【仅供参考】Redis分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。占坑一般使用setnx(setifnotexists)指令,只允许被一个程序占有,使用完调用del释放锁。20、怎么保证缓存和数据库数据的一致性?【仅供参考】合理设置缓存的过期时间。新增、更改、删除数据库操作时同步更新Redis,可以使用事物机制来保证数据的一致性。五、MySQL数据库篇1、如何获取当前数据库版本?【仅供参考】使用selectversion()获取当前MySQL数据库版本。2、MySQL的大表查询为什么不会爆内存?【仅供参考】由于MySQL是边读变发,因此对于数据量很大的查询结果来说,不会再server端保存完整的结果集,所以,如果客户端读结果不及时,会堵住MySQL的查询过程,但是不会把内存打爆。InnoDB引擎内部,由于有淘汰策略,InnoDB管理Buffer_Pool使用的是改进的LRU算法,使用链表实现,实现上,按照5:3的比例把整个LRU链表分成了young区域和old区域。对冷数据的全扫描,影响也能做到可控制。3、数据库的三范式是什么?【仅供参考】第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。第三范式:任何非主属性不依赖于其它非主属性。4、说一下MySQL常用的引擎?【仅供参考】InnoDB引擎:mysql5.1后默认的数据库引擎,提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行selectcount(*)fromtable指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景卜.使用会提升效率的。MylASM引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和InnoDB不同的是,MylASM引擎是保存了表的行数,于是当进行selectcount(*)fromtable语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时一,并且不需要事务的支持的,可以将MylASM作为数据库引擎的首选。5、MySQL的changebuffer是什么?【仅供参考】当需要更新一个数据页时,如果数据页在内存中就直接更新;而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在changebuffer中。这样就不需要从磁盘中读入这个数据页了,在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行changebuffer中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。注意唯一索引的更新就不能使用changebuffer,实际上也只有普通索引可以使用。适用场景:-对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时changebuffer的使用效果最好。这种业务模型常见的就是账单类、日志类的系统。-反过来,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足了条件,将更新先记录在changebuffer,但之后由于马上要访问这个数据页,会立即触发merge过程。这样随机访问10的次数不会减少,反而增加了changebuffer的维护代价。6、什么是覆盖索引和索引下推?【仅供参考】覆盖索引:在某个查询里面,索引k已经“覆盖了”我们的查询需求,称为覆盖索引。覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。索引下推:MySQL5.6引入的索引下推优化(indexconditionpushdown),可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。7、索引的常见类型以及它是如何发挥作用的?【仅供参考】根据叶子节点的内容,索引类型分为主键索引和非主键索引。主键索引的叶子节点存的整行数据,在InnoDB里也被称为聚簇索引。非主键索引叶子节点存的主键的值,在InnoDB里也被称为二级索引°8、MySQL临时表的用法和特性?【仅供参考】只对当前session可见。可以与普通表重名。增删改查用的是临时表。showtables不显示普通表。在实际应用中,临时表一般用于处理比较复杂的计算逻辑。由于临时表是每个线程自己可见的,所以不需要考虑多个线程执行同一个处理时临时表的重名问题,在线程退出的时候,临时表会自动删除。9、什么是WAL技术,有什么优点?【仅供参考】WAL,中文全称是Write-AheadLogging,它的关键点就是日志先写内存,再写磁盘。MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redolog恢复,所以能够实现快速响应SQL语句。10、MySQL索引是怎么实现的?【仅供参考】索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。具体来说MySQL中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。11、binlog的概念是什么,起到什么作用,可以保证crash-safe吗?【仅供参考】binlog是归档日志,属于MySQLServer层的日志。可以实现主从复制和数据恢复两个作用。当需要恢复数据时,可以取出某个时间范围内的binlog进行重放恢复。但是binlog不可以做crashsafe,因为crash之前,binlog可能没有写入完全MySQL就挂了。所以需要配合redolog才可以进行crashsafe。12、怎么验证MySQL的索引是否满足需求?【仅供参考】使用explain查看SQL是如何执行查询语句的,从而分析你的索引是否满足需求。explain语法:explainselect*fromtablewheretype=lo13、关系型和非关系型数据库的区别?【仅供参考】关系型数据库的优点容易理解,因为它采用了关系模型来组织数据。可以保持数据的一致性。数据更新的开销比较小。支持复杂查询(带where子句的查询)非关系型数据库(NOSQL)的优点无需经过SQL层的解析,读写效率高。基于键值对,读写性能很高,易于扩展可以支持多种类型数据的存储,如图片,文档等等。扩展(可分为内存性数据库以及文档型数据库,比如Redis,MongoDB,HBase等,适合场景:数据量大高可用的日志系统/地理位置存储系统)。14、orderby排序内部原理?【仅供参考】MySQL会为每个线程分配一个内存(sort-buffer)用于排序该内存大小为sort_buffer_size;如果排序的数据量小于sort_buffer_size,排序就会在内存中完成;内部排序分为两种全字段排序:到索引树上找到满足条件的主键ID根据主键ID去取出数据放到sort_buffer然后进行快速排序rowid排序:通过控制排序的行数据的长度来让sort_buffer中尽可能多的存放数据如果数据量很大,内存中无法存下这么多,就会使用磁盘临时文件来辅助排序,称为外部排序;外部排序,MySQL会分为好几份单独的临时文件来存放排序后的数据,一般是磁盘文件中进行归并,然后将这些文件合并成一个大文件;15、redolog的执行流程?【仅供参考】我们来看下Redolog的执行流程,假设执行的SQL如下:updateTseta=1whereid=666MySQL客户端将请求语句updateTseta=1whereid=666,发往MySQLServer层。MySQLServer层接收到SQL请求后,对其进行分析、优化、执行等处理工作,将生成的SQL执行计划发到InnoDB存储引擎层执行。InnoDB存储引擎层将a修改为1的这个操作记录到内存中。记录到内存以后会修改redolog的记录,会在添加一行记录,其内容是需要在哪个数据页上做什么修改。此后,将事务的状态设置为prepare,说明已经准备好提交事务了。等到MySQLServer层处理完事务以后,会将事务的状态设置为commit,也就是提交该事务。在收到事务提交的请求以后,redolog会把刚才写入内存中的操作记录写入到磁盘中,从而完成整个日志的记录过程。16、什么是主备延迟?【仅供参考】主库和备库在执行同一个事务的时候出现时间差的问题,主要原因有:有些部署条件下,备库所在机器的性能要比主库性能差。备库的压力较大。大事务,一个主库上语句执行10分钟,那么这个事务可能会导致从库延迟10分钟。17、redolog日志格式【仅供参考】redologbuffer(内存中)是由首尾相连的四个文件组成的,它们分别是:ib_logfile_l>ib_logfile_2>ib_logfile_3>ib_logfile_4owritepos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。writepos和checkpoint之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果writepos追上checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。有了redolog,当数据库发生宕机重启后,可通过redolog将未落盘的数据
(checkpoint之后的数据)恢复,保证已经提交的事务记录不会丢失,这种能力称为crash-safe。18、Xid在MySQL内部是怎么生成的呢?【仅供参考】MySQL内部维护了一个全局变量global_query_id,每次执行语句(包括select语句)的时候将它赋值给Query_id,然后给这个变量加1。如果当前语句是这个事务执行的第一条语句,那么MySQL还会同时把Query_id赋值给这个事务的Xido而global_query_id是一个纯内存变量,重启之后就清零了。所以你就知道了,在同一个数据库实例中,不同事务的Xid也是有可能相同的。但是MySQL重启之后会重新生成新的binlog文件,这就保证了,同一个binlog文件里,Xid一定是惟一的。19、短时间提高MySQL性能的方法?【仅供参考】第一种方法:先处理掉那些占着连接但是不工作的线程。或者再考虑断开事务内空闲太久的连接。killconnection+id第二种方法:减少连接过程的消耗:慢查询性能问题在MySQL中,会引发性能问题的慢查询,大体有以下三种可能:索引没有设计好;SQL语句没写好;MySQL选错了索引(forceindex)。20、说一下MySQL的锁?【仅供参考】MySQL在server层和存储引擎层都运用了大量的锁MySQLserver层需要讲两种锁,第一种是MDL(metadatalock)元数据锁,第二种则TableLock表锁。MDL又名元数据锁,那么什么是元数据呢,任何描述数据库的内容就是元数据,比如我们的表结构、库结构等都是元数据。那为什么需要MDL呢?主要解决两个问题:事务隔离问题;数据复制问题InnoDB有五种表级锁:IS(意向读锁);IX(意向写锁);S(读);X(写);AUT0-INC在对表进行select/insert/delete/update语句时候不会加表级锁IS和IX的作用是为了判断表中是否有已经被加锁的记录自增主键的保障就是有AUT0-INC锁,是语句级别的:为表的某个列添加AUTO_INCREMENT属性,之后在插入记录时,可以不指定该列的值,系统会自动为它赋上单调递增的值。InnoDB4种行级锁RecordLock:记录锁GapLock:间隙锁解决幻读;前一次查询不存在的东西在下一次查询出现了,其方法的返回值只是作为方法运行之后的一个“状态”,但是并不是所有调用都关注返回值,所以不能将返回值作为重载的唯一区分条件。8、深拷贝和浅拷贝区别是什么?【仅供参考】浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。9、抽象类必须要有抽象方法吗?【仅供参考】不需要,抽象类不一定非要有抽象方法。示例代码:abstractclassCat{publicstaticvoidsayHi(){System,out.printin("hi〜”);上面代码,抽象类并没有抽象方法但完全可以正常运行。10、阐述final、finally、finalize的区别。【仅供参考】其实是三个完全不相关的东西,只是长的有点像。。final如上所示。finally:finally是对Java异常处理机制的最佳补充,通常配合try、catch使用,用于存放那些无论是否出现异常都一定会执行的代码。在实际使用中,通常用于释放锁、数据库连接等资源,把资源释放方法放到finally中,可以大大降低程序出错的几率。finalize:Object中的方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。finalize。方法仅作为了解即可,在Java9中该方法已经被标记为废弃,并添加新的java.lang.ref.Cleaner,提供了更灵活和有效的方法来释放资源。这也侧面说明了,这个方法的设计是失败的,因此更加不能去使用它。11、JDK/JRE/JVM三者的关系实就是事务A中的两次查询之间事务B执行插入操作被事务A感知了Next-KeyLock:锁住某条记录又想阻止其它事务在改记录前面的间隙插入新纪录InsertIntentionLock:插入意向锁;如果插入到同一行间隙中的多个事务未插入到间隙内的同一位置则无须等待行锁和表锁的抉择全表扫描用行级锁【仅供参考】JVM英文名称(JavaVirtualMachine),就是我们耳熟能详的Java虚拟机。Java能够跨平台运行的核心在于JVMo所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class文件并不直接与机器的操作系统交互,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。针对不同的系统有不同的jvm实现,有Linux版本的jvm实现,也有Windows版本的jvm实现,但是同一段代码在编译后的字节码是一样的。这就是Java能够跨平台,实现一次编写,多处运行的原因所在。JRE英文名称(JavaRuntimeEnvironment),就是Java运行时环境。我们编写的Java程序必须要在JRE才能运行。它主要包含两个部分,JVM和Java核心类库。JRE是Java的运行环境,并不是一个开发环境,所以没有包含任何开发工具,如编译器和调试器等。如果你只是想运行Java程序,而不是开发Java程序的话,那么你只需要安装JRE即可。JDKJDK目录下有个JRE,也就是JDK中已经集成了JRE,不用单独安装JRE。另外,JDK中还有一些好用的工具,如jinfo,jps,jstack等。JRE=JVM+Java核心类库JDK=JRE+Java工具+编译器+调试器12、throw和throws的区别是什么?【仅供参考】Java中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和抛出异常,可以通过throws关键字在方法上声明该方法要抛出的异常,或者在方法内部通过throw抛出异常对象。throws关键字和throw关键字在使用上的几点区别如下:throw关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。throws关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。一个方法用throws标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用throws关键字声明相应的异常。13、NoClassDefFoundError和ClassNotFoundException区别?【仅供参考】NoClassDefFoundError是一个Error类型的异常,是由JVM引起的,不应该尝试捕获这个异常。引起该异常的原因是JVM或ClassLoader尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删除了等原因导致;ClassNotFoundException是一个受查异常,需要显式地使用try-catch对其进行捕获和处理,或在方法签名中用throws关键字进行声明。当使用Class.forName,ClassLoader.loadClass或ClassLoader.findSystemClass动态加载类到内存的时候,通过传入的类路径参数没有找到该类,就会抛出该异常;另一种抛出该异常的可能原因是某个类已经由一个类加载器加载至内存中,另一个加载器又尝试去加载它。14、Java常见异常有哪些【仅供参考】java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。java.lang.InstantiationError:实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误。java.lang.ClassCastException:类造型异常。假设有类A和B(A不是B的父类或子类),。是A的实例,那么当强制将。构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。java.lang.ClassNotFoundException:找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。java.lang.ArithmeticException:算术条件异常。譬如:整数除零等。java.lang.ArraylndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。java.lang.IndexOutOfBoundsException:索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。java.lang.InstantiationException:实例化异常。当试图通过newlnstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。java.lang.NoSuchFieldException:属性不存在异常。当访问某个类的不存在的属性时抛出该异常。java.lang.NoSuchMethodException:方法不存在异常。当访问某个类的不存在的方法时抛出该异常。-java.lang.NullPointerException:空指针异常。当应用试图在要求使用对象的地方使用了null时,,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。java.lang.NumberFormatException:数字格式异常。当试图将—String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。java.lang.StringlndexOutOfBoundsException:字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于。或大于等于序列大小时,抛出该异常。15、运行时异常和一般异常(受检异常)区别是什么?【仅供参考】运行时异常包括RuntimeException类及其子类,表示JVM在运行期间可能出现的异常。Java编译器不会检查运行时异常。受检异常是Exception中除RuntimeExce
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳务分包合同简化版在实践中的应用
- 产品退换保证书范文版更贴心
- 外墙砖块装潢分包合同
- 专业台球课程设计案例
- 建设项目运营移交合同的操作流程讲解
- 项目贷款协议
- 文化产业发展合作协议样本
- 超市广告购买协议
- 酒店品质保证函
- 康复辅助器械使用
- 刘彭芝教育思想的哲学内涵记当代教育家刘彭芝(下)
- 火电厂专用英汉对照
- 现代的全面预算管理.ppt
- 道路交通安全法律法规(PPT 90页)
- (完整word版)气缸结构设计
- 土木工程常用术语英文
- MSDS(T-09)快干水2x3
- 《常用正颌外科手术》ppt课件
- 王虎应老师股市预测分析精彩卦例
- (完整版)数独题目100题
- 【原创】仁爱英语 七年级上册情景交际+看图写话(有答案)
评论
0/150
提交评论