欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面试知识点总结(不断更新)

程序员文章站 2022-04-12 21:30:22
...

JDBC处理事务

一、什么是事务?

在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

二、事务是必须满足4个条件(ACID)

事务的原子性( Atomicity):一组事务,要么成功;要么撤回。
一致性 (Consistency):事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功否,参与转账的两个账号余额之和应该是不变的。
隔离性(Isolation):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
持久性(Durability):软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

三、MySQL中的事务

在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。

开启事务:start transaction
结束事务:commit或rollback
在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所作出的影响会持久到数据库中,或者rollback,表示回滚到事务的起点,之前做的所有操作都被撤销了。

四、JDBC事务

在JDBC中处理事务,都是通过Connection完成的。

同一事务中所有的操作,都在使用同一个Connection对象。

①JDBC中的事务

Connection的三个方法与事务有关:

setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。
commit():提交结束事务。
rollback():回滚结束事务。

JDBC处理事务的代码格式:

try{
     con.setAutoCommit(false);//开启事务
     ......
     con.commit();//try的最后提交事务      
} catch() {
    con.rollback();//回滚事务
}

事务支持的管理方式

1.编程式事务处理:所谓编程式事务指的是通过编码方式实现事务,允许用户在代码中精确定义事务的边界。即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
2.声明式事务处理:管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

并发、并行、多线程

并发:
讲并发之前,要先看一张图:
Java面试知识点总结(不断更新)

  1. Concurrency,是并发的意思。并发的实质是一个物理CPU(也可以多个物理CPU)
    在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
  2. 微观角度:所有的并发处理都有排队等候,唤醒,执行等这样的步骤,在微观上他们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行。
  3. 宏观角度:多个几乎同时到达的请求(或线程)在宏观上看就像是同时在被处理。
  4. 通俗点讲,并发就是只有一个CPU资源,程序(或线程)之间要竞争得到执行机会。图中的第一个阶段,在A执行的过程中B,C不会执行,因为这段时间内这个CPU资源被A竞争到了,同理,第二个阶段只有B在执行,第三个阶段只有C在执行。其实,并发过程中,A,B,C并不是同时在进行的(微观角度)。但又是同时进行的(宏观角度)。
  5. 并发的关键是你有处理多个任务的能力,不一定要同时。
  6. 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的)

并行:
同样,在讲并行之前,要先看一张图:
Java面试知识点总结(不断更新)

  1. Parallelism,即并行,指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源呢上(多核),同时执行。
  2. 并行,不存在像并发那样竞争,等待的概念。
  3. 图中,A,B,C都在同时运行(微观,宏观)。
  4. 并行的关键是你有同时处理多个任务的能力。
  5. 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

通过多线程实现并发,并行:

  1. java中的Thread类定义了多线程,通过多线程可以实现并发或并行。
  2. 在CPU比较繁忙,资源不足的时候(开启了很多进程),操作系统只为一个含有多线程的进程分配仅有的CPU资源,这些线程就会为自己尽量多抢时间片,这就是通过多线程实现并发,线程之间会竞争CPU资源争取执行机会。
  3. 在CPU资源比较充足的时候,一个进程内的多线程,可以被分配到不同的CPU资源,这就是通过多线程实现并行。
  4. 至于多线程实现的是并发还是并行?上面所说,所写多线程可能被分配到一个CPU内核中执行,也可能被分配到不同CPU执行,分配过程是操作系统所为,不可人为控制。所有,如果有人问我我所写的多线程是并发还是并行的?我会说,都有可能。
  5. 不管并发还是并行,都提高了程序对CPU资源的利用率,最大限度地利用CPU资源。

关于Struts

一、Struts工作机制

Struts的工作流程:

在web应用启动时就会加载初始化ActionServlet,ActionServlet从

struts-config.xml文件中读取配置信息,把它们存放到各种配置对象

