当前因为经济大环境不好,大厂裁员,就业情况差,企业要求变高了,各行各业越来越卷,尤其是程序员,处于这个阶段,感觉特别明显!
对于程序员这个群体来说,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 语句发送到数据库执行。