文章目录
- java面试题笔记
- java基础部分
- JAVA的跨平台原理
- 搭建java开发环境的步骤
- java基本数据类型
- 面向对象的特征
- 重载与重写
- 装箱与拆箱
- “==”与equals的区别
- String,String Builder,String Buffer
- 集合
- 字节流和字符流
- 线程
- 设计模式
- Java Web部分
- 数据库部分
- 数据库分类和常用的数据库
- 关系型数据库的三范式
- 事务
- mysql分页和oracle分页
- 触发器
- 存储过程
- jdbc进行数据库操作
- jdbc中PreparedStatement相比Statement的好处
- 连接池的作用
- 前端部分
- 简单说明html、css、javascript在网页开发中的定位
- 简单介绍一下ajax
- js与jquery的关系
- jquery的常用选择器
- jquery的页面加载完毕事件
- jquery的ajax和原生js实现的ajax有什么关系
- bootstrap
- 框架部分
java面试题笔记
java基础部分
JAVA的跨平台原理
对于不同的系统,有相对应的不同的java虚拟机(JVM),JVM会屏蔽不同系统指令的差异,对外提供统一的接口(java API),以实现跨平台。
搭建java开发环境的步骤
- 适用于操作系统的jdk
- 开发IDE:idea、eclipse等
- java web开发:tomcat服务器
java基本数据类型
java基本数据类型有8种:
基本数据类型 | 字节数 |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
char | 2 |
boolean | 1/8 |
面向对象的特征
面向对象的特征有4个:抽象、封装、继承、多态
- 抽象:将现实生活中的对象某些共有的特征抽象成属性,行动抽象成方法
- 封装:将属性和方法封装在一个模块中,也就是一个类
- 继承:一个类可以派生出子类,子类可以继承父类所有非私有的属性和方法,还可以进行扩展
- 多态:对象调用的方法在编译时是无法确认的,只有在运行的时候才会确认。体现在重写和重载
重载与重写
1.重载:相同的函数名,参数不同(参数类型,个数,顺序不同)
- 重写:继承关系中,子类对父类某方法的重写
装箱与拆箱
装箱:将基本数据类型转换成包装类型
拆箱:将包装类型转换成基本数据类型
实际上,运行时会进行自动装箱拆箱
“==”与equals的区别
- ==,对于基本数据类型,直接进行比较,对于引用类型的对象,比较的是内存的首地址是否相同
- equals,比较的是内存中存储的值是否相同。
原因:基本数据类型直接存储在栈中,引用类型存储在栈中,其存储地址存储在栈中
String,String Builder,String Buffer
- String内容不可变,底层由字符数组实现,final char[]
- String Builder内容可变,线程不安全
- String Buffer内容可变,线程安全
集合
集合引入的原因
数组的弊端:
- 只可以存储同一种类型的数据;
- 一旦定义以后,长度不可改变
集合的大分类
集合的分类有两种:
- Collection:只存储值value
- Map:存储键值对key-value
Collection
Collection只存储值value,这种存储方式的集合有两类:
- List:有序的,可重复的
- Set:无序的,不可重复的
List
List存储的数据是有序的,可重复的,派生了两种子类:
- ArraysList:底层实现是数组
- LinkedList:底层实现是链表
一、 ArraysList
底层实现是数组,查找快,插入和删除效率较低
二、 LinkedList
底层实现是链表,查找慢,插入和删除效率较高
数组和链表的区别:
- 存储位置的不同:数组相邻位置的元素在物理空间上也是相邻的,而链表不一定(可能相邻,也可能不相邻);
- 存储空间的不同:数组要求一片连续的空间来存储每一个元素,可能会造成空间的浪费,而链表不一定要连续的空间,可以利用零碎的空间;
- 在操作的效率上:数组查找特定的元素效率比较高(因为可能根据下标索引直接查找到元素),但插入和删除操作效率比较低(因为需要对元素挨个进行移动);而链表的插入和删除操作效率比较高(只需要更改next空间的指向即可),查找效率低(因为需要从第一个元素开始一个一个找到目标元素)
Set
Set存储的数据是无序的,不可重复的。常用的子类有:
- HashSet:无序的
- LinkedHashSet:有序的,根据插入的顺序排序
Map
Map存储数据是以键值对key-value形式来存储的。其中key值不可以重复。
Map常用的子类有:
- HashMap
- HashTable
- CurrentHahMap
HashMap
- HashMap可以把null作为key值和value值
- HashMap是线程不安全的,效率高
HashTable
- HashTable不可以把null作为key值和value值
- HashTable是线程安全的,效率低
CurrentHashMap
CurrentHashMap既保证了线程安全,又保证了效率
字节流和字符流
- 字节流操作的单位是字节。
- 字符流操作的单位是字符,2个字节。使用到缓存区,需要关闭
操作文件应该使用字节流还是字符流
字节流。因为不确定这个文件是否是纯文字的文件,可能包含图片,音频等媒体文件。
线程
程序,进程,线程
- 程序:静态代码
- 进程:正在运行的程序
- 线程:进程的最小组成单位,多个线程同时执行组成一个进程
怎么实现线程
- 继承Thread类:java是单继承的,不利于扩展
- 实现Runable接口
怎么启动线程
使用start方法
Thread thread = new Thread(new MyThread());
thread.start();
使用start方法后,实际调用的是线程中的run方法
怎么区分线程
在定义线程变量之后,可以使用setName方法给线程取名字
线程池
- 限定线程的个数,不会导致运行缓慢或崩溃
- 线程池不需要每次都去创建又销毁,响应速度快
设计模式
设计模式是前人经过无数次实践总结出的可以反复利用于某些特定场景下的设计方法。
常用的设计模式有:
单例模式、工厂模式、代理模式等
单例模式
所谓的单例模式,就是保证类在程序中只有一个实例对象。
- 构造方法私有化,除了自己的类中可以创建外,其他地方都不能创建
- 在自己的类中创建一个单实例
- 提供一个方法来获取该单实例对象
饿汉模式
饿汉模式下,一开始就创建这个单实例
懒汉模式
懒汉模式下,需要的时候才创建这个单实例,需要进行方法同步。
工厂模式
Spring的IOC(控制反转)就是使用了工厂模式。
一个对象的创建交给一个工厂去创建。
代理模式
Spring的AOP()就是使用了动态代理模式
Java Web部分
get和post请求
自己理解:他们都是http的请求方式。get、post、put、delete分别对应着对资源的查、改、增、删操作。所以,get主要用来对资源的获取/查询,post主要用来对资源进行更新的操作。
回答:
- GET请求的数据会在地址栏显示出来,而POST请求的数据不在地址栏中,而是包在http的包体中
- 由于1,GET请求的数据多少有限制(地址栏的长度有限制),而POST的请求数据的数量没有限制
- 由于1,GET请求的安全性没有POST的高
Servlet
Servlet是Server Applet的缩写。是用Java编写的服务器端程序。交互式地浏览或修改数据,生成动态Web内容。
怎么编写Servlet
实现HttpServlet类,重写doGet或者doPost方法,也可以重写service方法来调用相应的doGet或doPost方法来完成对请求的响应。
Servlet的生命周期
- 服务器启动后,加载并实例化servlet
- servlet通过调用init方法进行初始化
- 请求来的时候,调用service方法处理客户端的请求
- 服务器关闭,通过调用destroy方法来销毁servlet
- java的垃圾回收机制进行空间回收
forward与redirect的区别
- 服务器端发起的请求。浏览器的地址不会改变,只是将请求到的数据include进来
- 客户端发起的请求。redirect会使浏览器跳转到新的地址,加载一个新的页面
jsp与servlet
联系:jsp最后会翻译成一个继承HttpServlet的类,所以JSP相当于一个特殊的servlet
区别:
- jsp侧重于视图,而servlet更侧重于控制逻辑。
- 在servlet中若要表现视图,需要使用Writer来写前端代码,比较麻烦;而jsp是将两者混合起来的,方便一些。
jsp的内置对象及四大作用域
jsp有9个内置对象:
- request:客户端的请求
- response:传回客户端的响应
- pageContext:用来管理整个网页的属性
- session:整个请求的会话期
- application:整个应用
- out:输出
- config:
- page:jsp网页本身
- exception:异常
四大作用域
- page
- request
- session
- application
session和cookie
session和cookie都是会话跟踪技术。session是依赖于cookie的,因为cookie中存有一个sessionId来标识session
- session数据存在服务器端,所以安全性高,但性能差
- cookie数据存在客户端,所以安全性低,性能较好
故,建议将用户登录信息等信息存在session中,其他安全要求较低的信息存在cookie中
MVC模式
mvc模式是将视图与逻辑处理分离的一种模式。M是model,模型。V是view,视图。C是controller控制器。
最经典的MVC模式就是jsp+servlet+javabean
数据库部分
数据库分类和常用的数据库
- 关系型数据库:mysql、oracle、sqlserver
- 非关系型数据库:redis、mogodb
关系型数据库的三范式
范式就是规范。
要想满足第三范式,必须满足第二范式;要想满足第二范式,必须满足第一范式。
第一范式
数据表的每一列都是不可拆分的数据项,不能是集合、数组等数据项。也就是实体中的某属性只有一个值。
第二范式
(主键)在第一范式的基础上,数据表的每行数据都能被唯一地区分。可设定主键
第三范式
(外键),在第一第二范式的基础上,要求数据表中不包含已经在其他的数据表中存在的除了主键以外的其他列
事务
事务是定义的一系列操作的序列,这些操作要么都执行,要么都不执行,只要其中任意一个操作失败了,其他的操作也不能成功。
事务的四个特征
- 原子性:事务的操作是不可分割的,要么都执行,要么都不执行
- 一致性:事务的每项操作的执行结果状态必须是一致的,要么都成功,要么都不成功。若中途失败了,则前面的成功操作会回滚。
- 隔离性:程序中往往存在多个事务可能处理同样的数据,为了保护数据不被破坏,每个事务是隔离的。
- 持久性:事务处理后的结果时持久的,不会因为系统故障而有所变动
mysql分页和oracle分页
- mysql是使用关键字limit来进行分页的
...limit offset,size
- oracle分页使用rownum关键字取数据的行数,再加where条件语句来限定行数范围
select * from (select rownum rn,* from (select * from table order by co) where rn <= 15 )t where t.rn >= 5
触发器
当满足某个条件时候,执行一个规定的操作,即为触发器(关键字是trigger)。
举例:当你发布了一片推送文之后,触发事件:向你的订阅者发送信息提示你发文章了。
触发器的写法:(当在表1中插入了一条新的数据时候,触发在表2更新数据总数)
create trigger trigger_name after insert on table1 for each row begin
update table2 set sum = sum + 1 wehere ...;
end;
存储过程
优点:
- 方便处理复杂的、业务逻辑需要多条sql才能完成的情况
- 存储过程只在创建的时候编译一次,以后每次执行不需要重新编译
- 存储过程安全性较高
定义存储过程:
create procedure pro_name(参数)
begin
...
end;
调用存储过程:
call pro_name;
jdbc进行数据库操作
jdbc:java database connection,java数据库连接。屏蔽了不同厂商数据库的差异,加入对应的驱动就可以去实现。
使用jdbc进行数据库操作的步骤:
-
加载驱动:
mysql的驱动:com.mysql.jdbc.Driver
oracle的驱动:oracle.jdbc.driver.OracleDriver
-
获取连接
DriverManager.getConnection(url,username,password);
-
设置参数
-
执行sql
-
释放连接
jdbc中PreparedStatement相比Statement的好处
- preparedStament是预编译的,速度快
- preparedStament可读性和可维护性比较好
- preparedStament安全性较高,防止sql注入攻击
连接池的作用
- 限定连接的个数,不会导致由于过多连接导致系统缓慢或者崩溃
- 数据库连接不需要每次都创建或者销毁,节约了资源,且响应快
前端部分
简单说明html、css、javascript在网页开发中的定位
- html,超文本标记语言,用来绘制网页的结构
- css,层叠样式表,用来美化页面
- javascript,用来验证表单,做动态交互(ajax)
简单介绍一下ajax
使用ajax,可以不重新加载页面就实现页面的局部更新。
怎么实现:
使用XmlHttpRequest对象可以异步向服务器发送请求,获取响应来实现局部的更新。
使用场景:
登陆失败时不跳转页面,注册的时候提示用户名是否已经存在了等。
js与jquery的关系
jquery是js的一种框架,封装了js的属性和方法,并且对其进行扩展,使其使用变得更方便。
比如:
- 使用原生的js要处理很多兼容性的问题,而jquery封装了底层,就不用考虑兼容性的问题了;
- 原生的js,dom与事件绑定等操作非常麻烦,而jquery封装之后,操作就变得简单了。
jquery的常用选择器
- id选择器:(#)通过id获取一个元素
- class选择器:(.)通过css中的类获取元素
- 标签选择器:通过标签获取元素
- 通用选择器:*,获取所有的元素
- 组合选择器:如
div.test
获取含有test这个类的div标签元素 - 层次选择器:儿子选择器(>)获取下面的子元素;后代选择器(空格)获取下面的所有后代,儿子、孙子等
- 属性选择器:如
input[name="hobby"]
获取含有属性名为name,且name属性值为hobby的所有input标签元素
jquery的页面加载完毕事件
说明:
我们获取页面的元素是需要元素加载完毕之后再获取的,原本的写法是将获取的js代码放在元素的后面,但是这就会导致body中含有js代码,层次较乱,不好管理。
所以,将其放在页面加载完毕事件之后。
加载完毕事件的两种写法
-
$(document).ready(function(){ });
$(document)是把原生的document这个dom对象转换成jquery对象;而后调用ready方法;
ready(function)表示页面结构被加载完毕后执行传入的函数
-
$(function(){ });
表示当页面加载完毕之后执行里面的函数
加载完毕事件和window.onload()的区别
- jquery中的页面加载完毕事件,表示的是页面结构加载完毕;window.onload表示的是页面(包括结构以及相应的资源等)被加载完毕。
jquery的ajax和原生js实现的ajax有什么关系
jquery的ajax也是由原生的js的ajax封装而成的,使用已经封装过的要方便得多,不用考虑底层的实现和兼容性问题。
bootstrap
bootstrap是一种前端框架。平常使用最多的就是它的栅格布局,根据尺寸大小调整布局
框架部分
MVC模式
MVC-Model View Controller ,将数据、视图、逻辑分离的方式来编写代码。
最经典的MVC模式就是:JavaBean+jsp+servlet;
客户端向控制器发起请求,控制器调起javabean数据进行处理,处理之后进行视图渲染,呈现到浏览器
MVC框架
传统的MVC模式存在以下问题:
- servlet的映射需要配置在web.xml文件中,当项目过大时,不好模块化管理
- servlet的主要功能是接受参数、逻辑处理、跳转页面,而其他特殊的处理,比如字符编码、文件上传等功能也写在servlet里面就需要做一些处理
- servlet接收参数比较麻烦
- 跳转页面的方式比较单一
为了解决传统MVC模式的问题而设计的一种框架,常用的MVC框架:Spring MVC,struts2
Spring MVC的执行流程/原理
- 客户端发送请求,被前端控制器捕获(dispatcher)
- 前端控制器对uri进行解析,查找对应的handler
- 执行handler
- 执行完毕后,选择合适的viewResolver
- 视图渲染
Spring的两大核心
Spring是J2EE应用程序框架,是对javaBean的生命周期进行管理的轻量级容器。
Spring的量大核心是:
- IOC(控制反转)、DI(依赖注入)
- AOP(面向切面编程)
IOC/DI
控制反转/依赖注入。举例:原来,我们的service需要使用到Dao层,于是我们就new一个dao;而使用Spring后,Spring容器中装有dao,它发现service依赖这个dao,就把dao注入给service
AOP
面向切面编程。是使用动态代理的方式在执行前后或出现异常之后加入相关的逻辑处理。
常使用的场景:
- 事务处理
- 权限判断
- 日志
等