B II · Java
一、算法与数据结构
LC475. 供暖器;LC146. LRU 缓存
二、Java 基础
1. 关系型数据库事务的四大特性
答:忘了,只记得原子性和持久性。【ACID 啊!ACID 你都忘了吗!!!不复习真的很容易忘记啊/(ㄒoㄒ)/~~】
正解:
1) Atomicity 原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
2) Consistency 一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例转账前后的钱数值是一致的。
3) Isolation 隔离性:多个并发事务之间要相互隔离。
4) Durability 持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
2. 数据库的原子性如何实现?
答:使用 undo 日志来进行回滚。
3. 什么是事务?
答:从 begin 到 commit 中间的所有语句,要么都执行,要么都不执行。
正解:事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。
4. Java 里面如何使用数据库中的事务?
答:Spring 中有一个 Transactional 的注解。【这里说错了。】
正解:
1) JDBC 事务管理。开启事务的关键代码是conn.setAutoCommit(false),表示关闭自动提交。
2) 数据库连接池管理事务。标准接口DataSource javax.sql包下,一般使用阿里提供的druid实现。
3) Spring 框架对事务进行管理。Spring框架对JDBC进行简单封装,提供了一个JDBCTemplate对象,简化JDBC的开发。
5. Java 中的事务类型?
正解:
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务
6. Transactional 注解是怎么实现原子性的?
答:阿巴阿巴。【我不知道!我真的不知道!!】
正解:底层还是使用的 begin 和 commit 那些 JDBC 的事务控制操作。
7. 为什么加一个 Transactional 注解就可以事务?
正解:动态代理。
Spring 支持两种方式的事务管理编程式事务和声明式事务。
编程式事务就是手动在代码中完成事务的提交,发生异常时的回滚。
标有该注解的方法通过 AOP 完成事务的回滚与提交。
Spring的AOP实现就是基于JVM的动态代理。由于JVM的动态代理要求必须实现接口,如果一个普通类没有业务接口,就需要通过CGLIB或者Javassist这些第三方库实现。 Spring对接口类型使用JDK动态代理,对普通类使用CGLIB创建子类。如果一个Bean的class是final,Spring将无法为其创建子类。
8. Java 中实现动态代理有哪几种方式?
答:通过Java 自定义的一个接口。【呜呜呜,我不知道,别为难我了】
正解:1.基于接口的动态代理
基于接口的动态代理是指代理类和被代理类都实现同一个接口,代理类通过实现InvocationHandler接口来拦截对被代理对象的方法调用。当代理类的方法被调用时,它会将方法调用转发给InvocationHandler对象的invoke方法,从而实现对被代理对象的拦截和增强。
优点:
·对于实现了接口的类,可以直接使用基于接口的动态代理进行代理,非常方便。
·代理类和被代理类都必须实现同一个接口,能够实现对被代理对象的方法调用进行统一管理。
(2)缺点:
·只能代理实现了接口的类,对于没有实现接口的类无法使用此种方式进行代理。
·无法拦截类中的final方法。
2.基于类的动态代理
基于类的动态代理是指代理类继承自被代理类,代理类通过重写被代理类的方法来拦截对被代理对象的方法调用。当代理类的方法被调用时,它会先调用被代理对象的方法,然后再进行拦截和增强。
(1)优点:
·可以代理没有实现接口的类,比基于接口的动态代理更加灵活。
·可以拦截类中的final方法。
(2)缺点:
·必须继承被代理类,可能会造成类层次结构复杂,不够灵活。
·代理类和被代理类必须在同一个包中,如果被代理类不在同一个包中,则需要通过修改类加载器的方式实现动态代理。
9. 设计模式里面的代理模式。
> 面试官看我实在是口胡,主动换了一道简单的题。然而我还是不会。
答:有静态代理和动态代理。静态代理实现一个接口,动态代理实现Java提供的一个接口就可以。【我在说什么?天哪!】
正解:直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
10. Java 中动态代理的原理是什么?
答:反射。【我瞎说的】
正解:在Java中,可以使用动态代理来创建代理对象,以便在不修改原始类的情况下添加额外的逻辑或行为。常见的用例包括日志记录、事务管理和性能监控。Java中的动态代理通常使用 java.lang.reflect.Proxy 类或第三方库(如CGLIB)来实现。
我们可以创建一个实现了 InvocationHandler 接口的代理处理程序类。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class UserServiceProxy implements InvocationHandler {
private final UserService target;
public UserServiceProxy(UserService target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在方法调用前添加逻辑
System.out.println("Before invoking " + method.getName());
// 调用原始方法
Object result = method.invoke(target, args);
// 在方法调用后添加逻辑
System.out.println("After invoking " + method.getName());
return result;
}
}
动态代理只能代理接口,而不是具体的类。如果您需要代理具体的类,可以考虑使用第三方库,如CGLIB。使用CGLIB,您可以生成一个子类来实现代理,而不需要接口。
11. 计算机网络七层模型?
答:应用层,表示层,会话层,传输层,网络层,数据链路层,最下面的忘记了【物理层啊你个大笨蛋!】。【我说怎么最近面试官都问我计算机网络,原来简历上写了我会。我会个屁啊!】
12. 各种层里有什么协议?
答:应用层的 HTTP、DNS、FTP,传输层的 TCP、UDP,网络层的 IP、ARP、ICMP,数据链路层 MAC。
13. HTTP 和 HTTPS 有什么区别?
答:端口不一样。HTTPS 多一个安全协议。
正解:HTTP 与 HTTPS 区别
HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。
14. HTTPS 和安全相关的内容。
答:口胡把自己绕晕了。
正解:对称加密传输文本,非对称加密传输私钥。
1) SSL/TLS 的核心要素是非对称加密。非对称加密采用两个密钥——一个公钥,一个私钥。在通信时,私钥仅由解密者保存,公钥由任何一个想与解密者通信的发送者(加密者)所知。
2) 使用非对称加密,对对称加密的密钥进行加密,保护该密钥不在网络信道中被窃听。
为了公钥传输的信赖性问题,第三方机构应运而生——证书颁发机构(CA,Certificate Authority)。CA 默认是受信任的第三方。CA 会给各个服务器颁发证书,证书存储在服务器上,并附有 CA 的电子签名。第三方信赖机构 CA 之所以能被信赖,就是靠数字签名技术。数字签名,是 CA 在给服务器颁发证书时,使用散列+加密的组合技术,在证书上盖个章,以此来提供验伪的功能。
三、项目
1. 实习项目里做了什么?数据存在哪儿?
对象存储数据库。
评价
对面试官的打分:9 / 10 【出的题目不难,会深入挖掘一个点,可惜挖的都是我忘得差不多了的。在我口胡的时候不给我一些正确的引导 -1】
对本人的打分: 6 / 10 【口胡太多没几道题答出来 -3 在简历里写了计算机网络 -1】
记录 Java 后端面试经验