腾讯的Java⾯试题整合
⽬录
腾讯Java⾯试题:
1、说说Java中异常的分类。
答:异常分类:
Throwable->Error,Exception
Error:严重问题,例如内存溢出
Exception->运⾏时异常:RuntimeException,编译时异常
AWTError
1、⽹络基础问题
TCP和UDP的区别,TCP为什么是三次握⼿,不是两次。
答:1、因为tcp是全双⼯协议,区别在于前者可靠,后者不可靠,以及效率更⾼。
Dubbo⾯试题
1、dubbo和dubbox之间的区别?
答:Dubbox和Dubbo本质上没有区别,名字的含义扩展了Dubbo⽽已,以下扩展出来的功能
⽀持REST风格远程调⽤(HTTP+JSON/XML);
⽀持基于Kryo和FST的Java⾼效序列化实现;
⽀持基于Jackson的JSON序列化;
⽀持基于嵌⼊式Tomcat的HTTPremoting体系;
升级Spring⾄3.x;
升级ZooKeeper客户端;
⽀持完全基于Java代码的Dubbo配置;
2、Dubbo⾯试题:⼀般使⽤什么注册中⼼?还有别的选择吗?
答:Dubbo⼀般⽤zookeeper做注册中⼼
还可以⽤:Redis,数据库,consul
JavaList⾯试题
1、ArrayList和LinkedList的区别?分别⽤在什么场景?
答:①ArrayList和LinkedList可想从名字分析,它们⼀个是Array(动态数组)的数据结构,⼀个是Link(链表)的数据结构,此外,它们两个
都是对List接⼝的实现。
前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
②当随机访问List时(get和t操作),ArrayList⽐LinkedList的效率更⾼,因为LinkedList是线性的数据存储⽅式,所以需要移动指针
从前往后依次查找。
③当对数据进⾏增加和删除的操作时(add和remove操作),LinkedList⽐ArrayList的效率更⾼,因为ArrayList是数组,所以在其中进⾏
增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进⾏数据的移动。
④从利⽤效率来看,ArrayList⾃由性较低,因为它需要⼿动的设置固定⼤⼩的容量,但是它的使⽤⽐较⽅便,只需要创建,然后添加数
据,通过调⽤下标进⾏使⽤;⽽LinkedList⾃由性较⾼,能够动态的随数据量的变化⽽变化,但是它不便于使⽤。
⑤ArrayList主要控件开销在于需要在lList列表预留⼀定空间;⽽LinkList主要控件开销在于需要存储结点信息以及结点指针信息。
场景:
链表,插⼊删除快,查找修改慢。适⽤于频繁增删的场景。
数组,查找快,插⼊删除慢。适⽤于频繁查找和修改的场景。
2、怎么给List排序?
答:List如何排序:
①:使⽤默认正序,可以传第⼆个参数⾃定义排序
②:⾃定义bean实现Comparable接⼝。
③:实现Comparator接⼝⾃定义⽐较器
JavaMap集合⾯试题
1、Collection集合接⼝和Map接⼝有什么关系?
答:没有直接关系,但是⼀些⼦类会有依赖,Collection是最基本的集合接⼝,声明了适⽤于JAVA集合(只包括Set和List)的通⽤⽅法。
Map接⼝并不是Collection接⼝的⼦接⼝,但是它仍然被看作是Collection框架的⼀部分。
2、你都知道哪些常⽤的Map集合?
答:HashMap、HashTable、TreeMap、LinkedHashMap
Spring⾯试题
1、什么是Spring的内部bean?
答:当⼀个bean只能被某⼀个类使⽤时,称该bean为内部bean。
2、为什么说Spring是⼀个容器?
答:Spring的核⼼理念就是更⽅便地管理JavaBean,⽽被管理的JavaBean存缓存在⼀个Map中,这个Map就可以理解为⽤来装
JavaBean的容器,即IOC容器
zookeeper⾯试题
1、zookeeper是什么框架?
答:ZooKeeper是⼀个分布式的,开放源码的分布式应⽤程序协调服务
JVM⾯试题:
1、说说Java虚拟机的⽣命周期及体系结构。
2、Java是如何实现跨平台的?
注意:跨平台的是Java程序,⽽不是JVM。JVM是⽤C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本
的JVM
答:我们编写的Java源码,编译后会⽣成⼀种.class⽂件,称为字节码⽂件。Java虚拟机(JVM)就是负责将字节码⽂件翻译成特定平
台下的机器码然后运⾏,也就是说,只要在不同平台上安装对应的JVM,就可以运⾏字节码⽂件,运⾏我们编写的Java程序。
⽽这个过程,我们编写的Java程序没有做任何改变,仅仅是通过JVM这⼀“中间层”,就能在不同平台上运⾏,真正实现了“⼀次编
译,到处运⾏”的⽬的。
3、什么是JVM?
解析:不仅仅是基本概念,还有JVM的作⽤。
答:JVM,即JavaVirtualMachine,Java虚拟机。它通过模拟⼀个计算机来达到⼀个计算机所具有的的计算功能。JVM能够跨计算机
体系结构来执⾏Java字节码,主要是由于JVM屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统⼀由
JVM提供者来实现。
4、JVM由哪些部分组成?
解析:这是对JVM体系结构的考察
答:JVM的结构基本上由4部分组成:
类加载器,在JVM启动时或者类运⾏时将需要的class加载到JVM中
执⾏引擎,执⾏引擎的任务是负责执⾏class⽂件中包含的字节码指令,相当于实际机器上的CPU
内存区,将内存划分成若⼲个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者PC指针的记录器
等
本地⽅法调⽤,调⽤C或C++实现的本地⽅法的代码返回结果
5、类加载器是有了解吗?
解析:底层原理的考察,其中涉及到类加载器的概念,功能以及⼀些底层的实现。
答:顾名思义,类加载器(classloader)⽤来加载Java类到Java虚拟机中。⼀般来说,Java虚拟机使⽤Java类的⽅式如下:Java
源程序(.java⽂件)在经过Java编译器编译之后就被转换成Java字节代码(.class⽂件)。
类加载器负责读取Java字节代码,并转换成类的⼀个实例。每个这样的实例⽤来表⽰⼀个Java类。通过此实例的
newInstance()⽅法就可以创建出该类的⼀个对象。实际的情况可能更加复杂,⽐如Java字节代码可能是通过⼯具动态⽣成的,也可能是
通过⽹络下载的。
6、Java虚拟机是如何判定两个Java类是相同的?
答:Java虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否⼀样。只有两者都相同的情况,才认为两个类是相同的。即
便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。⽐如⼀个Java类,编译之后⽣成了
字节代码⽂件。两个不同的类加载器ClassLoaderA和ClassLoaderB分别读取了这个⽂件,并定义出两个
类的实例来表⽰这个类。这两个实例是不相同的。对于Java虚拟机来说,它们是不同的类。试图对这两个类的对象进⾏相
互赋值,会抛出运⾏时异常ClassCastException。
7、类似-Xms、-Xmn这些参数的含义:
答:堆内存分配:
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64
JVM最⼤分配的内存由-Xmx指定,默认是物理内存的1/4
默认空余堆内存⼩于40%时,JVM就会增⼤堆直到-Xmx的最⼤限制;空余堆内存⼤于70%时,JVM会减少堆直到-Xms的最⼩限制。
因此服务器⼀般设置-Xms、-Xmx相等以避免在每次GC后调整堆的⼤⼩。对象的堆内存由称为垃圾回收器的⾃动内存管理系统回收。
⾮堆内存分配:
JVM使⽤-XX:PermSize设置⾮堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最⼤⾮堆内存的⼤⼩,默认是物理内存的1/4。
-Xmn2G:设置年轻代⼤⼩为2G。
-XX:SurvivorRatio,设置年轻代中Eden区与Survivor区的⽐值。
()和wait(n)、wait()的区别?
sleep⽅法:是Thread类的静态⽅法,当前线程将睡眠n毫秒,线程进⼊阻塞状态。当睡眠时间到了,会解除阻塞,进⾏可运⾏状态,
等待CPU的到来。睡眠不释放锁(如果有的话);
wait⽅法:是Object的⽅法,必须与synchronized关键字⼀起使⽤,线程进⼊阻塞状态,当notify或者notifyall被调⽤后,会解除
阻塞。但是,只有重新占⽤互斥锁之后才会进⼊可运⾏状态。睡眠时,释放互斥锁。
2、synchronized关键字?
1.答:底层实现:进⼊时,执⾏monitorenter,将计数器+1,释放锁monitorexit时,计数器-1;
当⼀个线程判断到计数器为0时,则当前锁空闲,可以占⽤;反之,当前线程进⼊等待状态。
含义:(monitor机制)
Synchronized是在加锁,加对象锁。对象锁是⼀种重量锁(monitor),synchronized的锁机制会根据线程竞争情况在运⾏时会有偏向
锁(单⼀线程)、轻量锁(多个线程访问synchronized区域)、对象锁(重量锁,多个线程存在竞争的情况)、⾃旋锁等。
该关键字是⼀个⼏种锁的封装。
3、volatile关键字?
答:该关键字可以保证可见性不保证原⼦性。
功能:
主内存和⼯作内存,直接与主内存产⽣交互,进⾏读写操作,保证可见性;
禁⽌JVM进⾏的指令重排序。
解析:关于指令重排序的问题,可以查阅DCL双检锁失效相关资料。
4、volatile能使得⼀个⾮原⼦操作变成原⼦操作吗?
答:能。
⼀个典型的例⼦是在类中有⼀个long类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置
为volatile。为什么?因为Java中读取long类型变量不是原⼦的,需要分成两步,如果⼀个线程正在修改该long变量的值,另⼀个线程
可能只能看到该值的⼀半(前32位)。但是对⼀个volatile型的long或double变量的读写是原⼦。
5、volatile修饰符的有过什么实践?
⼀种实践是⽤volatile修饰long和double变量,使其能按原⼦类型来读写。double和long都是64位宽,因此对这两种类型的读是分
为两部分的,第⼀次读取第⼀个32位,然后再读剩下的32位,这个过程不是原⼦的,但Java中volatile型的long或double变量的
读写是原⼦的。
volatile修复符的另⼀个作⽤是提供内存屏障(memorybarrier),例如在分布式框架中的应⽤。简单的说,就是当你写⼀个volatile变
量之前,Java内存模型会插⼊⼀个写屏障(writebarrier),读⼀个volatile变量之前,会插⼊⼀个读屏障(readbarrier)。意思就是
说,在你写⼀个volatile域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为
内存屏障会将其他所有写的值更新到缓存。
6、ThreadLocal(线程局部变量)关键字?
答:当使⽤ThreadLocal维护变量时,其为每个使⽤该变量的线程提供独⽴的变量副本,所以每⼀个线程都可以独⽴的改变⾃⼰的副本,
⽽不会影响其他线程对应的副本。
ThreadLocal内部实现机制:
每个线程内部都会维护⼀个类似HashMap的对象,称为ThreadLocalMap,⾥边会包含若⼲了Entry(K-V键值对),相应的线程被称
为这些Entry的属主线程;
Entry的Key是⼀个ThreadLocal实例,Value是⼀个线程特有对象。Entry的作⽤即是:为其属主线程建⽴起⼀个ThreadLocal实例
与⼀个线程特有对象之间的对应关系;
Entry对Key的引⽤是弱引⽤;Entry对Value的引⽤是强引⽤。
7、我们为什么要使⽤线程池?核⼼线程池内部实现了解吗?
答:
减少创建和销毁线程的次数,每个⼯作线程都可以被重复利⽤,可执⾏多个任务。
可以根据系统的承受能⼒,调整线程池中⼯作线程的数⽬,放置因为消耗过多的内存,⽽把服务器累趴下(每个线程⼤约需要1MB内存,
线程开的越多,消耗的内存也就越⼤,最后死机)
⾯试官:核⼼线程池内部实现了解吗?
答:对于核⼼的⼏个线程池,⽆论是newFixedThreadPool()⽅法,newSingleThreadExecutor()还是newCachedThreadPool()⽅
法,虽然看起来创建的线程有着完全不同的功能特点,但其实内部实现均使⽤了ThreadPoolExecutor实现,其实都只是
ThreadPoolExecutor类的封装。
1.解释AOP模块
AOP(Aspect-OrientedProgramming)指⼀种程序设计范型,该范型以⼀种称为切⾯(aspect)的语⾔构造为基础,切⾯是⼀种新的
模块化机制,⽤来描述分散在对象、类或⽅法中的横切关注点(crosscuttingconcern)。
2.有哪些不同类型的IOC(依赖注⼊)⽅式?
构造器依赖注⼊:构造器依赖注⼊通过容器触发⼀个类的构造器来实现的,该类有⼀系列参数,每个参数代表⼀个对其他类的依赖。
Setter⽅法注⼊:Setter⽅法注⼊是容器通过调⽤⽆参构造器或⽆参static⼯⼚⽅法实例化bean之后,调⽤该bean的tter⽅法,即实现
了基于tter的依赖注⼊。
3.你怎样定义类的作⽤域?
当定义⼀个在Spring⾥,我们还能给这个bean声明⼀个作⽤域。它可以通过bean定义中的scope属性来定义。如,当Spring要在需要的
时候每次⽣产⼀个新的bean实例,bean的scope属性被指定为prototype。另⼀⽅⾯,⼀个bean每次使⽤的时候必须返回同⼀个实例,这
个bean的scope属性必须设为singleton。
框架的事务管理有哪些优点?
它为不同的事务API如JTA,JDBC,Hibernate,JPA和JDO,提供⼀个不变的编程模式。
它为编程式事务管理提供了⼀套简单的API⽽不是⼀些复杂的事务API如
它⽀持声明式事务管理。
它和Spring各种数据访问抽象层很好得集成。
5.什么是SpringMVC框架的控制器?
控制器提供⼀个访问应⽤程序的⾏为,此⾏为通常通过服务接⼝实现。控制器解析⽤户输⼊并将其转换为⼀个由视图呈现给⽤户的模型。
Spring⽤⼀个⾮常抽象的⽅式实现了⼀个控制层,允许⽤户创建多种⽤途的控制器。
6.在SpringAOP中,关注点和横切关注的区别是什么?
关注点是应⽤中⼀个模块的⾏为,⼀个关注点可能会被定义成⼀个我们想实现的⼀个功能。
横切关注点是⼀个关注点,此关注点是整个应⽤都会使⽤的功能,并影响整个应⽤,⽐如⽇志,安全和数据传输,⼏乎应⽤的每个模块都需
要的功能。因此这些都属于横切关注点。
1.使⽤Spring框架的好处是什么?
答:轻量:Spring是轻量的,基本的版本⼤约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,⽽不是创建或查找依赖的对象们。
⾯向切⾯的编程(AOP):Spring⽀持⾯向切⾯的编程,并且把应⽤业务逻辑和系统服务分开。
容器:Spring包含并管理应⽤中对象的⽣命周期和配置。
MVC框架:Spring的WEB框架是个精⼼设计的框架,是Web框架的⼀个很好的替代品。
事务管理:Spring提供⼀个持续的事务管理接⼝,可以扩展到上⾄本地事务下⾄全局事务(JTA)。
异常处理:Spring提供⽅便的API把具体技术相关的异常(⽐如由JDBC,HibernateorJDO抛出的)转化为⼀致的unchecked异常。
2、Spring由哪些模块组成?
答:以下是Spring框架的基本模块:
Coremodule
Beanmodule
Contextmodule
ExpressionLanguagemodule
JDBCmodule
ORMmodule
OXMmodule
JavaMessagingService(JMS)module
Transactionmodule
Webmodule
Web-Servletmodule
Web-Strutsmodule
Web-Portletmodule
3、BeanFactory–BeanFactory实现举例。
答:Bean⼯⼚是⼯⼚模式的⼀个实现,提供了控制反转功能,⽤来把应⽤的配置和依赖从正真的应⽤代码中分离。
最常⽤的BeanFactory实现是XmlBeanFactory类。
4、什么是SpringIOC容器?
答:SpringIOC负责创建对象,管理对象(通过依赖注⼊(DI),装配对象,配置对象,并且管理这些对象的整个⽣命周期。
5、IOC的优点是什么?
答:IOC或依赖注⼊把应⽤的代码量降到最低。它使应⽤容易测试,单元测试不再需要单例和JNDI查找机制。最⼩的代价和最⼩的侵⼊性
使松散耦合得以实现。IOC容器⽀持加载服务时的饿汉式初始化和懒加载。
6、什么是基于注解的容器配置?
答:相对于XML⽂件,注解型的配置依赖于通过字节码元数据装配组件,⽽⾮尖括号的声明。
开发者通过在相应的类,⽅法或属性上使⽤注解的⽅式,直接组件类中进⾏配置,⽽不是使⽤xml表述bean的装配关系。
1、什么是SpringMVC框架的控制器?
答:控制器提供⼀个访问应⽤程序的⾏为,此⾏为通常通过服务接⼝实现。控制器解析⽤户输⼊并将其转换为⼀个由视图呈现给⽤户的模
型。Spring⽤⼀个⾮常抽象的⽅式实现了⼀个控制层,允许⽤户创建多种⽤途的控制器。
2、什么是基于注解的容器配置?
答:相对于XML⽂件,注解型的配置依赖于通过字节码元数据装配组件,⽽⾮尖括号的声明。
开发者通过在相应的类,⽅法或属性上使⽤注解的⽅式,直接组件类中进⾏配置,⽽不是使⽤xml表述bean的装配关系。
3、怎样开启注解装配?
答:注解装配在默认情况下是不开启的,为了使⽤注解装配,我们必须在Spring配置⽂件中配置元素。
4、@Required注解
答:这个注解表明bean的属性必须在配置的时候设置,通过⼀个bean定义的显式的属性值或通过⾃动装配,若@Required注解的bean属
性未被设置,容器将抛出BeanInitializationException。
5、@Autowired注解
答:@Autowired注解提供了更细粒度的控制,包括在何处以及如何完成⾃动装配。它的⽤法和@Required⼀样,修饰tter⽅法、构造
器、属性或者具有任意名称和/或多个参数的PN⽅法。
6、@Qualifier注解
答:当有多个相同类型的bean却只有⼀个需要⾃动装配时,将@Qualifier注解和@Autowire注解结合使⽤以消除这种混淆,指定需要装
配的确切的bean。
Spring数据访问
1、什么是Mybatis?
(1)Mybatis是⼀个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本⾝,不需要花费精⼒去处理加载
驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原⽣态sql,可以严格控制sql执⾏性能,灵活度⾼。
(2)MyBatis可以使⽤XML或注解来配置和映射原⽣信息,将POJO映射成数据库中的记录,避免了⼏乎所有的JDBC代码和⼿动设
置参数以及获取结果集。
(3)通过xml⽂件或注解的⽅式将要执⾏的各种statement配置起来,并通过java对象和statement中sql的动态参数进⾏映射⽣成最终
执⾏的sql语句,最后由mybatis框架执⾏sql并将结果映射为java对象并返回。(从执⾏sql到返回result的过程)。
2、Mybaits的优点?
(1)基于SQL语句编程,相当灵活,不会对应⽤程序或者数据库的现有设计造成任何影响,SQL写在XML⾥,解除sql与程序代码的耦
合,便于统⼀管理;提供XML标签,⽀持编写动态SQL语句,并可重⽤。
(2)与JDBC相⽐,减少了50%以上的代码量,消除了JDBC⼤量冗余的代码,不需要⼿动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis使⽤JDBC来连接数据库,所以只要JDBC⽀持的数据库MyBatis都⽀持)。
(4)能够与Spring很好的集成;
(5)提供映射标签,⽀持对象与数据库的ORM字段关系映射;提供对象关系映射标签,⽀持对象关系组件维护。
3、MyBatis框架的缺点?
(1)SQL语句的编写⼯作量较⼤,尤其当字段多、关联表多时,对开发⼈员编写SQL语句的功底有⼀定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
4、MyBatis框架适⽤场合?
(1)MyBatis专注于SQL本⾝,是⼀个⾜够灵活的DAO层解决⽅案。
(2)对性能的要求很⾼,或者需求变化较多的项⽬,如互联⽹项⽬,MyBatis将是不错的选择。
5、MyBatis与Hibernate有哪些不同?
(1)Mybatis和hibernate不同,它不完全是⼀个ORM框架,因为MyBatis需要程序员⾃⼰编写Sql语句。
(2)Mybatis直接编写原⽣态sql,可以严格控制sql执⾏性能,灵活度⾼,⾮常适合对关系数据模型要求不⾼的软件开发,因为这类软件
需求变化频繁,⼀但需求变化要求迅速输出成果。但是灵活的前提是mybatis⽆法做到数据库⽆关性,如果需要实现⽀持多种数据库的软
件,则需要⾃定义多套sql映射⽂件,⼯作量⼤。
(3)Hibernate对象/关系映射能⼒强,数据库⽆关性好,对于关系模型要求⾼的软件,如果⽤hibernate开发可以节省很多代码,提⾼效
率。
6、Mybatis是如何进⾏分页的?分页插件的原理是什么?
Mybatis使⽤RowBounds对象进⾏分页,它是针对ResultSet结果集执⾏的内存分页,⽽⾮物理分页。可以在sql内直接书写带有物理分页
的参数来完成物理分页功能,也可以使⽤分页插件来完成物理分页。
分页插件的基本原理是使⽤Mybatis提供的插件接⼝,实现⾃定义插件,在插件的拦截⽅法内拦截待执⾏的sql,然后重写sql,根据
dialect⽅⾔,添加对应的物理分页语句和物理分页参数。
1、Mybatis动态sql有什么⽤?执⾏原理?有哪些动态sql?
答:Mybatis动态sql可以在Xml映射⽂件内,以标签的形式编写动态sql,执⾏原理是根据表达式的值完成逻辑判断并动态拼接sql的功
能。
Mybatis提供了9种动态sql标签:trim|where|t|foreach|if|choo|when|otherwi|bind。
2、Xml映射⽂件中,除了常见的lect|inrt|updae|delete标签之外,还有哪些标签?
答:
3、为什么说Mybatis是半⾃动ORM映射⼯具?它与全⾃动的区别在哪⾥?
答:Hibernate属于全⾃动ORM映射⼯具,使⽤Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是
全⾃动的。⽽Mybatis在查询关联对象或关联集合对象时,需要⼿动编写sql来完成,所以,称之为半⾃动ORM映射⼯具。
4、MyBatis实现⼀对⼀有⼏种⽅式?具体怎么操作的?
答:有联合查询和嵌套查询,联合查询是⼏个表联合查询,只查询⼀次,通过在resultMap⾥⾯配置association节点配置⼀对⼀的类就可以完
成;
嵌套查询是先查⼀个表,根据这个表⾥⾯的结果的外键id,去再另外⼀个表⾥⾯查询数据,也是通过association配置,但另外⼀个表的查询
通过lect属性配置。
5、MyBatis实现⼀对多有⼏种⽅式,怎么操作的?
答:有联合查询和嵌套查询。联合查询是⼏个表联合查询,只查询⼀次,通过在resultMap⾥⾯的collection节点配置⼀对多的类就可以完
成;嵌套查询是先查⼀个表,根据这个表⾥⾯的结果的外键id,去再另外⼀个表⾥⾯查询数据,也是通过配置collection,但另外⼀个表的查询通
过lect节点配置
6、Mybatis的⼀级、⼆级缓存:
答:1)⼀级缓存:基于PerpetualCache的HashMap本地缓存,其存储作⽤域为Session,当Sessionflush或clo之后,该
Session中的所有Cache就将清空,默认打开⼀级缓存。
2)⼆级缓存与⼀级缓存其机制相同,默认也是采⽤PerpetualCache,HashMap存储,不同在于其存储作⽤域为
Mapper(Namespace),并且可⾃定义存储源,如Ehcache。默认不打开⼆级缓存,要开启⼆级缓存,使⽤⼆级缓存属性类需要实现
Serializable序列化接⼝(可⽤来保存对象的状态),可在它的映射⽂件中配置
3)对于缓存数据更新机制,当某⼀个作⽤域(⼀级缓存Session/⼆级缓存Namespaces)的进⾏了C/U/D操作后,默认该作⽤域下所有
lect中的缓存将被clear。
7、equal和hashcode作⽤和区别?
答:⾸先,我们要明⽩hashCode()和equals()⽅法的作⽤是什么,然后才能说他的区别,说了区别之后在说明使⽤的时候需要注意的地
⽅,这样的回答思路基本是OK的。
⼀、hahsCode()和equals()的作⽤是什么?
hahsCode()和equals()的作⽤其实是⼀样的,⽬的都是为了再java⾥⾯⽐较两个对象是否相等⼀致
⼆、hahsCode()和equals()的区别是什么?
我们可以从两个⾓度分别介绍他们的区别:⼀个是性能,⼀个是可靠性。他们的主要区别体现在这⾥
()既然已经实现⽐较两个对象的功能了,为什么还需要hashCode()呢?
因为重写的equals()⾥⼀般⽐较的较为全⾯和复杂(它会对这个对象内所以成员变量⼀⼀进⾏⽐较),这样效率很低,⽽通过hashCode()对
⽐,则只要⽣成⼀个hash值就能⽐较了,效率很⾼
2.那hashCode的效率这么⾼,为啥还要⽤equals()呢?
因为hashCode()并不是完全可靠,⾮常有可能的情况是,两个完全不同的对象的hash值却是⼀样的。
所以会有下⾯三个重要的结论:
*equals()相等的两个对象他们的hashCode()肯定相等,即equals()绝对可靠。
*hahsCode()相同的两个对象,它们的equals()不⼀定相同。即⽤hashCode()⽐较相同的时候不靠谱
*hashCode()不同的两个对象,他们的那么equals()肯定不同。即⽤hashCode()⽐较不同的时候肯定靠谱
hashCode()和equals使⽤的注意事项
1.对于需要⼤量并且快速的对⽐的话如果都⽤equals()去做显然效率太低,所以解决⽅案为:每当需要⽐较的时候,⾸先⽤hahsCode()
去对⽐,⽽如果hashCode()不⼀样,则两个对象肯定不⼀样,此时就没有必要再⽤equals()⽐较了;如果hashCode()相同,则这两个对
象有可能相同,这时候再去⽐较这两个对象的equals(),如若equals()也相同,则表⽰这两个真的相同的,这样既⼤⼤提⾼了效率,⼜保证
了准确性。
2.事实上,我们平时⽤的集合框架中的hashMap、hashSet,hashTable中对key的⽐较就是使⽤上述这种⽅法。
3.⽽Obejct默认的equals和HashCode⽅法返回的是对象的地址相关信息。所以当我们通过new关键字创建了两个内容相同的对象,虽然
他们的内容相同,但是他们在内存中分配的地址不同,导致它们的hashCode()不同,这肯定不是我们想要的。所以当我们要将某个类应⽤
到集合中去的时候,就必须重写equals()⽅法和hashCode()⽅法。
扩展
1.阿⾥巴巴开发规约明确规定:
*.只要重写了equals()⽅法,就必须重写hashCode()⽅法
*.因为Set存储的是不重复的对象,依据hashCode和equals进⾏判断,所以Set存储的对象必须重写这两个⽅法
*.如果对象定义为Map的健,那么就必须重写equals()⽅法和hashCode()⽅法
*.String重写了equals()⽅法和hashCode()⽅法,所以我们可以⾮常愉快的时候String对象作为key
2.是不是每个对象都要重写这两个⽅法,到底什么时候重写?
*.事实上⼀般情况下,我们并不需要重写这两个⽅法,只有该类被应⽤到集合框架中去的时候,才应该重写。
3.我能不能值重写equals()⽅法,不重写hashCode()⽅法?
*.如果重写了equals()⽅法,⽐如说基于对象的内容实现的,⽽保留了hashCode()的实现不改变,那么最终出现的情况很可能是,两个对象
明明是“相等的”,但是hashCode()却不⼀样,这不是宝宝想要的
4.为什么需要hashCode
*.通过hashCode可以提⾼对⽐的性能
1、如何保证单机保证3wtps访问量?
答:今天⾯试被问道⼀个问题,如何保证单机保证3wtps的访问量?
听到这个问题,第⼀反应有点蒙,想成了3w的并发量了,想了⼀下,⽬前的容器⽐如tomcat的最⼤并发量也就⼏千就扛不住了...
后来我先说IO模型使⽤NOI,能够处理⼩数据⼤并发的请求,然后从代码优化上说要尽量并⾏处理逻辑,以及优化JVM,调整堆⼤⼩,减少
FullGC,使停顿时间减少,最终使每个请求的处理时间减少。
但是也知道这个说法挺不搭题的....
后来⾯试官跟我说从两⽅⾯来分析,⼀⽅⾯是从请求上来说,将多个请求合并成⼀个请求发送,减少请求次数,⼀⽅⾯是把请求都改成
异步的,后台处理,让请求过来之后就直接返回成功。
当时感觉这两个⽅⾯说的也没问题。毕竟第⼀次出去⾯试,脑袋⽠⼦⾥有些蒙了,然后后边就是随便聊了⼀下我个⼈擅长的⽅⾯,我就
说了⼀下⾃⼰项⽬上使⽤的springCloud,的⼀些核⼼组件及注册中⼼的实现原理等,然后就没有然后了...
感觉这次⾯试基本是凉了,但是也还好,做好了准备,第⼀次⾯试当做总结经验教训了吧。
回来的路上,也⼀直在思考这个问题,有了⼀些想法:
1.⾸先从题⽬的说明上,本⾝存在⼀些问题,说的是要保证3W的tps,但是如果将请求合并了,是减少了请求次数,但是也打不到3w
的tps了啊,这样本⾝就不符合这个题⽬的要求了,所以我认为要么修改题⽬的说明,要么这个3wtps就是⼀个固定值,⽆法通过外部优化
来减少了,只能从系统内部去优化。
2.然后从系统优化来说,这个题⽬本⾝也存在⼀定的问题,就是这3w的tps到底是峰值流量还是平时流量,是需要同步给出处理结果,
还是可以接受异步的后续返回处理结果。
如果是需要同步给出处理结果,那么就只能从业务处理流程上进⾏优化,也就是尽量把串⾏的处理流程改成并⾏的处理流程,把查询尽量从
数据库改到缓存中。但是即使这样,⼀个需要同步返回结果的3wtps单机处理,每个请求的处理时间=1%3000≈0.00033秒=0.33微
妙,感觉在时间上是根本⽆法处理完⼀个业务流程的。如果⼀个业务流程⽆法处理完的话,那么请求就会出现堆积现象,堆积过多就会出现
OOM,内存溢出了...所以我个⼈感觉这个单机3W同步处理的优化是不符合现实的,只能从业务上去处理,尽量把同步的业务逻辑改成异步
的业务逻辑,即使改成异步的业务逻辑,虽然能够⽀撑住3w的tps,但是因为服务的处理速刷⽆法达到3wtps的处理速度,那么最终会造成
内存的不断消耗,最终导致OOM的出现。
3.看这个tps到底是峰值还是平时了,如果只是峰值3w,平时很低,⽽且可以使⽤异步的话,那么就可以使⽤MQ了,请求过来直接把
请求发送到MQ中去,不处理业务。然后创建消费者去消费这些消息。达到削峰填⾕⽬的。
4.计算⼀下,如果⼀个请求的处理时间是10ms,那么单线程每秒的处理速度=1000%10=100个,采⽤并⾏处理,如果是⼀个四核
⼋线程的处理器,理论上创建16个线程去处理,那么每秒的处理速度=100*16=1600个。不知道这样的计算⽅法是否正确.
2、讲⼀下模版模式和策略模式的区别?
答:模板⽅法模式的主要思想:定义⼀个算法流程,将⼀些特定步骤的具体实现、延迟到⼦类。使得可以在不改变算法流程的情况下,通过
不同的⼦类、来实现“定制”流程中的特定的步骤。
策略模式的主要思想:使不同的算法可以被相互替换,⽽不影响客户端的使⽤。
3、redis和MQ如何平滑的扩容与缩容?
答:MQ的消息是存放在内存或者磁盘中的,在缩减集群数量时,必须要迁移节点的数据。增加节点时,要重新配置集群。这么看来是⽆法
平滑缩容和扩容的。
4、MQ的消息⽣产⽐消费速度快得多,有什么解决⽅案吗?
⽣产消息⽐消费速度快得多,这个本⾝是没问题的,因为MQ的⼀个作⽤就是削峰。
如果要提⾼消费速度,可以增加多个消费者
5、feign如何实现负载均衡,与Ribbon的负载均衡有什么区别?
答:
Feign⼀般⽤Ribbon来实现负载均衡。
与Ribbon负载均衡的区别?我觉得2个是不⼀样的东西吧,Feign已经包含了Ribbon,需要配合使⽤,⼀般⽣产环境⽤的是Spring
Cloud技术来整合的,当然也可以⽤其他技术来替代。
Feign作为客户端
Ribbon作为负载均衡
Eureka作为注册中⼼
Zuul作为⽹关
Security作为安全OAuth2认证
⾸先得知道Feign和Ribbon是什么,然后具体怎么实现参考⼩马哥微服务课程,也可以看官⽹
Feign:申明式Web服务客户端
申明式:接⼝声明、Annotation驱动
Web服务:HTTP的⽅式作为通讯协议
客户端:⽤于服务调⽤的存根
假设,有⼀个Java接⼝UrService,Feign可以将其声明它是以HTTP⽅式调⽤的。
Ribbon:客户端负载均衡器,可以对HTTP和TCP客户端的⾏为进⾏控制。
Java技术、⾯试、就业交流群:929041174(新群)。
Java实操项⽬、学习资料有需求可以加美⼥⽼师微信备注“111”领取资料哦:
本文发布于:2023-03-08 05:52:44,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1678225964130466.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:腾讯面试题.doc
本文 PDF 下载地址:腾讯面试题.pdf
留言与评论(共有 0 条评论) |