欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java面试题总结

程序员文章站 2022-03-10 15:26:13
一、在 Queue 中 poll()和 remove()有什么区别?二、如何让 Java 的线程彼此同步?你了解过哪些同步器?请分别介绍下。三、CyclicBarrier 和 CountDownLatch 看起来很相似,请对比下呢?四、如果客户端禁止 cookie 能实现 session 还能用吗?五、OSI 的七层模型都有哪些?六、在 Java 中,为什么不允许从静态方法中访问非静态变量?七、如何向 Spring Bean 中注入一个 Java.util.Properties?...

一、在 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 的线程彼此同步?

  1. synchronized
  2. volatile
  3. ReenreantLock
  4. 使用局部变量实现线程同步

三、你了解过哪些同步器?请分别介绍下。

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。

  1. 通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。
  2. 服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
  3. 通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

五、OSI 的七层模型都有哪些?

Java面试题总结

六、在 Java 中,为什么不允许从静态方法中访问非静态变量?

  1. 静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
  2. 非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例去访问;
  3. 静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用。

七、请解释 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