Java后台开发面试题整理1-10(2020年)


1.Http和Https的区别

Http : Http运行在TCP之上,明文传输,不安全,端口是80。相比于Https没有加减密操作以及证书的需求,所以对资源的消耗较小。
Https : Https运行在SSL之上,SSL运行在TCP之上,所以Https相当于是添加了加密操作和认证机制的Http,Https的端口是443。Https需要进行加减密操作以及证书的购买,对资源的消耗大。


2.对称加密和非对称加密

对称加密:加密和解密使用同一个密钥,加密过程是发送方从接收方获取密钥,使用该密钥对报文进行加密发送给接收方,接收方使用该密钥对报文进行解密,所以存在密钥发送的相关安全问题。
非对称加密 :公钥可以随意发布,私钥只有自己知道。发送方先从接收 方获取公钥对报文加密发送给接收方,接收方使用自己的私钥对报文进行解密,完成数据的传输,安全性较高,但速度也相对较慢。
通常情况,我们将对称加密和非对称加密结合使用。使用非对称加密进行对称加密密钥的传输,使用对称加密的密钥进行信息的传输。


3.进程和线程的区别

进程:是运行时对程序的封装,是系统资源调度和分配的基本单位。进程实现了操作系统的并发。进程在运行中拥有独立的内存单元,进程中的多个线程共享程序的内存。
线程:线程是进程的子任务,线程是cpu调度和分派的基本单位。线程用于保证程序的实时性,实现进程内部的并发。
综上,一个程序至少一个进程,一个进程至少有一个线程,线程依赖于进程而存在。

4.进程有哪几种状态

  • 就绪状态:进程已获得除处理机以外的所有资源,等待分配处理机资源
  • 运行状态:进程占用处理机资源运行,处于此状态的进程数小于等于cpu数。
  • 阻塞转态:进程等待某种条件,在条件满足之前无法执行。

5.数据库事务特征

  • 原子性(Atomicity):事务中的全部操作是不可分割的,要么全部完成,要么全部不执行。
  • 一致性 (Consistency): 几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
  • 隔离性 (Isolation) : 并发执行的事务之间不能相互影响,事务执行的中间结果必须对其它事务透明。
  • 持久性 (Durability): 对于已经提交的事务,系统必须保证事务对数据库的操作不被丢失,即使数据库系统出现故障。

6.MySQL事务并发带来的问题

  • 脏读 :一个事务读取到另一个事务未提交的数据。T1将某一数据修改但未提交,T2读取到修改后的值,T1回滚撤销对事务的修改,因此造成T2读取到的值是无效的。脏读一般是针对update操作。
  • 不可重复读 :一个事务范围内的俩次查询返回了不同的结果。T1事务中的对同一数据的俩次读取之间,T2事务修改了该数据,造成T1事务对同一数据的俩次读取结果不一致。
  • 幻读 :当事务不独立执行时发生的一种现象,T1对表中的数据进行修改,该操作设计到表中的全部数据行,同时T2向该表中插入一条数据,最后导致T1用户发现还存在未修改的数据行,和产生幻觉一样。

7.java中的volatile关键字

volatile关键字保证变量在每次使用时都从主内存中读取,而不是从各个线程的各个内存。volatile关键字既保证了内存的可见性,还禁止指令重排,避免了指令重排在并发环境下导致的安全问题。volatile关键字具有sychronized关键字的“可见性”,但是不具有sychronized关键字的“正确性” ,也就是说不保证线程执行的有序性。同时volatile关键字不会阻塞线程,执行效率比sychronized高。

8.SpringMVC的主要组件

  • 前端控制器 (DispatcherServlet):主要用于接收请求和响应结果,相当于转发器,DispatcherServlet很大程度上减少了其它组件之间的耦合。
  • 处理器映射器 (HandlerMapping):根据请求的URL来查找出对应的Handler。
  • 处理器适配器 (HandlerAdapter):在编写Handler时按HandlerAdapter要求的规则去编写,这样HandlerAdapter才可以正确执行Handler。
  • 处理器 (Handler):程序员开发
  • 视图解析器 (ViewResolver):根据师徒的逻辑名解析成真正的视图
  • 视图 (View):需要程序员开发

9.String,StringBuffer,StringBuilder

  • String -字符串常量 :string的值是可变的,每次的操作都会创建新的对象,很浪费空间。
  • StringBuffer -字符串变量,对象能被多次修改,不产生新的对象,线程安全,速度慢
  • StringBuilder -字符串变量,对象能被多次修改,不产生新的对象,线程不安全,速度快

10.输入一个链表,输出该链表中倒数第k个结点。快慢指针,快指针先走k-1步,然后快慢指针一起走,当快指针指向节点下一个节点为空时,返回慢指针所指向的节点。

/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
    this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
    if(head==null||k==0){
         return null;    
    }
    ListNode fast = head;
    ListNode slow = head;
    for(int i=0;i<k-1;i++){
        if(fast.next==null){
            return null;
        }
        fast=fast.next;
    }
    while(fast.next!=null){
        fast=fast.next;
        slow=slow.next;
    }
    return slow;
}
}

\color{#00FFFF}{两天一更,欢迎点赞关注}

猜你喜欢

转载自blog.csdn.net/weixin_44017425/article/details/106447641