当ActionServlet接收到一个客户请求时,将执行如下流程.

  1. 检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
  2. 如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
  3. 根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
  4. 如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功;
  5. ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的
    Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
  6. Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件;
  7. ActionForward对象指向JSP组件生成动态网页,返回给客户;

二、Struts设计模式

MVC模式,结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;

Spring

一、Spring工作机制

①.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
②.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
③.DispatcherServlet请请求提交到目标Controller
④.Controller进行业务逻辑处理后,会返回一个ModelAndView
⑤.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
⑥.视图对象负责渲染返回给客户端。

二、Spring七大模块

Java面试知识点总结(不断更新)
核心容器(Spring Core)

核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。

应用上下文(Spring Context)

Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring面向切面编程(Spring AOP)

通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

JDBC和DAO模块(Spring DAO)

JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的代码数量,比如打开和关闭链接。

对象实体映射(Spring ORM)

Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有这些都遵从Spring的通用事物和DAO异常层次结构。

Web模块(Spring Web)

Web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以Spring框架支持与Struts集成,web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

MVC模块(Spring Web MVC)

MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型来有JavaBean来构成,存放于m当中,而视图是一个街口,负责实现模型,控制器表示逻辑代码,由c的事情。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。

三、Spring核心容器(Bean、Context、Core)

这两篇介绍的比较详细:
https://blog.csdn.net/zlfprogram/article/details/75937935
https://blog.csdn.net/cd18333612683/article/details/78312206

字节流和字符流的区别

  1. 字节流和字符流的概念
    1.1 字节流继承于InputStream OutputStream,
    1.2 字符流继承于InputStreamReader OutputStreamWriter。
    在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。

  2. 字节流与字符流的区别
    2.1 要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为IO流,对应的抽象类为OutputStream和InputStream,不同的实现类就代表不同的输入和输出设备,它们都是针对字节进行操作的。

    2.2 在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?计算机中的一切最终都是二进制的字节形式存在。对于“中国”这些字符,首先要得到其对应的字节,然后将字节写入到输出流。读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符。由于这样的需求很广泛,人家专门提供了字符流的包装类。

    2.3 底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设别写入或读取字符串提供了一点点方便。

    字符向字节转换时,要注意编码的问题,因为字符串转成字节数组,
    其实是转成该字符的某种编码的字节形式,读取也是反之的道理。

ArrayList和LinkedList区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

线程池的知识点

(偷懒了,最近看的东西比较杂,慢慢总结)
我觉得这篇总结的非常好,可以直接阅读,里面把线程池比作了厕所,通俗易懂,哈哈哈。
https://blog.csdn.net/fengye454545/article/details/79536986

数据库索引

(偷懒了,最近看的东西比较杂,慢慢总结)
这篇文章介绍的很全面:
https://blog.csdn.net/yanshuanche3765/article/details/80064405

BIO、NIO和AIO

(偷懒了,最近看的东西比较杂,慢慢总结)
https://www.cnblogs.com/zedosu/p/6666984.html
https://www.cnblogs.com/ygj0930/p/6543960.html

Java容器

里面的数据结构还是要看一下源码,了解实现方式
https://www.cnblogs.com/goody9807/p/6441114.html

静态代理、JDK动态代理、CGLIB动态代理

代理涉及的内容很多,比如AOP就是基于代理实现的,Hibernate中的懒加载(load)也是基于代理实现的。

详情参考(非常全面):https://www.cnblogs.com/V1haoge/p/5860749.html

先说说静态代理吧

创建一个接口,然后创建具体实现类来实现这个接口,再创建一个代理类同样实现这个接口。不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑实现,而代理类中的方法只需要调用这个具体类中的对应方法即可

参考资料:
https://www.cnblogs.com/gdwkong/p/7633016.html
https://blog.csdn.net/qq_33290787/article/details/51790605
https://blog.csdn.net/weixin_30363263/article/details/80732156
https://blog.csdn.net/lengxingxing_/article/details/56830727
https://www.cnblogs.com/jaysir/p/6087174.html
ArrayList和LinkedList区别
多线程为什么提高效率?