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

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注解的方式),便可以将事务规则应用到业务逻辑中。

并发、并行、多线程

并发:
讲并发之前,要先看一张图:
Alt

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

并行:
同样,在讲并行之前,要先看一张图:
Alt

  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七大模块

Alt
核心容器(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区别
多线程为什么提高效率?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值