没有多好的开场,只有充分的知识.
开头面试官您好! 我是花城,今年 22 岁,来自于阴影,15 年毕业于五道口职业技术学院计算机与网络技术专业,毕业后一直从事软件工程行业,目前有 3 年工作经验,之前一直在深圳XX 有限公司工作,在这三年中我一直在某某公司工作,目前在后端开发管理系统。
(2)您好!我来自XXX大学,是应届毕业生,所学专业是计算机应用技术,我在校期间参加多项课余工作,参与了多个应用系统的开发与设计,熟练掌握Java开发工具和应用系统的各种开发方法。在学习与工作期间,总结与实践了各种技术实现手段,有了一些小的积累。
近期已经毕业,看到您公司的招聘信息,感觉自己的技术与能力非常合适,就投递了简历。希望能过了您这关
二丶开始介绍项目此项目所用的
开发语言:Java + vue
后台框架:Springboot
前端:Vue
数据库:MySql
开发环境:jdk
开发工具:Intellij Idea
浏览器:Chrome或360浏览器
二丶Staticspring启动器
spring-boot-starter
springboot与web相关的包
spring-boot-starter-web
mybatis-spring-boot-starter
mysql驱动
mysql-connector-java
数据库连接池
druid
被static修饰的成员会变为类成员,不需要创建对象通过类名.属性名进行调用,他是静态公共的。
三丶什么是重写?重写(Override)概念:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。(即外壳不变,核心重写!重点)
四丶方法重写的一些特性:五丶重写的作用?- 1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
- 2.子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
- 3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
重写是为了增强类的重用性和复用性,扩展性;
- 重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西,两全其美。
六丶面向对象的三大基本特征:封装、继承和多态一、封装
为什么要用封装
- 封装是改变成员变量的访问权限,改而设置一些方法如set,get来给成员变量赋值,我们可以在这些方法中规定成员变量的赋值原则,避免错误的不符合规定的的赋值。
> 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
优点:
- 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
- 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
- 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能
- 提高软件的可重用性
- 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的
二丶 继承
为什么需要继承?(extends)
- 使用继承可以有效实现代码的复用,避免重复代码的出现
- 当两个类具有相同的特征(属性)和行为(方法)时,可以相同的部分抽取出来放到一个类中作为父类,其他两个类继承这个父类。
- 继承实现了面向对象的原则:write once,only once(编写一次,且编写一次)
三丶多态
一个事物有多种不同的表现是形式,多态意味着将可能有向上转型和向下转型.
有两个好处:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
七丶Ajax的属性都有什么?url:要求为String类型的参数,(默认为当前页地址)发送请求的地址。
type:要求为String类型的参数,请求方式(post或get)默认为get。
注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持
data:要求为Object或String类型的参数,发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。
get请求中将附加在url后。防止这种自动转换,可以查看processData选项。对象必须为key/value格式,
例如{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2。
如果是数组,JQuery将自动为不同值对应同一个名称。
例如{foo:["bar1","bar2"]}转换为&foo=bar1&foo=bar2。
dataType: 要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下: xml:返回XML文档,可用JQuery处理。 html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。 script:返回纯文本Javascript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。 json:返回JSON数据。 jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。 text:返回纯文本字符串。
success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
```java
(1)由服务器返回,并根据dataType参数进行处理后的数据。
(2)描述状态的字符串。
function(data, textStatus){
//data可能是xmlDoc、jsonObj、html、text等等
this; //调用本次ajax请求时传递的options参数
}
```
error:
```java
要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下:
function(XMLHttpRequest, textStatus, errorThrown){
//通常情况下textStatus和errorThrown只有其中一个包含信息
this; //调用本次ajax请求时传递的options参数
}
```
八丶拦截器和过滤器
过滤器(Filter)
> 过滤器,是在java web中将你传入的request、response提前过滤掉一些信息,或者提前设置一些参数。然后再传入Servlet或Struts2的 action进行业务逻辑处理。比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入Servlet或Struts2的action前统一设置字符集,或者去除掉一些非法字符。
拦截器(Interceptor)
> 拦截器,是面向切面编程(AOP,Aspect Oriented Program)的。就是在你的Service或者一个方法前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
九丶拦截器与过滤器的区别区别:
1. 拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
2. 拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
3. 拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4. 拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
6. 拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
使用场景
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
十丶什么是sevlet?ervlet是web开发中的一个标准,主要是交互式地浏览和修改数据,生成动态Web内容。
- Tomcat如何与后台代码的交互流程
在此说明一下,servlet所有的生命周期是在服务器中进行的,看图1就可以明白,我们在后台的一系列操作其实都是在tomcat中wrap包装类中进行,而直接控制servlet的是context,而控制servlet的则是web容器
十一丶sevlet的生命周期
Servlet生命周期分为三个阶段:
1. 初始化阶段 调用init()方法
2. 响应客户请求阶段 调用service()方法
3. 终止阶段 调用destroy()方法
Servlet初始化阶段:
- 在下列时刻Servlet容器装载Servlet:
- 1.Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的
```java
```
- 2.在Servlet容器启动后,客户首次向Servlet发送请求
- 3,Servlet类文件被更新后,重新装载Servlet
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。
十二丶Servlet工作原理:首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。
十三丶 项目的连接池都有哪些c3p0和druid(阿里巴巴数据库)
十四丶子类初始化构造器时,父类的构造器会不会初始化初始化
十五丶统计字符串的字符出现的个数```java
public void ma(String str,String s){
ma();
int count = 0;
while(str.indexOf(s) != -1){
str =str.substring(str.indexOf(s))+ 1,str.length());
count++;
}
System.out.println("此字符串有" + count + "个" + s);
}
}
```
先建一个变量统计出现的次数(int count =0)然后用while循环来判断当前字符串里面indexOf是否包含统计的字符如果包含的话就从当前包含字符串的位置开始截取最好count++(+1)知道循环结束然后打印count
十六丶两种代理模式分别是什么CGlib动态代理
JDK动态代理
十七丶重写与重载的区别重载(Overloading)
方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
父类方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。
父类的方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
十八丶final关键字的作用十九丶mysql事务三大伴生问题可以修饰类,不能被继承
修饰方法不能被重写
修饰变量,只能赋值一次
- 1. 脏读
> 读取到未提交的数据,该数据可能在对应事务中的之后操作还有进一轮的操作,所以是"脏"的,不是最终的,不是"干净的"。
> 假设蓝色线是执行顺序,脏数据的读取情况可以如下表示。
- 2. 不可重复读
> 不可重复读是指在一个事务内,多次读同一数据,但读取到的数据不一致的情况。要注意,不可重复读要在"一个事务"中讨论。
- 3. 幻读
二十丶MYSQL 隔离级别> 举个例子: A事务修改表table中的所有数据,在A事务处理时B事务往表table中插入一条数据,从A的角度看,自己明明把所有数据都修改过了,怎么还多出来一条数据? 感觉出现了幻觉似的。
- 1. 未提交读(read uncommitted)
> 未提交读是最低级的隔离级别,一般来说都不会选择这个级别。缺点不少,优点不多。正如图所示,脏读、可不重复读、幻读都它中了招。
- 2. 已提交读(read committed)
> 保证了读到的任何数据都是提交的数据,避免读到中间的未提交的数据
- 3. 串行化(seraible)
> 最高级的隔离级别,事务都排成一队一个个执行,不会出现问题但加锁解锁的性能开销很高,一般来说不用使用这个等级的隔离级别。
- 4. 可重复读(repeatable read)
二十丶mysql索引的作用> 这是mysql默认的隔离级别。
索引是什么,首先我们可以举个例子,字典大家应该都使用过,我们可以使用目录快速定位到所要查找的内容,那么索引跟目录的作用类似,在数据库表记录中,利用索引,可以快速过滤查找到数据记录。
二十一丶索引类型分类- 2.1 普通索引
>- 加快查询速度
- 2.2 唯一索引
>- 加快查询速度,并且可以限制列值的唯一性,允许为空
>- 唯一索引包括联合唯一索引,多列形成的唯一索引,这些列可以唯一确定一条表记录,可以为空
- 2.3 全文索引
>- 主要针对文本的内容进行分词,加快查询速度
- 2.4 联合索引
>- 多列组成的索引,查询效率提升高于多个单列索引合并的效率
- 2.5 主键索引
二十二丶mysql的索引都有什么>- 主键唯一性,加快查询速度,不能为空
Mysql目前主要有以下几种索引类型:FULLTEXT(fulltext),HASH(hash),BTREE(btree),RTREE(rtree)。
HASH
- 由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。
- HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
二十三丶数据库的约束都有什么二十四丶JDBC的流程1.—-添加主键约束(将stuNo作为主键)
2.—-添加唯一约束(身份证号唯一,因为每个人的都不一样)
3.—-添加默认约束(如果地址不填默认为“地址不详”)
4.—-添加检查约束(对年龄加以限定 15-40岁之间)
5.—-添加外键约束 (主表stuInfo和从表stuMarks建立关系,关联字段stuNo)
二十五丶treemap什么特点 与hashmap的区别1. 引包:
2. 开启MySQL服务,
3. .准备好数据库
4. 进入开发阶段
5. 注册数据库驱动
6. 和数据库建立连接
7. 获得执行sql语句的对象
HashMap 代码分析:
HashMap 是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,(重点!!!!)并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
TreeMap代码分析:
基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
HashMap和TreeMap比较
(1)HashMap:适用于在Map中插入、删除和定位元素。
(2)Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
(3)HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.
(4)HashMap 非线程安全 TreeMap 非线程安全
(5)HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。
在HashMap中通过get()来获取value,通过put()来插入value,ContainsKey()则用来检验对象是否已经存在。可以看出,和ArrayList的操作相比,HashMap除了通过key索引其内容之外,别的方面差异并不大。
二十六丶动态SQL标签定义SQL语句:select insert delete update
配置java对象属性与查询结果集中列名对应关系:resultMap
控制动态SQL拼接:if foreach choose
格式化输出:where set trim
配置关联关系:collection association
定义常量及引用:sql include
二十七丶mysql的函数有哪些数值型函数:
abs 绝对值
sqrt 二次方根
floor 向下取整
rand 0~1随机数
round 四舍五入
字符串函数:
length 返回字符串的字节长度
concat 合并字符串
insert 替换字符串
lower 将字符串中的字母转换为小写
upper 将字符串中的字母转换为大写
trim 删除字符串左右两侧的空格
reverse 字符串反转
日期和时间函数:
curdate 返回当前系统的日期值
curtime 返回当前系统的时间值
now 返回当前系统的日期和时间
聚合函数:
max 最大值
min 最小值
count 统计查询结果的行数
sum 求和
avg 求平均值
流程控制函数:
二十八丶#{}和${}的区别if 判断是否为true
ifnull 判断是否为空
case 分支判断
二十九丶JDBC和mybatis的区别#{}代表的是预编译,可以预防sql注入${}字符串替换
mybatis也是基于JDBC的。Java与数据库操作仅能通过JDBC完成。 mybatis也要通过JDBC完成数据查询、更新这些动作。
三十丶maibytis文件中上的namespace的作用- mybatis仅仅是在JDBC基础上做了,OO化、封装事务管理接口这些东西。
- JDBC是地基,mybatis/Hibernate 是两栋外形各自有特点的楼房,楼房之间可以比较!地基就这一种
mybatis中为每一个映射文件添加一个namespace,这样不同的映射文件中sql的id相同也不会有冲突,只要定义在映射文件中的sql语句在该映射文件中的id唯一就可以。



