Java面试题记录

项目经验:

用过什么技术,主导过那些项目架构,怎么考虑的,有没有考虑过并发场景,怎么解决。

技术问题:

1、spring boot中有那些核心注解

Spring Boot之所以能够轻松地实现应用的创建及与其他框架快速集成,最核心的原因就在于它极大地简化了项目的配置,最大化地实现了“约定大于配置”的原则

@SpringBootApplication

实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合

@EnableAutoConfiguration

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

@Configuration

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContextAnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@ComponentScan

做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

@Conditional

​​​​​​​@Conditional是Spring4新提供的注解,通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件。Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*开头的注解,都是通过集成了@Conditional来实现相应功能的。

@Import

通过导入的方式实现把实例加入springIOC容器中。可以在需要时将没有被Spring容器管理的类导入至Spring容器中。

例如

//导入
@Import({Square.class,Circular.class})
@Configuration
public class MainConfig{}

@Component

@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository。带此注解的类被看作组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。其他类级别的注解也可以被认定为是一种特殊类型的组件,比如@Controller 控制器(注入服务)、@Service服务(注入dao)、@Repository dao(实现dao访问)。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,作用就相当于 XML配置,<bean id="" class=""/>。

2、@Resource  和 @Autowired 的区别

@Resource是j2ee提供的,默认按照ByName自动注入,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired为Spring提供的注解,只按照byType注入,如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下,会使用对象名作为最后的fallback匹配

3、beanfactory和factorybean的区别

BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似

4、有了解中那些设计模式,spring框架用到了那些设计模式?平时的开发中用的设计模式多。

设计模式总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。当然,我们还会讨论另一类设计模式:J2EE 设计模式。

序号模式 & 描述包括
1创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)
2结构型模式
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 过滤器模式(Filter、Criteria Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)
3行为型模式
这些设计模式特别关注对象之间的通信。
  • 责任链模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 备忘录模式(Memento Pattern)
  • 观察者模式(Observer Pattern)
  • 状态模式(State Pattern)
  • 空对象模式(Null Object Pattern)
  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 访问者模式(Visitor Pattern)
4J2EE 模式
这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。
  • MVC 模式(MVC Pattern)
  • 业务代表模式(Business Delegate Pattern)
  • 组合实体模式(Composite Entity Pattern)
  • 数据访问对象模式(Data Access Object Pattern)
  • 前端控制器模式(Front Controller Pattern)
  • 拦截过滤器模式(Intercepting Filter Pattern)
  • 服务定位器模式(Service Locator Pattern)
  • 传输对象模式(Transfer Object Pattern)

5、hashmap怎么解决hash冲突

HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。

hashCode按照数组格式来 存储key,如果key的hashCode冲突了 ,通过链表进行存储,当链表达到八位,jdk1.8开始,通过红黑树进行存储。

6、kafka 和 rabbitMQ, 有什么区别,kafka的偏移量是什么概念,有什么作用。

最大的区别,kafka是一种流式消息,更适合处理流式数据,为有序的。rabbitMQ,是一种异步消息队列。适合复杂业务场景,支持事务等。不保证消息顺序。

kafka吞吐量高

1)Zero Copy机制,内核copy数据直接copy到网络设备,不必经过内核到用户再到内核的copy,减小了copy次数和上下文切换次数,大大提高了效率。
  2)磁盘顺序读写,减少了寻道等待的时间。
  3)批量处理机制,服务端批量存储,客户端主动批量pull数据,消息处理效率高。
  4)存储具有O(1)的复杂度,读物因为分区和segment,是O(log(n))的复杂度。
  5)分区机制,有助于提高吞吐量。

rabbitmq可靠性更好:
  1)确认机制(生产者和exchange,消费者和队列);
  2)支持事务,但会造成阻塞;
  3)委托(添加回调来处理发送失败的消息)和备份交换器(将发送失败的消息存下来后面再处理)机制;

7、redis 的 string是怎么实现的。数据存储在什么地方。

通过c语言编写,string类似于数组。数据存储在内存中,定期维护到硬盘中。

它支持两种快照模式:
定时快照,即按一定时间将内存中的数据保存到磁盘上。
定量快照,即数据变化一定次数后将数据保存到磁盘上。

redis通过内存回收机制来回收内存,主要通过过期策略,和淘汰策略。淘汰策略就是到使用最大内存,通过算法删除一部分数据。过期策略:(1)定时过期,到达过期时间,立刻清楚。(2)惰性过期,只有访问时发现过期 才删除。(3)定期过期,每隔一定的时间,会扫描一定数量的expires字典中的key,并清除其中已过期的key。

8、mysql事物隔离级别,分布式事务怎么做

读已提交,读未提交,可重复读,序列化。分布式事务,可采用消息队列。本地数据状态表。

还有就是2pc\3pc、TCC等方式。

9、synchronized和reentrantlock的区别,volatile 关键字怎么使用。synchronized用在类和对象上有什么区别。偏向锁、自旋锁有什么区别。

偏向锁:当一个线程访问对象时,它会偏向这个线程,此时对象持有偏向锁。偏向此时访问它的第一个线程,这个线程将对象头中的ThreadID改为自己的ID,之后再次访问这个对象的时候,只需要对比ID,不需要再使用CAS再进行操作
轻量锁:当一个对象此时为偏向锁的时候,另一个线程访问这个对象,因为偏向锁不会主动释放,所以第二个线程可以看到对象此时的偏向锁状态。这时对象已经存在竞争了,此时检查原来持有该对象锁的线程是否依然存活,如果挂了,则可以将对象变为无锁状态,然后重新偏向新的线程,如果原来的线程依然存活,而且还要继续持有偏向锁,则偏向锁升级为轻量级锁。
自旋锁:当一个对象此时是轻量级锁时,当前线程持有锁并且正在使用对象,而可能很快就会执完成。所以此后另一个线程可以先等待一下(自旋),并不进入阻塞状态。
重量锁:一个自旋超过一定次数,自旋锁会升级为重量锁。或者,此时一个线程持有锁,另一个线程在自旋,第三个线程来访,此时自旋锁也会升级为重量锁。

10、mysql怎么调优,索引有哪几种类型

11、ConcurrentHashMap 怎么实现线程安全的。

12、自旋锁和偏向锁分别介绍下。

13、spring ioc实现的机制。

14、设计模式的原则,开发中设计模式基于那些原则。策略模式有用过吗

1)单一职责、里氏替换原则、依赖倒置、接口隔离、开闭原则、最少知道原则

15、jvm 内存区域有那些,怎么加载的,堆装载了什么,怎么去性能调优。

16、bean的生命周期。单线程和多线程bean区别。

17、redis怎么保证和数据库的一致性。

1)、读缓存,读到返回。

2)、读不到,加key锁,读数据库,写入缓存,释放锁。

3)、更新数据库,加redis的key锁,更新缓存,更新数据库,释放锁。

18)、springboot 怎么去解决循环依赖。

最简单的方式是通过 @Lazy

19、jvm 1.8和1.7有什么区别,新特性?

流式语法,垃圾回收区 g1 基于region 模块化,标记整理算法。

20、垃圾回收器 cms 和g1的区别

JVM虚拟机垃圾回收CMS和G1的区别_tushuping的博客-CSDN博客

21、说说看zookeeper的恢复模式,和广播模式,选举制度,zookeeper怎么做到分布式锁

面试必问:分布式事务六种解决方案 - 知乎

22、redis怎么做分布式锁、分布式事务

Redis分布式锁的实现原理 - 割肉机 - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值