一、3.18 上午 中原银行一面 20分钟
1.数据库插入一条数据
insert into tablename (列1,列2,列3…) values(值1,值2,值3…)
2.事务ACID
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
3.你怎么用的事务,注解还是配置文件?
声明式事务 编程时事务
4.注解基于什么?
一种应用在类、方法、参数、属性、构造器上的特殊修饰符
AOP
注解就是继承自Annotation的接口,他没有行为只有数据,让其实现行为必须有实现对象(代理对象)
基于反射实现【反向代理】
5.介绍项目,CRUD Boy
6.主键怎么设的?自增主键 Redis怎么自增,incr?
Redis Incr 命令将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
原子自增 线程安全
INCR page_view
7.索引了解吗?
8.synchronize加在静态和非静态。锁类锁对象
1.直接作用于实例方法,相当于给当前对象加锁,进入同步代码前要获得当前实例的锁。这个锁称为对象锁,加锁的对象是当前实例,两个线程使用的是同一个对象
public class Syn implements Runnable {
static Syn syn=new Syn();
static int i=0;
//synchronized直接作用于实例方法,需要拿到对象锁
public synchronized void increase() {
// TODO Auto-generated method stub
i++;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int j=0;j<10000;j++)
{
increase();
}
}
public static void main(String[] args) throws InterruptedException {
//两个线程同时执行syn对象的run方法
Thread thread=new Thread(syn);
Thread thread1=new Thread(syn);
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println(i);
}
}
2.2.直接作用于静态方法,相当于给当前类加锁,进入同步方法要获得当前类的锁。我们首先看这个例子,尽管加了synchronized这个关键字,依然是线程不安全的。因为这时两个不同的线程指向不同的对象。如果在synchronized加static ,就能够保持线程安全。此时请求是当前类的类锁。这个锁称为类锁。
public class Syn implements Runnable {
//static Syn syn=new Syn();
static int i=0;
public static synchronized void increase() {
// TODO Auto-generated method stub
i++;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int j=0;j<10000;j++)
{
increase();
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(new Syn());
Thread thread1=new Thread(new Syn());
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println(i);
}
}
9.线程池参数。
10.等待队列可以一直放吗?不可以,会拖垮内存和线程。
简单的理解是同步队列存放着竞争同步资源的线程的引用(不是存放线程),而等待队列存放着待唤醒的线程的引用。
11.ThreadLocal 使用注意事项?【解决共享变量】
1.ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
2.使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。
3.ThreadLocalMap是ThreadLocal的内部静态类,而它的构成主要是用Entry来保存数据 ,而且还是继承的弱引用。在Entry内部使用ThreadLocal作为key,使用我们设置的value作为value
脏数据
由于线程池会复用Thread对象,南无与Thread绑定的类的static属性的ThreadLocal变量也会被复用,如果在现成的run()方法中不明显的代用remove()方法,就可能会get(重要的线程信息。)
内存泄漏
实际上 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。
ThreadLocal有三个方法,get set remove 最后 remove必须要进行执行,否则会发生内存泄漏,因为提示表明了static表明threadlocal修饰
12.redis幂等性。setnx对吗?
任意多次执行所产生得影响均与一次执行的影响相同,对数据库的影响只能是一次性的,不能重复处理。在实际项目中,在客户端没限制幂等性,重复调用接口,导致接口数据重复写入数据。
解决接口幂等性有多种方式,建立数据库唯一索引,乐观锁或悲观锁,程序先查询后判断,唯一标识机制等。本文介绍使用redis生成唯一标识来限制接口重复提交,实现接口幂等性。
主要使用redis数据存入,注解拦截处理,校验redis的key,实现逻辑比较简单,实现写入数据接口幂等性十分重要,在接口被客户端调用时,在不影响业务逻辑的情况,保证数据不重复写入数据数据库,防止脏数据和乱数据的写入。
13 .实习过吗?
14 .学习网站?
15. 等等等等....
都没深问,感觉他们时间挺紧张的,自己也没敢放开说。
二、中原银行:2021年9月10日
1.继承、继承的实现方式
继承描述的是一种能力:可以使用现有类的所有功能,并在无需重新编写原有类的情况下进行功能上的扩展。
子类 extends 父类。
2.介绍springboot
3.抽象类和接口
4.索引
5.三大范式
第一范式(确保每列保持原子性)
第二范式(确保表中的每列都和主键相关)
第三范式(确保每列都和主键列直接相关,而不是间接相关)
6.linux、查看某一进程号、路径
ps -aux | grep 进程
top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
三、2021.8.28 做了笔试题
2021.9.9 收到一面邮件
2021.9.10 面试
腾讯会议,用了手机,面试大概15分钟
1、自我介绍
2、项目,内容、代码量
3、数据结构: 栈的应用场景,稳定算法哪些?
栈在表达式求值中的应用 : 编译器通过两个栈来实现,一个栈用来保存操作数,一个栈用来保存运算符
栈在括号匹配中的应用
如何实现浏览器前进和后退
4、网络:TCP,UDP
5、Linux: 查看进程,杀死进程 命令
管道符 top kill kill -9 进程号
6、数据库:三大范式,增删改查
7、Java:final, 接口与抽象类。
总体比较简单,两个面试官也挺好,可能岗位不合适...
祝大家好运!!!
零、2月25日投递简历。
投递成功后邮箱会受到回复。
四、一、笔试 3月2日 120min
在指定时间段进去答题就行,时间2小时,综合难度相较于一线大厂比较简单。
- 认知能力测试(10题)
- 计算机通识(10题)
- 岗位客观题(20题)
- 岗位主观题(2题,编程或简答)
- AI视频面试胜任力测评(7道题) 6 . 人岗匹配度( 4 题)
五、1面 3月5日 40min
两个技术面试官:
1.自我介绍。
2. 介绍项目。
3 . 熟悉的集合。
4. Map如何遍历。
在for循环中使用entries实现Map的遍历
Map <String,String>map = new HashMap<String,String>();
map.put("熊大", "棕色");
map.put("熊二", "黄色");
//key
for(String key : map.keySet()){
System.out.println(key);
}
//value
for(String value : map.values()){
System.out.println(value);
}
通过Iterator遍历
Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+":"+value);
}
5. CourrentHashMap。
6 . 线程的实现方式,线程池主要参数。
1.第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满
2.第二种DisCardPolicy:不执行新任务,也不抛出异常
3.第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行
4.第四种CallerRunsPolicy:直接调用execute来执行当前任务
7. 解决多线程的方法。
8. MySQL事务、幻读的解决办法。
9 . 用过的Redis数据类型、分布式锁(set、Redisson)。
10. Redis持久化策略。
11 . 快排原理及时间复杂度空间复杂度。
下午面试,当天晚上就收到了面试通过的邮件,效率很快,赞!
六、2面 3月12日 30min
一个面试官,应该是小领导,态度很友好。
1. 自我介绍。
2. 介绍项目。
3 . JVM&GC。
4. 为什么不选择考研。
5 . 为什么想加入中原银行。
6. 未来的职业规划。
7 . 都去帝都了为什么想回河南老家。
8. 都投了哪些公司&手里的offer。
9 . 帮我分析了一波比较不错的河南企业(中移在线、中原银行、牧原集团...)。
10. 家庭情况。
11 . 主动给介绍了一下中原银行。
当天晚上同样收到面试通过的邮件。
七、3面 3月13日 30min
一个面试官,穿着正式,挺严肃的感觉。
1. 自我介绍。
2. 介绍项目。
3 . 为什么不考研......
4. 你相较于研究生的优势。
5. 在京实习半年的收获。
6 . 对中原银行的看法。
7. 为什么秋招的时候没有投简历。
8 . 手里有哪些offer,及offer薪资和期望薪资。
同样当天收到人事面试通过的通知,这反馈速度,爱了爱了。
五、测评 3月14日 40min
一些常见的性格测试
六、offer 3月15日
虽然轮数很多,但是总的来说面试体验很棒,面试官态度都很好,大赞。
评论