《Java程序员面试宝典》——(第二章节)

当前因为经济大环境不好,大厂裁员,就业情况差,企业要求变高了,各行各业越来越卷,尤其是程序员,处于这个阶段,感觉特别明显!

对于程序员这个群体来说,java程序员的占比就非常之高,就业市场等于说是千军万马过独木桥,简直可以说是太难了!在这里想说的是,大环境已经这样了,我们已经也无法左右这个市场,根本没有选择的余地,所以,努力的提升自己技术能力最重要。

1、final、finally、finalize 有什么区别?

final:修饰类时表示不能被继承;修饰方法时表示不能被重载;修饰变量时表示不能被修改。

finally:在异常处理时提供finally代码块来执行异常处理。

finalize:是方法名,java允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。

2、Java语言中有哪些常见的访问说明符?
Java中的访问说明符是放在类名之前,用于定义访问范围的关键字,常见的访问说明符有以下几类:

Public:公共,能被项目中的任何一个Class、Method、Field访问。

Protected:受保护,能被同类或子类访问,不能从外部访问。

Default:默认,只能被同一个包的Class、Method、Field访问。

Private:私有,只能被本类访问。

3、什么是Java Packages?其意义是什么?
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用:

1)把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

2)如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

3)包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

4、continue和break语句有什么区别?
break和continue都是循环中的重要关键词,break语句是结束整个循环过程,continue语句只结束本次循环,而不是终止整个循环的执行。

5、什么是循环?Java中有哪些循环?
循环用于编程中重复执行语句,Java中的循环有三类:
1)for循环

for循环用于执行指定重复次数的语句,当程序员明确知道循环次数可以使用for循环。

2)While循环

当语句满足条件时开始进行重复执行,直到语句不再满足条件退出循环。While循环中在执行语句之前先检查是否满足条件。

3)do while循环

Do while 和while循环基本类似,唯一不同的是do while是先执行语句再检查条件,也就是说do while循环至少会执行一次语句。

6、Java中的double和float变量有什么区别?
float是单精度浮点数,内存中占用4字节,double是双精度浮点数,内存中占用8字节。

7、Java内部类和子类之间有什么区别?

内部类是指在一个外部类的内部再定义一个类,内部类对外部类有访问权限,可以访问类中定义的所有变量和方法。

子类是从父类(superclass)中继承的类,子类可以访问父类所有public和protected的字段和方法。

8、throw 和 throws 的区别?
在Java中,throw和throws是两个关键字,用于处理异常。
1)throw关键字:

- throw关键字用于在代码中手动抛出异常。它通常用于在程序中检测到错误或异常情况时,主动抛出一个异常对象。

- throw关键字后面跟着一个异常对象,可以是Java内置的异常类,也可以是自定义的异常类。

- 一旦throw语句执行,程序将立即停止执行当前方法,并且异常将被传递给调用该方法的地方进行处理。

2) throws关键字:

- throws关键字用于在方法声明中指定该方法可能抛出的异常类型。它告诉调用者该方法可能会抛出某些异常,需要进行相应的异常处理。

- throws关键字后面跟着一个异常类型列表,多个异常类型之间用逗号分隔。

- 当一个方法使用throws关键字声明了异常类型时,调用该方法的地方必须进行异常处理,要么使用try-catch语句捕获异常,要么继续使用throws关键字将异常传递给上层调用者。

- throw关键字用于手动抛出异常,throws关键字用于声明方法可能抛出的异常类型。

- throw关键字后面跟着一个异常对象,throws关键字后面跟着一个异常类型列表。

- throw关键字用于方法内部,throws关键字用于方法声明中。

- throw关键字会立即停止当前方法的执行,将异常传递给调用者,而throws关键字只是声明可能抛出异常,不会中断方法的执行。

9、如何避免 sql 注入?
SQL注入是Web开发中最常见的一种安全漏洞,可以用它来从数据库获取敏感信息,进行数据库的一系列非法操作。

校验参数的数据格式是否合法

对进入数据库的特殊字符进行转义处理,或编码转换

预编译SQL,参数化查询方式,避免SQL拼接

10、spring mvc 和 struts 的区别是什么?

拦截机制不同

Struts2是类级别的拦截,每次请求就会创建一个Action

SpringMVC是方法级别的拦截,一个方法对应一个Request上下文。

底层框架不同

Struts2采用Filter实现,SpringMVC采用Servlet实现

性能不同

Struts2需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截。

所以,SpringMVC开发效率和性能高于Struts2

配置方面

SpringMVC 和 Spring 是无缝的,从这个项目的管理和安全上也比Struts2高。

11、讲一下 session 的工作原理?

客户端登录完成之后,服务器会创建相应的session,session创建完成之后,会把session的id发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着sessionid,服务器拿到sessionid之后,在内存找到与之对应的session就可以正常工作了。

12、如果客户端禁止 cookie,session 还能用吗?

如果浏览器禁用了cookie,那么客户端访问服务端时无法携带sessionid,服务端无法识别用户身份,便无法进行会话控制,session就会失效,但是可以通过其他办法实现:

通过URL重写,把sessionid作为参数追加的原URL中,后续的浏览器与服务器交互中携带session

服务器的返回数据中包含sessionid,浏览器发送请求时,携带sessionid参数

13、session 和 cookie 有什么区别?
Session存储在服务器端,适用于存储长期有效数据;Cookie存储在客户端,适用于少量临时数据。
两者安全性不同,Session更安全。选择取决于需求和安全考虑,可同时使用。
Cookie可以设置过期时间,一旦过期就会自动删除。而Session的生命周期通常由服务器控制,当用户关闭浏览器或一定时间没有活动时,Session会自动过期。

