Java面试题-2 灰太狼 2022-03-14 08:56 192阅读 0赞 ### 文章目录 ### * 1.实例方法和静态方法有什么不一样? * 2.谈谈Servlet的执行流程 * 3.谈谈你对volatile以及synchronized的理解 * 4.说说JVM内存结构,什么时候发生YGC,什么时候发生FGC * 5.谈谈你对索引的理解,为什么索引可以加快查询速度?在哪些情况下索引无效 * 6.谈谈Spring IOC和AO * 7.如何解决跨域问题? * 8.谈谈你对单点登录的理解。当用户登录之后访问了系统A与系统B,用户在系统A退出,如何实现系统B的同步退出 * 9.SOA与微服务的区别 * 10.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月兔子总数为多少?(写一个简单程序,输入想要查询的月份回车,打印出这个月的兔子总数,并将此次查询记录保存在E盘Log目录下面的log.txt文件里面) # 1.实例方法和静态方法有什么不一样? # 1.在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象.方法 "的方式。而实例方法只有后面后面这种方式。 2.静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法), 而不允许访问实例成员变量和实例方法;实例方法则无此限制。 3.程序的static块只能调用静态方法,不能调用实例的方法 原因:静态方法是随着类的加载而加载的,在编译期间静态方法的行为已经确定, 而实例方法只有在运行期间当实例确定之后才能确定。 # 2.谈谈Servlet的执行流程 # Servlet的生命周期: 1.执行servlet的构造器 2.执行init初始化方法:工程启动之后,我们第一次访问Servlet程序的时候执 行1和2两个步骤 3.执行service业务方法:每次都会执行service方法 4.执行destory销毁方法:当web工程停止的时候(重新部署) # 3.谈谈你对volatile以及synchronized的理解 # Java多线程中的原子性、可见性、有序性 1.原子性:是指线程的多个操作是一个整体,不能被分割,要么就不执行,要么 就全部执行完,中间不能被打断。 2.可见性:是指线程之间的可见性,就是一个线程修改后的结果,其他的线程能 够立马知道。 3.有序性:为了提高执行效率,java中的编译器和处理器可以对指令进行重新排 序,重新排序会影响多线程并发的正确性,有序性就是要保证不进行重新排序。 volatile:volatile是轻量级的synchronized,它在多线程开发中保证了共享变 量的“可见性”。它比synchronized的使用和执行成本更低,因为它不会引起线程上 下文的切换。 synchronized:sychronized提供了同步锁的概念,被sychronized修饰的代码 段可以防止被多个线程同时执行。因为sychronized保证了在同一时刻,只能有一个 线程执行同步代码块,所以执行同步代码块的时候相当于是单线程操作了,那么线程的 可见性、原子性、有序性它都保证。 volatile和synchronized关键字的区别: 1.volatile只能作用于变量,使用范围较小。synchronzied可以用在变量、 方法、类、同步代码块等,使用范围较广。 2.volatile之恩呢保证可见性和有序性,不能保证原子性。而可见性、有序性、 原子性synchronized都可以保证。 3.volatile不会造成线程阻塞。synchronized可能会造成线程阻塞。 # 4.说说JVM内存结构,什么时候发生YGC,什么时候发生FGC # JVM分为堆区、栈区、方法区、本地方法栈和程序计数器。堆内存逻辑上分为新生代、 养老代、永久代,新生代又法分为伊甸园区、幸存者0区和幸存者1区。 YGC:对新生代进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被 回收,性能耗费较小。 FGC:全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发FGC。以我们生 产环境为例,一般比较少会触发FGC,有时10天或者一周左右会有一次。 1.伊甸园区空间不足时,执行YGC 2.养老代空间不足,永久代空间不足,调用方法System.gc(),此时会执行FGC # 5.谈谈你对索引的理解,为什么索引可以加快查询速度?在哪些情况下索引无效 # 索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引为何加快查询的速度?=:DB在执行一条SQL语句的时候,默认的方式是根据搜索 条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索 引,查询时就会先去索引列表中一次定位到特定值得行数,大大减少遍历匹配的行数, 所以能明显增加查询的速度。 索引何时失效: 1.如果条件中有or,即使有条件带索引也不会使用(只能让or条件中的每个列都加上 索引) 2.对于多列索引,不是使用的第一部分,索引会失效 3.like查询是以%开头 4.如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引 5.如果MySQL使用全表扫描比索引快,则不使用索引 # 6.谈谈Spring IOC和AO # IOC:所谓控制反转,即由Spring来负责控制对象的生命周期和对象间的相互关系。 IOC对相互依赖对象的创建和协调工作都交由Spring容器来实现,当某个对象需要其 他协作对象时,由Spring动态的通过依赖注入的方式来提供协作对象,其只需要关注 业务本身的逻辑即可。 AOP:与AOP相对的OOP(Object Oriented Programming,面向对象编程), OOP引入封装、继承、多态等概念建立一种纵向的开发方式,而AOP则是建立了一种横 向的开发方式。对于如权限认证、日志、事务等几乎业务功能都需要的功能,若采用 OOP的设计则会产生大量的重复代码,不利于各模块的重用。 而AOP则把系统分为两部分:核心关注点和横切关注点。业务的核心处理流程为核 心关注点,与之相对的诸如上面提到的权限认证、日志、事务等则为横切关注点。AOP 思想的作用在于分离系统中的各种关注点,进一步解耦合块将的相互依赖,提高模块的 重用性。 # 7.如何解决跨域问题? # 跨域问题:当前端异步请求时,访问的请求地址的协议、ip地址、端口号任意一个与当 前站点不同时,就会涉及跨域访问。 解决方案: 1.response添加header 2.JQuery提供了JSONP思想 3.HttpClient请求转发 4.Nginx转发:利用Nginx方向代理,将请求分发到部署到相应项目的tomcat服 务器 # 8.谈谈你对单点登录的理解。当用户登录之后访问了系统A与系统B,用户在系统A退出,如何实现系统B的同步退出 # 删除Cookie和缓存中的用户数据(不确定是否为正确答案) # 9.SOA与微服务的区别 # 1.微服务剔除SOA中复杂的ESB企业服务总线,所有的业务智能逻辑在服务内部处理, 使用Http(Rest API)进行轻量化通信 2.SOA强调按水平架构划分为:前、后端、数据库、测试等,微服务强调按垂直架构划 分,按业务能力划分,每个服务完成一种特定的功能,服务即产品。 3.SOA将组件以library的方式和应用部署在同一进程中运行,微服务则是各个服务独 立运行。 4.传统应用倾向于使用统一的技术平台来解决所有问题,微服务可以针对不同业务特征 选择不同技术平台,去中心统一化,发挥各种技术平台的特长。 5.SOA架构强调的是异构系统之间的通信和解耦合;微服务架构强调的是部署,系统按 业务边界做细粒度的拆分和部署。 # 10.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月兔子总数为多少?(写一个简单程序,输入想要查询的月份回车,打印出这个月的兔子总数,并将此次查询记录保存在E盘Log目录下面的log.txt文件里面) # public class Rabbit { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); int month = scanner.nextInt(); String log =""; if (month <= 0) { log=new Date() +"---输入的月份有误"; } else { int sum = func(month); log=new Date() +"---第" + month + "个月有" + sum + "对兔子"; } System.out.println(log); FileOutputStream fos=null; try { fos=new FileOutputStream(new File("E://log.txt")); byte[] b = log.getBytes(); fos.write(b); } catch (Exception e) { e.printStackTrace(); }finally { fos.close(); } } public static int func(int month) { if (month == 1 || month == 2) { return 1; } else { return func(month - 1) + func(month - 2); } } }
还没有评论,来说两句吧...