序
本文是我在春招总结的一些Java面试题及答案,知识点包括数据结构与算法、Java基础、Spring、数据库,大家可以参考复习。
数据结构
数据结构了解哪些?堆和栈的特点?
栈、队列、图、堆、数组、链表。
堆:先进后出;栈:先进先出。
数组有啥特点?链表有啥特点?
数组:大小固定,查找快,插入慢,扩充需要重新开辟空间。
链表:大小无限,查找慢,插入快,扩充灵活。
算法了解哪些?
1、排序算法:快速排序、归并排序、计数排序
2、搜索算法:回溯、递归、剪枝
3、图论:最短路径、最小生成树、网络流建模
4、动态规划:背包问题、最长子序列、计数问题
5、基础技巧:分治、倍增、二分法、贪心算法
排序算法?
排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 是否稳定 |
---|---|---|---|---|
冒泡排序 | O(n²) | O(n²) | O(1) | 是 |
选择排序 | O(n²) | O(n²) | O(1) | 不是 |
直接插入排序 | O(n²) | O(n²) | O(1) | 是 |
归并排序 | O(nlogn) | O(nlogn) | O(n) | 是 |
快速排序 | O(nlogn) | O(n²) | O(nlogn) | 不是 |
堆排序 | O(nlogn) | O(nlogn) | O(1) | 不是 |
希尔排序 | O(nlogn) | O(n^s) | O(1) | 不是 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | 是 |
基数排序 | O(N∗M) | O(N∗M) | O(M) | 是 |
贪婪算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
贪心算法一般按如下步骤进行:
建立数学模型来描述问题 。
把求解的问题分成若干个子问题 。
对每个子问题求解,得到子问题的局部最优解。
把子问题的解局部最优解合成原来解问题的一个解。
存在的问题:因为贪心算法总是从局部出发,没从整体考虑,所以不能保证解是最佳的 。
Java基础
Java三大特性?什么是多态?
封装
封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。
继承
Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,父类是子类的一般化,子类是父类的特化(具体化)。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。方法的重写、重载与动态连接构成多态性。
Java基本数据类型?占多少个字节?
基本数据类型 | 占用字节 | 类型 | 包装类 |
---|---|---|---|
byte | 1 | 整数 | Byte |
short | 2 | 整数 | Short |
int | 4 | 整数 | Integer |
long | 8 | 整数 | Long |
float | 4 | 浮点 | Float |
double | 8 | 浮点 | Double |
char | 2 | 字符 | Character |
boolean | 1 | 布尔 | Boolean |
基本数据类型和包装类的区别?
1.基本数据类型是值传递,封装类是引用传递
2.基本数据类型是存放在栈中的,而封装类是存放于堆中的
3.基本数据类型初始值如:int=0,而封装类Integer=null
4.集合中添加的元素一定是封装类引用数据类型
5.声明基本数据类型不需要实例化可直接赋值,而封装类必须申请一个存储空间实例化才可赋值。
数据库
用过哪些数据库?数据库的有哪些约束?
数据库包括关系型数据库与非关系型数据库。
关系型数据库
主要代表:Mysql、SqlServer、Oracle
优点:
容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。
使用方便,通用的SQL语句使得操作关系型数据库非常方便。
易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。
缺点:
海量数据的读写效率。
对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。
高扩展性和可用性。
在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。
非关系型数据库
主要代表:MongoDB,Redis、CouchDB
优点:
- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
关系型数据库的约束?
主键约束、唯一约束、外键约束、非空约束、检查约束、默认约束。
数据库三大范式?
第一范式
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第二范式
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
第三范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。
Redis数据类型?
Redis 数据库支持八种数据类型:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set,zset)、位图 ( bitmap)、基数统计 ( hyperLogLog )。
SQL查询每个班级排名的第二名的学生
思路:首先按班级分组,查询出每个班级的第一名。然后再查出每个班级除了第一名以外的第一名,也就是第二名了。
SELECT MAX(SCORE) AS second,class FROM student WHERE SCORE NOT IN (SELECT MAX(SCORE) FROM student group by class) GROUP BY class
Spring
Spring的两大特性?
IOC
IOC(Inversion Of Control,控制反转)的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关系业务逻辑本身就可以了。从这方面来说,创建对象的责任被反转了
DI(Dependency Injection,依赖注入)的思想是:依赖不由程序员控制,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。
AOP
AOP(Aspect Oriented Programming,面向切面编程)的思想是:够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
其他
Servlet生命周期
init() 方法
init() 方法是在创建 Servlet 对象时被调用,而且只能被调用一次,用于 Servlet 对象在整个生命周期内的唯一一次初始化。只有在 init() 方法调用成功后,Servlet 才会处于服务状态,才能够去处理客户端的请求。
service() 方法
service() 方法是 Servlet 工作的核心方法。当客户端请求访问 Servlet 时,Servlet 容器就会调用 service() 方法去处理来自客户端的请求,并把处理后的响应返回给客户端。
destroy() 方法
destory() 方法是 Servlet 容器回收 Servlet 对象之前调用的,且只会调用一次,而此时的服务器处于停止状态或者访问资源已经被移除。
Cookies与Session
Session
浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
服务器端根据name为JSESSIONID的Cookie的value去查询Session对象,从而区分不同用户。
若name为JSESSIONID的Cookie不存在(关闭或更换浏览器),会重新去创建Session,并setCookie(JSESSIONID)若name为JSESSIONID的Cookie存在,根据JSESSIONID去寻找session对象。
Session默认保留时间为30分钟,若30分钟没有请求或者退出浏览器,Session就会失效。
Cookie
- Cookie保存在浏览器中。
- 由于HTTP是无状态协议,Cookie是为了弥补这一缺陷的产物。
- Cookie会包含在HTTP请求头(Cookie字段)中发送给服务器。服务器可以通过HTTP请求头(Set-Cookie字段)向浏览器写Cookie。
- 一个Cookie包含名、值、作用域、有效时间等内容。
区别
cookie数据保存在客户端,session数据保存在服务端。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
全部评论
(4) 回帖