面试经常被问到的问题(一)

1、String,StringBulider和StringBuffer的区别

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

  运行速度效率方面:StringBuilder > StringBuffer > String;

  在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
  String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

2、spring mvc 工作流程

面试经常被问到的问题(一)_第1张图片

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户

3、线程中,sleep()方法和wait()方法的区别

从使用角度看,sleep是Thread线程类的方法,而wait是Object顶级类的方法。

sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用。

CPU及资源锁释放

sleep,wait调用后都会暂停当前线程并让出cpu的执行时间,但不同的是sleep不会释放当前持有的对象的锁资源,到时间后会继续执行,而wait会放弃所有锁并需要notify/notifyAll后重新获取到对象锁资源后才能继续执行。

异常捕获

sleep需要捕获或者抛出异常,而wait/notify/notifyAll不需要。

4、如何避免线程死锁

本问题可以详细参考博客园的一篇文章:多线程死锁的产生以及如何避免死锁

5、http协议部分:

cookie和session的区别?

(1) cookie数据存放在客户的浏览器上,session数据放在服务器上。

(2)cookie不安全,别人可以分析存放在本地的cookie并进行cookie欺骗 考虑到安全应当使用session。

(3)session会在一定时间内保存在服务器上。当访问增多,会比较影响服务器的性能,考虑到减轻服务器性能负载,应当使用cookie。

(4)session的唯一标识jsessionid是保存在客户端cookie中的。

(5)单个cookie保存的数据有限,不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,session一般来说是没有大小限制的。

get请求和post请求的区别:

表单提交中get和post方式的区别有5点

1.get是从服务器上获取数据,post是向服务器传送数据。

2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。(这里有看到其他文章介绍get和post的传送数据大小跟各个浏览器、操作系统以及服务器的限制有关)

5.get安全性非常低,post安全性较高。

6、spring的优缺点

优点:

    非侵入式设计:spring是一种非侵入式(non-invasive)框架,它可以时应用程序对框架的依赖最小化。

   方便解耦、简化开发:spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给spring容器管理,大大降低了组件之间的耦合性。

  支持AOP:spring提供了对aop的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高程序的复用性。

  支持声明式事务处理:只需要通过配置就可以完成对事务的管理,而无须手动编程。

  方便程序的测试:spring提供了对junit4的支持,可以通过注解方便地测试spring程序。

  方便集成各种优秀框架:spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如struts、hiberna、mybatis、quarts等)的直接支持。

   降低了javaEE API的使用难度:spring对java EE开发中非常难用的一些API(如jdbc、javaMail等)都提供了封装,使这些API应用难度大大降低。

缺点:

配置过多,繁琐,应用臃肿。

开发效率。Spring这种通过XML配置的方式,很容易配置错误,影响开发效率。当然有些配置可以使用Anotation配置,但是不能完全替代XML,比如包扫描,创建多个实例都需要通过XML来配置。Spring的这种设计是一种通过XML来编程的方式。
测试效率。配置多的话,容器启动时间比较长,影响测试效率。所有有些测试,我们尽量都不启动Spring容器。

7、spring boot 的原理

原理比较复杂,回答的不清晰

8、谈谈zookerper工作原理

我自己回答的不好,可以参考一下这篇博客:https://blog.csdn.net/gs80140/article/details/51496925

9、谈谈hystrix服务熔断机制

了解的不深,回答的不好

10、谈谈寄存器的原理

这个问题没回答上来,因为自己不知道寄存器。

11、设计数据库表用什么?

用power designer(我感觉面试官是想问用什么工具)。

12.数据库维护用什么?

数据库维护的主要工作:

监视数据库的运行
数据一致性检查
磁盘空间检查

检查数据库日志
最主要的就是备份和恢复

13、接口和抽象类的区别

(1)抽象类可以有构造方法,接口中不能有构造方法。

(2)抽象类中可以有普通成员变量,接口中没有普通成员变量。

(3)抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

