1.面试题
一、JAVA基础
1. 值传递和引用传递的区别
- 值传递: 实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参
- 引用传递:实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域 对形参的修改会影响实参
2.重载和重写的区别
重写 : 就是在子类中把父类本身有的方法重新写一遍
重载 : 在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
3.java类加载器
4.java的内存机制
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
5.java的数据结构
6.单例和多例的区别
7.java的反射机制是什么
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
8.高并发如何处理
解决方式一:在前端加上ngnix 负载均衡服务器
9.什么是同步锁
10.什么是乐观锁
11.什么是悲观锁
12.接口和抽象类的区别
Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者是 public。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
13.概括的解释下线程的几种可用状态
线程在执行过程中,可以处于下面几种状态:
- 就绪(Runnable):线程准备运行,不一定立马就能开始执行。
- 运行中(Running):进程正在执行线程的代码。
- 等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。
- 睡眠中(Sleeping):线程被强制睡眠。
- I/O 阻塞(Blocked on I/O):等待 I/O 操作完成。
- 同步阻塞(Blocked on Synchronization):等待获取锁。
- 死亡(Dead):线程完成了执行。
二、spring
spring框架的IOC、AOP个人的理解:
IOC :
1.IoC(Inversion of Control)是指容器器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权
由应用代码中转到了了外部容器,控制权的转移是所谓反转。 对于Spring⽽⾔,就是由Spring来控制对象的⽣生命周期和对象之间的关系;
2.在Spring的⼯作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后
spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由
spring来控制,也就是说控制对象⽣生存周期的不再是引⽤用它的对象,⽽而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
3.在系统运行中,动态的向某个对象提供它所需要的其他对象。
4.依赖注入的思想是通过反射机制实现的,在实例化⼀一个类时,它通过反射调⽤用类中set方法将事先保存在HashMap中
的类属性注⼊入到类中。
AOP :
1.作用:就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
2.实现:
一是采⽤用动态代理理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
二是采⽤用静态织⼊入的⽅方式,引入特定的语法创建“⽅面”,从而使得编译器可以在编译期间织入有关“⽅面”的代码
使⽤用场景:
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
spring事务的传播机制
a. 七个事传播属性:
- PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATIONREQUIRESNEW -- 新建事务,如果当前存在事务,把当前事务挂起。
- PROPAGATIONNOTSUPPORTED -- 以非事务⽅方式执⾏行行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER -- 以非事务方式执行行,如果当前存在事务,则抛出异常。
- PROPAGATIONNESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与
PROPAGATIONREQUIRED类似的操作。
b. 五个隔离级别: - ISOLATION_DEFAULT 这是⼀一个PlatfromTransactionManager默认的隔离级别,使⽤用数据库默认的事务隔离级别.
- 另外四个与JDBC的隔离级别相对应:
- ISOLATIONREADUNCOMMITTED 这是事务最低的隔离级别,它充许别外⼀一个事务可以看到这个事务未提交的数
据。这种隔离级别会产⽣生脏读,不不可重复读和幻读。 - ISOLATIONREADCOMMITTED 保证⼀一个事务修改的数据提交后才能被另外⼀一个事务读取。另外⼀一个事务不不能读取
该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不不可重复读和幻读。 - ISOLATIONREPEATABLEREAD 这种事务隔离级别可以防⽌止脏读,不不可重复读。但是可能出现幻读。它除了了保证
⼀一个事务不不能读取另⼀一个事务未提交的数据外,还保证了了避免不不可重复读。 - ISOLATION_SERIALIZABLE 这是花费最⾼高代价但是最可靠的事务隔离级别。事务被处理理为顺序执⾏行行。除了了防⽌止脏
读,不不可重复读外,还避免了了幻读。
c. 关键词:
1、幻读:事务1读取记录时事务2增加了了记录并提交,事务1再次读取时可以看到事务2新增的记录;
2、不可重复读:事务1读取记录时,事务2更更新了了记录并提交,事务1再次读取时可以看到事务2修改后的记录;
3、脏读:事务1更更新了了记录,但没有提交,事务2读取了了更新后的行,然后事务T1回滚,现在T2读取⽆无效。
三、redis
redis基本数据类型
string,hash,list,set,sorted set;
四、mysql
1. 防止sql注入用哪几种方式
2. 说出数据连接池的工作机制是什么
J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。实现方式,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法不是真正关连接,而是把它代理的 Connection 对象还回到连接池中。