14、jsp 的 4 种作用域?
application:在所有应用程序中有效

session:在当前会话中有效;

request:在当前请求中有效;

page:在当前页面有效

15、jsp 有哪些内置对象?作用分别是什么?
request:用户端请求(get/post)

response:网页传回用户端的响应

pageContext:管理网页的属性

session:与请求有关的会话期

application servlet正在执行的内容

out:用来传送回应的输出

config: servlet的架构部件

page :网页本身

exception:针对错误网页,未捕捉的例外

16、 jsp 和 servlet 有什么区别?

Jsp:Java Server Page,是一种动态页面技术,其根本是一个简化的Servlet设计,用来封装产生动态网页的逻辑处理。

Servlet:服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求与服务器响应的中间层。

相同点:jsp经编译后就变成了Servlet,jsp本质就是servlet,jvm只能识别java的类,不能识别jsp代码,web容器将jsp的代码编译成jvm能够识别的java类。

17、get 和 post 请求有哪些区别?
get是从服务器上获取数据;post是向服务器传送数据

get请求通过URL直接请求数据,数据信息可以在URL中看到;post请求是放在请求头中的,用户看不到;

get传送的数据量小,有限制,不能大于2kb,post传送的数据可以没有限制

get安全性比较低,post相对较安全

18、 forward 和 redirect 的区别?

redirect是客户端发起的请求;forward是服务端发起的请求

redirect浏览器显示被请求的URL;forward浏览器地址不显示被请求的URL

redirect重新开始一个request,原页面的request生命周期结束;

forward另一个连接的时候,request变量是在其生命周期内的。

redirect实质上是两次HTTP请求;forward是一次请求

19、 简述 tcp 和 udp的区别?

TCP是面向连接的,TCP提供可靠的服务,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。

UDP是无连接的,不可靠,但是速度快,操作简单,要求系统资源较少,可以实现广播发送。

TCP是面向字节流的,UDP是面向报文的;TCP是全双工的可靠信道,UDP是不可靠信道

20、常见的异常类有哪些?
NullPointerException、SQLException、IndexOutOfBoundException、NumberFormatException、
FileNotFoundException、IOException、IllegalArgumentException、NoSuchMethodException

21、try-catch-finally 中哪个部分可以省略?

catch 和 finally可以被省略其中一个,finally代码块是无论是否捕捉到异常,都会执行finally代码块的逻辑。

22、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

捕获到异常后,不会直接返回,会先执行完finally代码块的语句然后继续执行catch代码块中的return。

23、OSI 的七层模型都有哪些?
OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型。该体系结构标准定义了网络互连的七层框架,由低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,即OSI开放系统互连参考模型。

24、mybatis 中 #{}和 ${}的区别是什么?

#{}是预编译处理,${}是字符串替换

使用#{}可以预防SQL注入

25、mybatis 有几种分页方式?

数组分页

SQL分页

拦截器分页

26、mybatis 逻辑分页和物理分页的区别是什么?

逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据,这样做的弊端是需要消耗大量的内存,有内存溢出的风险,对数据库压力较大。

物理分页是从数据库查询指定条数的数据,弥补了一次性查出所有数据的缺点。

27、mybatis 是否支持延迟加载?延迟加载的原理是什么?

支持。设置lazyLoadingEnable=true即可

延迟加载的原理是调用的时候触发加载,而不是在初始化的时候就加载信息。

28、mybatis 和 hibernate 的区别有哪些?

Mybatis入门比较简单,使用门槛也更低

SQL直接优化上,Mybatis要比Hibernate方便

Hibernate数据库移植性远大于Mybatis

缓存机制上,hibernate要比mybatis更好一些

29、mybatis 分页插件的实现原理是什么?

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

30、说一下mybatis 的一级缓存和二级缓存?
mybatis包含了一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存。缓存可以极大的提高查询的效率

mybatis系统当中默认定义了两级缓存:一级缓存和二级缓存

一级缓存:默认情况之下,只有一级缓存开启(sqlSession级别的缓存)

二级缓存:需要手动开启配置,需要局域namespace级别的缓存。

一级缓存是sqlsession级别的缓存,也叫本机缓存,因为每一个用户来执行查询的时候都需要sqlsession来执行。为了避免每次都去查询数据库。mybatis把缓存的数据存到sqlsession的本地缓存里面,如果sqlsession里面有的可以直接从本地缓存去读取查询的数据。要是想实现跨sqlsession这个级别的话,需要用到二级缓存。就是当多个用户去查询数据的时候,只要有任何一个sqlsession拿到了数据,就会放入到二级缓存里面,其它的sqlsession可以直接从二级缓存里面查询数据。

需要注意的是,如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。

31、什么是 ORM 框架?

ORM(Object Relation Mapping)对象关系映射

通过类与数据库表的映射关系,将对象持久化到数据库中

常见的ORM框架有Hibernate、Mybatis

32、MyBatis 动态 sql 有什么用?执行原理?有哪些动态 sql?

动态 SQL 允许你根据不同的条件构建灵活的 SQL 语句。对于一些条件查询尤其重要,比如当某个值不为空时带上这个条件来查询。
原理如下:
动态 SQL 的执行基于 XML 映射文件中定义的 SQL 片段与标签,如 if、choose、when、otherwise、where、foreach等,这些标签被解析,在运行时根据传入的参数值评估,最
终形成完整的 SQL 语句发送到数据库执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值