Java面试题总结
一、在 Queue 中 poll()和 remove()有什么区别?
1、offer()和add()区别:
增加新项时,如果队列满了,add会抛出异常,offer返回false。
2、poll()和remove()区别:
poll()和remove()都是从队列中删除第一个元素,remove抛出异常,poll返回null。
3、peek()和element()区别:
peek()和element()用于查询队列头部元素,为空时element抛出异常,peek返回null。
二、如何让 Java 的线程彼此同步?
- synchronized
- volatile
- ReenreantLock
-
使用局部变量实现线程同步
三、你了解过哪些同步器?请分别介绍下。
1、Semaphore同步器
特征:
- 经典的信号量,通过计数器控制对共享资源的访问
- Semaphore(int count):创建拥有count个许可证的信号量
- acquire()/acquire(int num) : 获取1/num个许可证
- release/release(int num) : 释放1/num个许可证
2、CountDownLatch同步器
特征:
- 必须发生指定数量的事件后才可以继续运行(比如赛跑比赛,裁判喊出3,2,1之后大家才同时跑)
- CountDownLatch(int count):必须发生count个数量才可以打开锁存器
- await:等待锁存器
- countDown:触发事件
3、CyclicBarrier同步器
特征:
- 适用于只有多个线程都到达预定点时才可以继续执行(比如斗地主,需要等齐三个人才开始)
- CyclicBarrier(int num) :等待线程的数量
- CyclicBarrier(int num, Runnable action) :等待线程的数量以及所有线程到达后的操作
- await() : 到达临界点后暂停线程
4、交换器(Exchanger)同步器
5、Phaser同步器
https://www.cnblogs.com/pamne/p/11731797.html
2020-9-24 08:25-09:00
四、如果客户端禁止 cookie 能实现 session 还能用吗?
一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。
如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。
但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。
- 通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。
- 服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
- 通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。
五、OSI 的七层模型都有哪些?
六、在 Java 中,为什么不允许从静态方法中访问非静态变量?
- 静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
- 非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例去访问;
- 静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用。
七、请解释 Spring Bean 的自动装配?
Spring支持IOC,自动装配不用类实例化,直接从bean容器中取。
1、配置在xml中
<bean id="employeeDAO" class="com.guor.EmployeeDAOImpl" autowire="byName" />
2、@Autowired自动装配
八、请解释自动装配模式的区别?
有五种自动装配的方式,可以用来指导 Spring 容器用自动装配方式来进行依赖注入。
1、no
默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。第 402 页 共 485 页
2、byName
通过参数名 自动装配,Spring 容器在配置文件中发现 bean
的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属
性具有相同名字的 bean。
3、byType:
通过参数类型自动装配,Spring 容器在配置文件中发现 bean
的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属
性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
4、constructor
这个方式类似于 byType, 但是要提供给构造器参数,如
果没有确定的带参数的构造器参数类型,将会抛出异常。
5、autodetect
首先尝试使用 constructor 来自动装配,如果无法工作,
则使用 byType 方式。
2020-9-25 08:30-09:00
九、如何开启基于注解的自动装配?
要使用 @Autowired
,需要注册 AutowiredAnnotationBeanPostProcessor
,可以有以下两种方式来实现:
引入配置文件中的<bean>
下引入 <context:annotation-config>
<beans>
<context:annotation-config />
</beans>
在bean配置文件中直接引入AutowiredAnnotationBeanPostProcessor
<beans>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
</beans>
十、什么是 Spring Batch?
1、什么是spring batch?
spring batch是一个轻量级的、完善的批处理框架,它主要的目的在于帮助企业建立健壮、高效的批处理应用。
spring batch是Spring的一个子项目,它使用java语言并基于spring框架作为基础开发,使得已经使用Spring框架的开发者或者是企业可以更加容易访问和利用企业服务。
spring batch提供了大量可重用的组件,包括了日志、追踪、事务、任务作业统计、任务重启、跳过、重复、资源管理。
对大数据量和高性能的批处理任务,spring batch同样提供了高级功能和特性来支持。
例如:分区功能、远程功能。
总的来说,spring batch可以支持简单的、复杂的和大数据量的批处理作业。
2、spring batch业务场景
周期性的提交批处理
把一个任务并行处理
消息驱动应用分级处理
大规模并行批处理
手工或调度使任务失败之后重新启动
有依赖步骤的顺序执行(使用工作流驱动扩展)
处理时跳过部分记录
成批事务:为小批量的或有的存储过程/脚本的场景使用
十一、什么是 FreeMarker 模板?
https://blog.csdn.net/qq_35112567/article/details/100152445
十二、说说Java Bean的命名规范
(1)JavaBean 类必须是一个公共类,并将其访问属性设置为 public
(2)JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。
(3)一个javaBean类不应有公共实例变量,类变量都为private
(4)持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带匹配公用 getter 和 setter 方法的专用实例变量。
属性为布尔类型,可以使用 isXxx() 方法代替 getXxx() 方法。
通常属性名是要和 包名、类名、方法名、字段名、常量名作出区别的:
首先:必须用英文,不要用汉语拼音
1、包(package)
用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名。比如www.sohu.com 对于包名:每个字母都需要小写。比如:com.sohu.test;该包下的Test类的全名是:com.sohu.Test.Java 。
如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(default package)。
2、类
首字母大写,如果一个类由多个单词构成,那么每个单词的首字母都大写,而且中间不使用任何的连接符。尽量使用英文。如ConnectionFactory
3、方法
首单词全部小写,如果一个方法由多个单词构成,那么从第二个单词开始首字母大写,不使用连接符。addPerson
4、字段
与方法相同。如ageOfPerson
5、常量
所有单词的字母都是大写,如果有多个单词,那么使用下划线链接即可。
如:public static final int AGE_OF_PERSON = 20; //通常加上static
十三、Java Bean 属性命名规范问题分析
public class User {
private String busName;
private String pCount;
private Boolean isRunning;
//正确的命名方式,驼峰式的
public String getBusName() {
return busName;
}
public void setBusName(String busName) {
this.busName = busName;
}
//这是什么?
public String getpCount() {
return pCount;
}
public void setpCount(String pCount) {
this.pCount = pCount;
}
//这个也是不允许的
public Boolean getIsRunning() {
return isRunning;
}
public void setIsRunning(Boolean isRunning) {
this.isRunning = isRunning;
}
}
1. javabean属性命名尽量使用常规的驼峰式命名规则
2. 属性名第一个单词尽量避免使用一个字母:如eBook, eMail。
3. boolean属性名避免使用 “is” 开头的名称
4. 随着jdk, eclipse, spring 等软件版本的不断提高, 底版本的出现的问题可能在高版本中解决了, 低版本原来正常的代码可能在高版本环境下不再支持。
本文地址:https://blog.csdn.net/guorui_java/article/details/108689349