每日十道面试题(十)

1.throw 和 throws 的区别?

● throw:

throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。

throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。

一般自定义异常我们也用throw new 类来抛出

● throws:

throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。

throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。

● throws表示出现异常的一种可能性,并不一定会发生这种异常。

2.Java 异常处理机制的理解?

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为 java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception

Error表示应用程序本身无法克服和恢复的一种严重问题。

Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常。

系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组下标越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException)。

普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

Java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try…catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明,所以系统异常也称为unchecked异常。

unchecked=系统异常可以处理也可以不处理

弄懂了上面这个,那来看下一个面试题,应该就迎刃而解了

3.error和exception的区别?

Error类和Exception类的父类都是Throwable类,他们的区别如下:

● Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

● Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

●Exception类又分为未检查异常(UnCheckedException)和受检查的异常(CheckedException)。运行时异常ArithmeticException,IllegalArgumentException编译能通过,但是一运行就终止了,**程序不会处理运行时异常,出现这类异常,**程序会终止。而受检查的异常,要么用 try…catch 捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

4.简述数据库事务和实际工作中的作用?

所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。

事务的ACID可以扯一下,下面讲个例子

例如在关系数据库中,一个事务可以是一条 SQL 语句、一组 SQL 语句或整个程序。简单举个例子就是你要同时修改数据库中两个不同表的时候,如果它们不是一个事务的话,当第一个表修改完,可是第二表改修出现了异常而没能修改的情况下,就只有第二个表回到未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,可是第二表改修出现了异常而没能修改的情况下,第一个表和第二个表都要回到未修改的状态!这就是所谓的事务回滚。

例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。

5. 你对MyBatis的一级缓存和二级缓存有了解吗,说一下?

Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存**,一级缓存只是相对于同一个SqlSession而言**。所以在参数SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SqlSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了

由于我们在实际的开发中目前都会使用第三方的缓存技术,例如Redis,所以MyBatis这块的二级缓存没有太多的了解。

6.ThreadLocal 的原理和应用场景

每一个ThreadLocal能够放一个线程级别的变量,可是它本身能够被多个线程共享使用,并且又能够达到线程安全的目的,且绝对线程安全。

实际上ThreadLocal你可以想成全局变量,同一个线程的类都可以访问到里面的数据,它的Api有remove ,get ,set方法

他如何做到当前线程全局共享呢?

他的api里面,都会判断一个map里面的值是不是为空,其实底层是一个ThreadLocalMap,然后ThreadLocalMap是ThreadLocal里面的内部类。放在了Thread类里面作为一个属性而存在,

ThreadLocal本身成为这个Map里面存放的Key,用户输入的值是Value。数据本身就放在这个线程里面,自然能够做到当前线程共享

简单来讲,就是这个Map对象在Thread里面作为私有的变量而存在,所以是线程安全的。ThreadLocal通过Thread.currentThread()获取当前的线程就能得到这个Map对象。同一时候将自身作为Key发起写入和读取,因为将自身作为Key所以一个ThreadLocal对象就能存放一个线程中相应的Java对象。通过get也自然能找到这个对象。

ThreadLocal的应用场景:最常见的ThreadLocal使用场景为用来解决数据库连接、Session 管理等在Spring中他在内部创建了连接对象,然后放入到ThcreadLocal,然后又能根据它最后访问到连接可以控制关闭,实现了连接从创建到销毁的控制,而单例正好保证了上下文连接都是唯一的。

private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {  
    public Connection initialValue() {  
        return DriverManager.getConnection(DB_URL);  
    }  
};  
  
public static Connection getConnection() {  
    return connectionHolder.get();  
}  

ps:当entry对象多了,map长度很长,遍历效率变差所以个人觉得这个只适合少量值用作共享,

7.简述 TCP 的三次握手

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

● 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态, 等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)。

● 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即SYN+ACK 包,此时服务器进入 SYN_RECV 状态。

● 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据

为什么不是两次?或者4次

首先4次就没必要了,因为第二次传过来客户端已经知道你服务器连接上了第三次发个包给服务器说明连接上了服务器,如果服务器没收到,那么就是客户端没连接上,即使有4次连接也一样所以没必要4次以上,如果收到客户端的包,那就连接成功了,4次也没必要,因为已经双方都确认了连接。

为什么不是两次,首先客户端到服务器的第一次握手肯定不能少这个是告诉服务器我们要进行连接了进入接收状态,服务器返回给客户端第二次客户端知道服务器连接上它了,如果不要第三次,那么服务器不知道你客户端是否知道我连接上你,那么发包过程错误也会不知道,坦白来讲,第一次是就绪,二三次是互相确认

8.SpringMVC request接收设置是线程安全的吗?

是线程安全的,request、response 以及 requestContext 在使用时不需要进行同步。而根据 spring的默认规则,controller对于BeanFactory而言是单例的。即controller只有一个, controller 中的request等实例对象也只有一个。

9.谈谈你对ajax的认识?

Ajax是一种创建交互式网页应用的的网页开发技术;AsynchronousJavaScriptandXML的缩写。

Ajax的优势:通过异步模式,提升了用户体验。优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

Ajax的最大特点:可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度

10.jsonp原理是什么?

JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,被称为“Same-OriginPolicy”(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。

JavaScript这个安全策略在进行多iframe或多窗口编程、以及Ajax编程时显得尤为重要。根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在google.com域名下的页面内容;甚至不同的子域名之间的页面也不能通过JavaScript代码互相访问。对于Ajax的影响在于,通过XMLHttpRequest实现的Ajax请求,不能向不同的域提交请求,例如,在abc.example.com下的页面,不能向def.example.com提交Ajax请求,等等。然而,当进行一些比较深入的前端编程的时候,不可避免地需要进行跨域操作,这时候“同源策略”就显得过于苛刻。JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并且探讨下JSONP跨域的原理。jsonp的最基本的原理是:动态添加一个script标签,使用script标签的src属性没有跨域的限制特点。首先在客户端注册一个callback,然后把callback的名字传给服务器。此时,服务器先生成json数据。然后以javascript语法的方式,生成一个function,function名字就是传递上来的参数jsonp。最后将json数据直接以入参的方式,放置到function中,这样就生成了一段js语法的文档,返回给客户端。客户端浏览器,解析script标签,并执行返回的javascript文档,此时数据作为参数,传入到了客户端预先定义好的callback函数里

方法传参进来的方式,可以绕过同源策略

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值