面试常见问题汇总
- 值传递与引用传递
- 值传递: 在栈里创建一个对象的副本,基本数据类型就是值一样,改变对象副本并不会改变对象本身的值
- 引用传递:在栈中拷贝一个对象的地址,改变地址所指向的堆中的数据,就会影响对象本身
- "=="与equals方法的区别
- "="比较两个变量的值是否相等,也就是比较变量所对应的内存中所储存的数值是否相等,如果一个变量所指向的数据是对象类型,比较的是所对应的对象占用的内存的首地址(物理地址)
- equals方法:比较的是两个变量所对应的内容是否相同
- 静态变量与实例变量的区别
- 实例变量属于每个对象属性,必须创建实例对象.而静态变量是属于类,只要程序加载了这个类,静态变量就可以被使用.
- 静态变量使用的是同一个对象,能同步.而实例变量创建对象时内容会被重置
- Integer和int的区别
- Interger为封装类,int为基本数据类型
- Interger默认值为null,在JSP开发中用el表达式显示为空白字符串,int默认值为0,在JSP开发中用el表达式显示为空白字符串
- 重载与重写的区别
- 重载: 方法名相同,参数列表不同,返回值不同,异常只少不多
- 重写:方法名相同,参数列表不同,返回值相同,异常一致或其子类
- 面向对象的特征
- 封装: 把客观事物封装成抽象的类
- 继承: 可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
- 多态: 允许你将父对象设置成为和一个子对象相等,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作
- 抽象: 将数据,方法整合到一个类里面,并且希望使用者只使用方法去操作数据成员,而且希望哪些方法应该被类使用者调用。
- 抽象类与接口的区别
- 一个类只能继承一个抽象类但可以实现多个接口
- 抽象类里可以包含非 抽象方法,但接口里都是抽象方法
- 抽象类可以有构造方法,但接口不能有构造方法
- 抽象类可以有成员变量,接口不能有成员变量
- 抽象类中可以包含静态方法,接口中不行
- 抽象类和接口中都可以有静态成员变量但抽象类中的静态成员变量访问类型任意,而接口中只能为public static final类型
- 抽象类中抽象方法的修饰符为public和protected 而接口中只能为public
- Java中的集合
-
Java中的集合分为value和key-value(Collection,Map)两种
-
实现Collection接口的List,Set,List接口实现类ArrayList LinkedList,Vector,set接口实现类 HashSet,TreeSet,LinkedHashSet
-
- ArrayList与Vector的区别
-
Vector线程安全 ArrayList线程不安全
-
Vector自增1倍,ArrayList自增0.5倍
-
- ArrayList与LinkedList的区别
- 数据结构: ArrayList是动态数组的形式,而LinkedList是双向链表的形式
- 在读取集合中的元素是ArrayList的速度较快,而在插入以及修改时LinkedList的速度较快
- Oracle 与Mysql中如何分页
- select * from (select rownum r,查询列 from 表名 where rownum<(pageNumber*pageSize))where r>(pageSize*(pageNumber-1))
- select * from 表名 limit pageSize*(pageNumber-1) pageSize
- 数据库连接方式
- 内连接 : 只显示所匹配到的行
- 左外连接: 包含左边表的所有行以及右边表所匹配的行
- 右外连接: 包含右边表的所有行以及左边表所匹配的行
- 全外链接: 包含左右两个表的全部行,不管另一边的表中是否存在与他们匹配的行
- oracle中储存过程与储存函数的区别
- 可以聊理解函数是储存过程中的一种
- 函数可以没有参数但一定有一个返回值.储存过程可以没有参数,不需要返回值
- 函数return返回值没有返回参数模式,储存过程通过out参数返回值,如果返回多个参数,建议使用储存过程
- 在sql语句中只能调用函数而不能调用储存过程
- oracle中drop、delete和truncate区别
- delete 和truncate都是删除表的内容而不删除表结构,而drop 是删除表结构和数据
- 使用delete删除数据可被找回,支持单行删除
- 使用truncate删除数据无法恢复
- where和having的区别
- where 是指定行条件,having是指定组条件
- where后面不可以使用函数,having后面可以使用函数
- 从效率上说where比having快,所有应该先用where再用having
- 数据库的储存过程的好处
- 储存过程只在创建时编译,以后使用不需要再编译,大大提高数据库执行效率
- 复杂的业务逻辑需要多条sql语句,使用储存过程可以减少网络传输,降低网络负载
- 储存过程一次创建可多次使用
- 安全性高
- 三层架构的优缺点
- 开发者只需要关注整个架构的这一层
- 降低层与层之间的依赖
- 各层逻辑复用
- 降低后期维护成本与时间
- 降低系统性能,三层访问
- 级联操作,增加一个功能其他层也要增加相应的代码
- 在JavaScript中什么是为声明的变量和未定义的变量
- 未声明的变量: 在程序中不存在运行会报错
- 未定义的变量:声明未赋值运行返回undefined
- 在JavaScript中== 与 ===是什么意思
- =:值相等,如果值的类型不同会先进行类型转换为同一类型再进行比较 null==undefined
- ===:类型不同一定不相等,数值类型比较数值,字符串每个位置都要一样
- get和post请求的区别
- get请求:在url中明文显示,参数数据量最大2KB,效率高,安全性差
- post请求:在url中不显示参数,参数数据量大,效率较低,安全性高
- request转发和response重定向的区别
- 转发:地址栏中url地址不发生改变,可以保存对象,一次请求
- 重定向:地址中url地址发送改变,不可保存对象,两次请求
- include指令与include动作的区别
- 语法格式: 指令是
<% include file="url" %>
动作是<jsp:include page="url"
- 发生作用的时间: 指令是在页面转换时,动作实在请求期间
- 转换成Servlet: 指令是在两个页面转换一个Servlet,动作是两个页面转换Servlet
- 执行时间:指令编译慢执行快,动作编译快执行慢
- 语法格式: 指令是
- http的无状态性
浏览器发送请求到服务器,当再次访问时服务器不知道是刚刚那个浏览器,服务器不会刻意去记忆你 - jsp的九大内置对象和四大作用域
- 九大内置对象:
requset
response
page
out``application``session``config``pageContext``cookie``exception
- 四大作用域:
request``session``page``application
- 九大内置对象:
- jsp和Servlet的区别
- jsp编译后变成Servlet
- jsp更擅长页面显示,Servlet更擅长逻辑控制
- Servlet没有内置对象,Jsp有内置对象
- session与cookie的区别
- cookie存放于客户浏览器,session存放于服务器
- cookie不安全,session相对安全
- cookie保存数据量不得超过4k,session访问增多会占用服务器性能
- 关系型数据库与非关系型数据库的区别
- 储存方式:SQL是以表的形式,而NoSQL比较灵活
- 数据关系:SQL中必须定义好表才能添加数据,NoSQL不需要先定义表
- 数据耦合性:SQL中不允许删除已经被使用的外部数据,NoSQL中可以随时删除任何数据
- 查询性能: SQL中数据储存在硬盘速度较慢,NoSQL数据储存在缓存
- 数据库连接池工作机制
- 服务器启动时会建立一定数量的池连接并维持连接数
- 当客户端需要连接时会返回一个未使用的连接,若当前没有空闲的连接会再建一定数量的连接
- 当使用的池连接被调用完后,池驱动程序将次连接标记为空闲,其他程序就可以调用这个连接了
- SpringMVC的工作流程
- 客户端发出请求,前端控制器进行拦截
- 前端控制器调用处理器映射器HandlerMapping查找handler
- 处理器映射器根据uri查找对应的handler返回给前端控制器
- 前端控制器调用处理器适配器handlerAdapter执行handler,返回ModelAndView
- 前端控制器调用视图解析器解析成一个View
- 前端控制器渲染视图响应客户端
- 数据库事务的特性
- 原子性: 所有操作要么全部成功要么全部失败
- 一致性: 执行前和执行后必须处于一个一致性的状态
- 隔离性: 多个用户同时访问同一个数据库,数据库会为每个用户开启一个事务,不会被其他事务所干扰
- 持久性: 事务一旦被提交不可更改
- 数据库中的各种读
- 脏度: 一个事务处理过程中读取到了另一个未提交的数据
- 不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。
- 幻读: 事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
- 不可重复读和幻读差别: 前者针对的是update或delete,后者针对的insert。
- 数据库优化
- 定位慢查询:开启mysql的slow_query_log 设置慢查询时间(oracle使用sql查询出查询次数最多的sql语句和最慢的sql)
- 创建索引
- 分表: 当一张表数据比较多或者某些字段的值比较多并且很少使用(按时间分表,按区间分表,按hash分表)
- 读写分离: 一台服务器不能满足需要时采用读写分离进行集群(改变数据库的操作往主数据库去,其他服务器同步该数据库)
- 缓存: 采用redis,mybatis的二级缓存
- 定位慢查询:开启mysql的slow_query_log 设置慢查询时间(oracle使用sql查询出查询次数最多的sql语句和最慢的sql)
- sql语句优化
- 避免使用select *
- sql语句大写 oracle先解析后执行
- 合理使用like 避免在关键词前加"%"
- 批量添加,多次提交变一次提交
2019-07-05面试
- 说说你对Spring的理解
- Spring有一个实现了工厂模式的工厂类,我们可以使用注解或者配置文件的方式通过bean工厂创建实例对象
- Spring提供了对IOC的支持,将创建实例对象的权力交给第三方IOC容器,实现方式为依赖注入:构造方法,接口注入,setter注入
- Spring提供了对AOP技术良好的封装,AOP称为面向切面编程,就是系统中有许多不相关的类的方法,在众多方法中要加入某种系统功能代码,例如:加入日志,加入权限判断,加入异常处理
- Spring的好处
- 方便解耦,简化开发:将对象之间的依赖关系交由Spring进行控制
- AOP编程的支持
- 声明式事务的支持
- 方便程序的测试
- 方便集成了各种优秀的框架
- 降低对JavaEE API的使用难度
- Spring的源码是经典学习的范例
- Mysql的好处(还是mybatis的好处记不太清楚)
- mysql的好处
- 核心线程多线程支持多处理器
- 支持多种数据类型
- 支持OrderBy GroupBy子句,支持多种函数
- 可以工作在不同的平台,支持多种编程语言
- mybatis的好处
- 易上手和掌握
- sql写在xml中易于管理
- 解除sql与程序代码的耦合
- 提供映射标签,支持对象与数据库的ORM字段关系映射
- 支持编写动态sql
- mysql的好处