-- 答案经过网络整理, 难免有重复的内容, 感谢各位博主的无私奉献
1. TCP 和 UDP 的区别, 哪个是三次握手?
- TCP(Transmission Control Protocol 传输控制协议)
- UDP(User Datagram Protocol 用户数据包协议)
OSI(Open System Interconnection 开放系统互联)七层参考模型: 应用层(表现层, 会话层), 传输层, 网络层, 数据链路层, 物理层
二者都是 OSI(Open System Interconnection 开放系统互联)参考模型中传输层的 协议, 其中 TCP 是三次握手的协议.
二者区别如下:
1)TCP 是面向连接的(即建立通信之前需要通过三次握手建立连接);UDP 是无连接的(即不负责确认通信对象是否存在)
2)TCP 通过一系列的机制提供可靠的服务, 保证通过 TCP 传输的数据无差错, 不丢失, 不重复, 且按序到达; 而 UDP 则只尽最大努力交付数据, 不保证可靠性, 可能丢包
3)TCP 面向字节流, 把数据看做一连串无结构的字节流; UDP 是面向报文的, 应用程序发送多长的报文, UDP 就传输多长
4)TCP 有拥塞控制机制(流量控制), 防止向网络中注入过多的数据, 使网络中的路由器和链路不至于过载, 保证接收方能够来得及接收数据, 而 UDP 则没有
5)TCP 连接只能是一对一的; UDP 支持一对一, 一对多, 多对一和多对的通信
6)TCP 要求的系统资源较多, UDP 较少
7)TCP 首部开销 20 字节; UDP 的首部开销小, 只有 8 个字节
8)应用场景不同, 当应用程序要求通讯质量要好, 数据要准确无误是, 应当使用 TCP 协议进行传输, 如 HTTP,FTP 等文件传输协议; 当应用程序要求通讯速度尽量快, 但是对网络质量没有太高要求时, 可以使用 UDP 进行传输, 如 QQ 语音, QQ 视频, QQ 消息等
2. JDBC 操作数据库的步骤.
A. 加载数据库驱动
B. 建立到数据库的连接
C. 定义 sql, 获取 sql 执行环境, 设置相应的参数
D. 执行 sql, 处理 sql 执行结果 --DML 语句返回 int, DQL 语句返回结果集对象 ResultSet
E. 释放资源
3. 字节流, 字符流的区别.
1)Java 中字节流
a. 所有字节输入流的最大抽象父类是 InputStream
b. 所有字节输出流的最大抽象父类是 OutputStream
2)Java 中字符流
a. 所有字符输入流的最大抽象父类是 Reader
b. 所有字符输出流的最大抽象父类是 Writer
二者区别:
1)字节流操作的单元为一个字节; 字符流操作的单元为两个字节的 Unicode 码
2) 字节流可以处理任意类型的数据; 字符流只能处理文本类型的数据
3)字节流在操作过程中没有用到缓冲区(内存), 直接对文件本身进行操作; 字符流使用到了缓冲区
4)字节流在写的时候不需要 close, 也能输出内容; 字符流只有在 close 之后, 或者使用 flush 强制刷新缓冲区之后, 才能输出内容(与缓冲区的使用有关)
5)由于字符流有缓冲区, 所以字符流的一次操作效率比字节流高
4. 线程的几种状态分别是什么?
1)新建状态(new): 将一个继承了 Thread 或者实现了 Runnable 接口的线程类, 通过 new 的方式创建一个实例, 则此线程就进入了新建状态
2)就绪状态(Runnable): 调用线程类的 start 方法之后, 准备了线程所需的系统资源, 线程等待 CPU 的使用权的状态称为就绪状态.
3)运行状态(Running): 就绪状态的线程获取到了 CPU 的使用权之后的状态, 即此线程 run 方法中的代码开始被执行
4)阻塞状态(Blocked): 因为某种原因, 线程放弃 CPU 的执行权, 直到重新进入就绪状态, 阻塞的情况分为以下三种:
A. 等待阻塞: 线程执行 wait 方法, 释放所有资源(包括同步锁),JVM 将其放入 "等待池" 中, 即等待队列. 只有在超出等待时间后, 或者其他线程调用同一个对象的 notify 或者 notifyAll 方法时, 才能重新进入就绪状态(Runnable)
说明: 等待阻塞由于需要释放所占有的所有资源, 包括对象锁, 所以必须在同步方法块中调用相应的锁对象的 wait 方法, 否则抛出异常 java.lang.IllegalMonitorStateException
B. 同步阻塞: 线程运行同步的代码时, 需要先获取同步锁, 则 JVM 把此线程放入 "锁池" 中, 即进入同步队列
C. 其他阻塞: 运行的线程执行 sleep 或 join 方法, 或者发出了 I/O 请求时, JVM 会把该线程置为阻塞状态. 当 sleep 状态超时, join 等待线程终止或者超时, 或者 I/O 处理完毕时, 线程重新转入就绪状态.
说明: 与 wait 造成的阻塞不同的是, 这种阻塞不会释放所占用的资源, 即不会释放同步锁
5)死亡状态(Dead):
- 当线程出现异常, 或者 run 方法执行完毕, 则该线程死亡
- 调用一个已经死亡的线程对象的 start 方法, 会产生 java.lang.IllegaleThreadStateException 异常
5. String,StringBuilder,StringBuffer 的区别.
1) String 是定长字符串; StringBuilder,StringBuffer 是变长字符串
2) StringBuilder 是线程非安全, 一般用于单线程中, 执行效率较 StringBuffer 高
StringBuffer 是线程安全的, 如果在多个线程中需要同步则采用此类
6. final, finally, finalize 的区别
1) final 是 java 中的一个关键字, 表示最终之意
- 修饰类: 表示此类不能被继承
- 修饰变量: 表示此变量必需被初始化, 且不能修改值. 通常与 public static 连用表示常量之意
- 修饰成员方法: 表示此方法不能被重写
说明: final 关键字不能和 abstract 关键字同用
2) finally 是在异常捕获中使用到的一个关键字, 使用在 try/catch 块之后, 不管最后是否出现异常, 必定执行 finally 中的方法块, 可用于释放一些资源, 如数据库的连接
3) finalize 是 java.lang.Object 类的成员方法, 因此 java 中所有的类都拥有该方法. 该方法是由 JVM 的 GC(GarbageCollector, 垃圾回收器)在判定对象已经不可能再被调用的情况下进行回收是所执行, 因此可以通过重写该方法释放一些资源. 如果在执行此方法的过程中, 抛出了无法捕获的异常, 则 GC 终止回收此对象, 但 JVM 忽略此异常, 并不会导致 JVM 终止
7. 抽象类和接口有什么区别
抽象类 | 接口 | |
类修饰关键字 | abstract | interface |
继承 / 实现方式 | 单继承 / extends | 多实现 / implements |
设计思想 | Is-a | Like-a |
成员变量 | 和普通类一样 | 只能是全局的静态常量 |
成员方法 | 和普通类一样,也可以定义一个抽象方法 | 全都是抽象方法 (public abstract) |
构造方法 | 有构造方法 | 没有构造方法 |
对子类的影响 | 新增方法不一定影响子类 | 新增方法一定影响子类 |
注: 在 jdk1.8 中, 可以通过 default 关键字在接口实现默认的方法
8. Statement 和 PreparedStatement 有什么区别? 哪个性能更好?
二者区别主要体现在执行效率和安全方面(sql 注入问题)
-Statement: 每执行一条 sql 语句就需要生成一条执行计划, 不适合批量处理, 效率较低
-PreparedStatement: 支持带参的 sql 语句, 在执行之前会进行预编译并缓存下来, 下次执行相同的 sql 语句的时候只需要传入相应的参数即可, 不需要重新编译, 适合批量处理相同的 sql 语句.
同时避免了用字符串拼接 sql 语句的 sql 注入问题, 更安全
9. equals 与 == 的区别
==: 比较的是存放在栈中对象的堆地址, 比较两个变量中存储的对象地址是否相同, 即是否是同一个对象
1)比较操作符两端是否是同一对象
2)两边的操作数必须是同一类型才能编译通过
3)比较的是地址, 如果是基本数据类型, 则比较值
equals: 用来比较两个对象的内容是否相等, 是 java.lang.Object 类的成员方法, 由 于所有的类都继承自 Object, 所以该方法适用于所有对象, 但是如果没有重写的话, 则返回的是 == 的判断结果
另外 == 的比较效率比 equals 高
10. hashCode 和 equals 方法的区别与联系
A. 区别:
1)hashCode:
- 用来返回对象的哈希码值, 用来提高哈希表的性能
- 默认返回对象的内存地址经过计算后的哈希码值
2)equals:
- 用来比较两个对象是否 "相等"
- 默认比较两个对象的内存地址
B. 联系:
二者都是用来判断对象之间的相等关系的, 根据实际业务都需要经过重写.
为保证 equals 比较的是两个对象的内容是否相同, equals 方法的重写需要满足如下几个原则: 自反性, 对称性, 传递性, 一致性, 非空性.
而 hashCode 则根据常规协定跟 equals 方法联系起来:
- 同一对象的 equals 比较的内容没有被改变的前提下, 多次调用该对象的 hashCode 方法返回的整数值应该是一致的
- 两个对象通过调用 equals 方法判断为相等, 则二者返回的 hashCode 应该相等
- 两个对象的 hashCode 值相等, 但是调用 equals 方法并不一定返回 true
在设计哈希表相关的 set 或者 map 时, 需要根据业务需求重写 equals 方法, 同时根据常规协定需要重写 hashCode 方法, 因为这些散列结构都是先判断 hashCode 值是否相等来判断两个对象是否相等, 若 hashCode 相等, 再继续比较 equals 方法是否相等
注意: 在数据已经存储在哈希结构中时, 不能修改跟 hashCode 相关的信息, 否则导致内存泄漏的隐患
11. ArrayList 和 LinkedList 的区别.
A. ArrayList
-ArrayList 内部采用动态数组的方式实现了 List 的数据结构
- 更适合于查询操作
B. LinkedList
-LinkedList 内部采用了循环双向链表数据结构实现 List 的数据结构
- 更适合于增删改操作
12. 转发 (forward) 和重定向 (redirect) 的区别?
- 转发:
1转发本质上是服务器的一个行为, 只有一次请求, 一次响应
2浏览器的地址栏地址不会发生改变
3转发过程中共享 request 和 response 对象
4转发只在一个 web 应用程序中进行
- 重定向: 302+location
当浏览器第一次请求 Web 服务器时, Web 服务器给浏览器返回了一个 302 状态码, 和一个 url 地址, 当浏览器接收到时, 会立即重新对 url 地址发出请求, 服务器再次做出相应的过程叫重定向
1重定向本质上是浏览器上的一个行为, 对应两次请求, 两次响应
2浏览器的地址栏地址会发生改变
3重定向过程中不共享 request 和 response 对象
4重定向不仅可以定位项目内请求, 还可以定位到项目外请求
13. get 和 post 请求的区别?
- get 请求的请求参数直接放在 url 中; post 请求的请求参数放在请求体中
- get 请求携带的数据量一般不超过 4k;post 请求的数据量一般不受限制
- get 请求相对不安全; post 请求相对安全
- get 请求会连同请求参数被浏览器保存在历史记录里; post 则不会
- get 请求会有缓存问题; post 请求则没有
- get 产生一个 TCP 数据包; post 产生两个 TCP 数据包
14. List 和 Map 的区别
List: 是存储单列数据的集合, 存储的数据有序且可重复
Map: 是存储双列数据的集合, 采用键值对的形式进行存储, 存储的数据是无序的, 且 key 不能重复, 但是 value 值可以重复
15. JDK 中哪些实现了单例模式?
饿汉式单例模式(在 JVM 启动时就需要加载的对象采用这种模式):
- Java.lang.Runtime: 封装了 java 的运行时环境信息, 由于 java 是单进程的, 每个 JVM 只对应一个 Runtime 实例
懒汉式单例模式(需要考虑到线程安全问题, 获取单例的方法需要同步):
- - java.awt.Toolkit
- - java.awt.GraphicsEnvironment
- - java.awt.Desktop
16. JSP 和 Servlet 有什么关系?
JSP:Java Server Page 同 Servlet 一样也是运行在服务器端, 用来产生动态 html 响应的. 不过与 Servlet 不同的是, JSP 以 HTML 内容为主, 内嵌少量 java 代码, JSP 为案件的后缀为 .jsp
当浏览器请求服务器上的 jsp 资源时, jsp 先经过转译, 形成对应的 java 文件, java 文件经过编译会生成对应的 class 文件. Web 服务器根据 class 文件生成对应的 servlet 提供服务
17. jsp 的九大内置对象.
内置对象名称 | 类型 | 作用 |
page | Object | 代表 jsp 页面本身 |
pageContext | PageContext | 封装页面上下文信息 |
request | HttpServletRequest | 封装 http 请求信息 |
response | HttpServletResponse | 封装 http 响应信息 |
session | HttpSession | 代表 http 会话对象 |
application | ServletContext | 封装应用程序信息的对象 |
out | JspWriter | 用来向 jsp 输出内容 |
config | ServletConfig | 用来封装 servlet 配置信息的对象 |
exception | Throwable | 封装异常信息的对象 |
18. 怎么认为一个类是线程安全? Java 有多少个关键字进行同步?
类是否线程安全的判断
1) 当多个线程访问这个类, 如果需要对该类的成员方法进行写操作, 则需要考虑线程安全问题
2) 线程安全的对象在不同线程中被调用的时候, 在不同的线程看来, 其中的操作是以固定且一致的顺序执行的. 类似于数据库操作中事务的概念.
Java 中进行同步的关键字:
- synchronized: 用来修饰成员方法或者代码块, 实现加锁, 多线程排队执行, 重量级同步机制
- volatile: 用来修饰成员变量, 实现线程之间该成员变量可见, 轻量级同步机制
19. JSP 中的四种作用域?
pageContext, request, session, application
20. 实现会话跟踪的技术有哪些?
(1) Cookie : 基于客户端的状态管理技术
当浏览器请求服务器上的一个服务时, 服务器会创建一个 Cookie 对象, 然后以 Set-Cookie 消息头的方式传递给浏览器. 当浏览器再次请求服务器上服务时, 会携带这个 Cookie 对象到服务端, 服务端就可以获知上一次的数据状态
(2) Session : 基于服务器端的状态管理技术
当浏览器请求服务器某个功能时, 服务器可以为这个浏览器分配一块内存, 并且在这个内存中创建一个回话对象. 同时为这个会话对象分配唯一一个 id 号, 然后将这个 id 号以 cookie 的形式传递给浏览器. 浏览器再次请求服务器时, 会携带这个 id 到服务器, 服务器根据 id 找到对应的会话对象, 进行相应的服务, 会话对象可以解决多个请求之间信息共享和状态传递的管理
(3) Url 重写: 可以解决浏览器禁止 cookie 的情形
21. 在 Java 中定义一个不做事且没有参数的构造方法的作用
Java 在初始化子类的时候, 会用 super()调用特定的父类的构造方法, 若没有, 则会调用父类的无参空构造方法. 若父类只定义了有参的构造, 且子类又没有调用相应的构造方法, 则编译会报错, 只能通过在父类加一个无参空构造方法, 让编译通过.
22. jsp 的常用指令有哪些?
Jsp 中指令使用的语法:<%@指令名 属性名 1="值 1" 属性名 2="值 2"%>
(1) page 指令: 用来导包 和 做一些页面属性设置
1 pageEncoding: 用来指定页面以何种编码方式保存
2 contentType: 用来指定页面以什么格式和编码进行翻译
3 Import: 用来导包
4 isErrorPage: 该页面是否是一个错误页面, 如果是 true, 则可以使用 exception 内置对象
5 errorPage: 用来指定要跳转到的错误页面(在页面报错时)
(2) taglib 指令: 用来引入对应的标签库
1 prefix: 用来指定对应标签库的前缀或者简称
2 uri: 用来指定标签库的位置, 或者标识
(3) include 指令: 用来包含对应的页面
1 file: 指定包含文件的位置
23. spring 中的常见注解有哪些?
(1) 组件扫描相关标注
1 创建相关组件:@Component, @Repository, @Controller, @Service
2 组件扫描相关的其他标注:@Scope("singleton|prototype"), @PostConstruct, @PreDestroy
3 DI 相关标注
1) @Value : 可以用在成员变量和 set 方法上, 基本值直接在标注写值, 如果是复杂值, 则需要用到 spring 的 EL 表达式 #{}
2) @Autowired : 可以用在成员变量, set 方法和构造方法上, 优先使用类型进行匹配, 如果类型有冲突, 则启用名字进行匹配(参数名, 成员变量名)
@Qualifier("容器中的对象名"): 配合 @Autowired 指定名字进行查找, 但是只能用在成员变量和 set 方法上
3) @Resource: 用在成员变量和 set 方法上, 优先使用名字进行匹配, 如果匹配不上, 则使用类型进行匹配, 属于 jdk 中的标注
4 @Transactional 属性 : 控制事务管理
(2) Spring MVC 相关标注
1 @RequestMapping("/ 路径") : 匹配请求路径(加载控制器方法上)
2 @RequestParam("name") : 指定形参要接收的参数
3 @ExceptionHandler : 定义局部异常处理的方法
4 @RequestBody : 告知 spring 框架, 返回的是一个 JSON 格式的数据
5 @PathVariable("路径变量名") : 搭建 Restful 应用时, 指定路径变量用
6 @RequestBody : 把浏览器上传的 JSON 数据转换成 java 对象
(3) Spring AOP 相关标注
1 @Aspect : 在标注形式 aop 中指明该类为切面类
2 @Before : 前置通知
3 @After : 最终通知
4 @AfterReturnning : 后置通知
5 @Around : 环绕通知
6 @AfterThrowing : 异常通知
24. i++ 和 + +i 的区别
i++: 后加加, 在表达式中, 变量 i 先参与运算, 再完成自增加 1
++i: 前加加, 在表达式中, 变量 i 先完成自增 1, 再参与运算
25. springmvc 的运行原理
(1) DispatcherServlet 作为请求的入口, 客户端所有的请求都要经过它
(2) DispatcherServlet 控制器通过查询 HandlerMapping 找到请求对应的 Controller
(3) DispatcherServlet 将请求提交到 Controller,
(4) Controller 调用业务逻辑处理之后, 返回 ModelAndView(其中封装了数据信息和视图信息)
(5) DispatcherServlet 查询 ViewResolver 根据 ModelAndView 找到对应的视图展示数据
26. Servlet 的生命周期
1)创建
- 默认在第一次请求到来时创建
- 也可以通过在 Web.xml 配置文件中, 通过
<load-on-startup > 一个大于等于 0 的值</load-on-startup > 标记, 实现服务器启动时创建
2)初始化
- 对象创建完成后, 调用 void init(); 方法完成初始化
3)不断地提供服务
通过
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
- protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
这三个方法不断地向外提供服务
4)即将消亡
调用 void destroy(); 方法
5)消亡
27. 什么是 IoC 和 DI?DI 是如何实现的?
(1) IoC:Inversion of Control , 控制反转, 程序中需要某个对象时, 由原来 new 方式, 变成了由容器来进行创建, 管理和维护组件关系. 这样做的好处是可以大大降低组件之间的耦合度
(2) DI:Dependency Injection , 依赖注入, 用以解决组件的装配问题
(3) DI 的实现方式: DI 是通过反射来实现动态注入的, 主要有以下几种注入方式
1 Setter 注入
2 构造器注入
3 自动化注入
28. 解释一下什么叫 AOP(面向切面编程)[spring 中]?
AOP(Aspect Oriented Programming 面向切面编程)是基于 OOP 的, 可以在不修改原有代码的情况下增加功能, 通过 spring 的配置, 可以将共通的处理代码添加到切面位置, 实现了组件的重复利用, 将共通组件与目标对象解耦, 提高了程序灵活性.
AOP 相关概念;
(1) Aspect : 切面, 封装了共通的业务逻辑的类
(2) Join Point : 连接点, 切面作用的位置
(3) Pointcut : 切点, 连接点的集合, 通过切点表达式确定作用的位置
(4) Advice : 通知, 共通业务逻辑调用的时机, 有前置通知, 后置通知, 最终通知, 环绕通知, 异常通知
(5) Target : 目标对象, 要加入切面的对象
(6) Proxy : 代理对象, 加入切面之后的对象, 有 jdk 的代理和 CGLIB 两种代理
29. mybatis 框架构成和原理.
1) Mybatis 框架主要由以下几个方面构成
A. 实体类 -- 根据表设计的实体类
B. 主配置文件 -- 定义了连接数据库的信息(mybatis 自带连接池), 和加载 sql 定义 文件
C.sql 定义文件 -- 定义 sql 语句
D.mybatis 框架 API-- 主要是通过 SqlSession 来体现
2)mybatis 原理
Mybatis 应用程序根据主配置文件创建 SqlSessionFactory 对象, 里面加载了连接池和 sql 定义文件的信息, 根据 SqlSessionFactory 创建 SqlSession 对象, 利用 SqlSession 的 API 完成相应的持久层操作
来源: http://www.bubuko.com/infodetail-2950884.html