JAVA中级面试题


  1. 面试题


一:java为什么跨平台

首先java是在jvm上运行的,比如windows系统的jdk,linux系统的jdk等或者其他的系统的jdk,java运行依赖jdk内的jvm,处处运行。

  二:你能保证GC执行吗?

不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 GC的执行。

 三:Synchronized和lock有什么区别?

1、 首先synchronized是Java内置关键字,在JVM层面,Lock是个Java类;

2、 synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

3、 synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

4. 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

四:抽象类必须要有抽象方法吗?

不是必须。抽象类可以没有抽象方法。

五:arryList的扩容机制?

ArrayList扩容发生在add()方法调用的时候, 调用ensureCapacityInternal()来扩容的, 通过方法calculateCapacity(elementData, minCapacity)获取需要扩容的长度:ensureExplicitCapacity方法可以判断是否需要扩容:ArrayList扩容的关键方法grow(): 获取到ArrayList中elementData数组的内存空间长度 扩容至原来的1.5倍

六:Mysql的调优?

  1. 业务层面的优化
  2. 代码层面
  3. Sql层面

> 在表中建立索引,优先考虑where、group by使用到的字段。

> 尽量避免使用select *,返回无用的字段会降低查询效率。

  1. 硬件层优化

七:RabbitMQ有什么优点写了rabbitmq的可以问)?

解耦、异步、削峰;

八:如何保证RabbitMQ不被重复消费?写了rabbitmq的可以问)?

先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;

但是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。

针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;

九:Redis支持哪几种数据类型?

String、List、Set、Sorted Set、hashes

十:Redis主要消耗什么物理资源?

redis是一种基于内存高性能的数据库--- 主要依赖于内存内存。

十一:Springmvc用到的设计模式有哪些?

简单工厂工厂方法单例模式适配器观察者等模式

十一:Spring中bean的生命周期

Bean的实例化和DI(dependency injection),检查Spring Awareness,创建bean生命周期回调,销毁bean生命周期回调

十三:java线程的生命周期?

新建就绪运行阻塞销毁

十四:前后端分离项目跨域怎么解决?

前端jsonp,后台提供请求过滤。

十五:假如外网访问某服务器下的静态资源比如图片?

可以提供tomcat配置文件配置图片在服务器下的地址,提供启动tomcat访问

十六:服务器部署的项目前端怎么配置可访问?

例如:nginx配置

server {

        listen       8100;

        server_name  localhost;

location / {

            root   /shengLongProject/front/water-affair-web/;

            index  index.html;

        }

 }

十七:websocket中在项目中有没有使用,怎么使用的?

按照回答来

十八:springboot常用的starter有哪些?

spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持,spring-boot-starter-data-jpa 数据库支持,spring-boot-starter-data-redis redis数据库支持,spring-boot-starter-data-solr solr支持,mybatis-spring-boot-starter 第三方的mybatis集成starter

十九:springboot如何添加【修改代码】自动重启功能?

 添加开发者工具集spring-boot-devtools

二十:什么是微服务

以前的模式是 所有的代码在同一个工程中 部署在同一个服务器中 同一个项目的不同模块不同功能互相抢占资源,微服务 将工程根据不同的业务规则拆分成微服务 微服务部署在不同的机器上 服务之间进行相互调用,Java微服务的框架有 dubbo(只能用来做微服务),spring cloud(提供了服务的发现,断路器等)

二十一:什么是 spring cloud?

spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。二十二: spring cloud 的核心组件有哪些?

Eureka:服务注册于发现。

Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。

Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。

Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

Zuul:网关管理,由 Zuul 网关转发请求给对应的服务

二十三: 什么是Ribbon?

ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。feign默认集成了ribbon。

二十四:什么是feigin?它的优点是什么?

feign采用的是基于接口的注解feign整合了ribbon,具有负载均衡的能力整合了Hystrix,具有熔断的能力
1.添加pom依赖。
2.启动类添加@EnableFeignClients
3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务

二十五: Ribbon和Feign的区别?

1.Ribbon都是调用其他服务的,但方式不同。
2.启动类注解不同,Ribbon是@RibbonClient feign的是@EnableFeignClients
3.服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
4.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign需要将调用的方法定义成抽象方法即可。

二十六:Linux的常用命令有哪些?

二十七:shiro权限表有哪些?

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>