(4)抽象类中的抽象方法的访问类型可以是public,protected和默认default,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

(5)抽象类中可以包含静态方法(static),接口中不能包含静态方法.

(6)抽象类和接口中都可以包含静态成员变量(static),抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

(7)一个类可以实现多个接口,但只能继承一个抽象类。

  1. 简述JDBC的编程步骤?

1.加载驱动

首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-connector-java-5.1.23-bin.jar

然后就可以在java程序中用反射加载驱动

1 Class.forName(“com.mysql.jdbc.Driver”);
2.获取数据库连接,即Connectiond对象

使用java.sql.DriverManager的getConnection(String url, String user, String pass)方法获取数据库连接Connectiond对象

Connection conn = DriverManager.getConnection(url,name,password);

1 Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/dedecms”,“root”,"");
3.通过Connectiond创建statement对象,用来执行SQL

通常有三种statement对象,

createStatement() , 创建普通的statement对象,可以直接执行sql语句
如: Statement state = conn.createStatement();

prepareStatement(String sql) , 创建预编译的statement对象,支持sql语句带参数
prepareCall(String sql) , 创建能执行存储过程的statement对象
4.执行SQL语句,所有statement对象都有三个执行sql的方法

execute()可执行任何SQL语句返回boolean,表示是否返回了数据,需要通过statement对象的getResultSet()方法才能获取结果集,通过statement的getUpdateCount()方法获取影响条数
executeQuery()返回ResultSet
String sql = “select id,name from s_emp”; //“insert into s_emp(id,name) values(12,‘zhangsan’)”;
ResultSet rs = state.executeQuery(sql);

executeUpdate()执行SQL语句返回受影响记录数
5.操作结果集ResultSet

next(), previous(), first(), last(), beforeFirst(), afterLast(), absolute() 可以进行行移动

getXxx(…)可以在具体行上面,获取指定列的值,参数可以是数字索引或者是列名

while(rs.next()){
int id = rs.getInt(“id”);
String name = rs.getString(2);
System.out.println(id+" "+name);
}

6.回收数据库资源

关闭ResultSet, Statement, Connection

rs.close();
state.close();
conn.close();

如涉及到事务管理,还需要:

开始时将默认事务状态设置为false,结束前主动提交事务,执行出错要回滚事务

15、Java中为何只能单继承

多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面:
(1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量
(2)如果在一个子类继承的多个父类中拥有相同方法,子类中有没有覆盖该方法,那么调用该方法时将产生歧义,无法判断应该调用哪个父类的方法

正因为有以上的致命缺点,所以java中禁止一个类继承多个父类。单继承就是摒弃了以上两点。

16、什么是存储过程?由 什么调用?

存储过程是一个预编译的SQL语句(一组为了完成特定功能的SQL 语句集),优点是允许模块化的设计,就是说只需创建一次(存储在数据库中,经过第一次编译后再次调用不需要再次编译),以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

存储过程的优缺点:

优势:

1、提高性能
SQL语句在创建过程时进行分析和编译。 存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划,这样,在执行过程时便可节省此开销。
2、降低网络开销
存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量。
3、便于进行代码移植
数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。
4、更强的安全性
1)系统管理员可以对执行的某一个存储过程进行权限限制,避免非授权用户对数据的访问
2)在通过网络调用过程时,只有对执行过程的调用是可见的。 因此,恶意用户无法看到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。
3)使用过程参数有助于避免 SQL 注入攻击。 因为参数输入被视作文字值而非可执行代码,所以,攻击者将命令插入过程内的 Transact-SQL 语句并损害安全性将更为困难。
4)可以对过程进行加密,这有助于对源代码进行模糊处理。

劣势:

1、存储过程需要专门的数据库开发人员进行维护,但实际情况是,往往由程序开发员人员兼职

2、设计逻辑变更,修改存储过程没有SQL灵活

17、#{}和${}的区别是什么?

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

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。

你可能感兴趣的:(面试,面试经常被问到的问题(一))