提问涉及集合类、mysql、jvm、多线程、hashmap、zk,mq
没问项目,估计看我项目太垃圾
1、集合常用哪些类,arraylist和linkedlist的比较
2、Java多线程(线程如何创建、怎么使用线程池)
3、锁升级
4、JMM
5、垃圾回收算法
6、HashMap一套
7、redis数据类型及底层实现(主要跳表)
8、缓存一致性
缓存一致性问题:程序运行时,会将数据从主存复制到CPU缓存,CPU从缓存中读取,进行计算并写入数据,最后把缓存中的数据刷新到主存中。在多线程,多CPU时,可能存在多个缓存,导致共享变量同一时间各缓存中数据不同,导致错误,出现缓存不一致问题。
解决方法:MESI协议、总线加LOCK,锁的方式。
MESI协议:保证每个缓存中使用的共享变量的副本一致。(思想:对单个缓存行加锁。当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU也存在副本,他会发出信号通知其他CPU将该变量的缓存行址维无效)

9、mysql引擎知道哪些,区别是什么(我说了myisam和innodb)
MySQL 支持多种存储引擎,比如 InnoDB,MyISAM,Memory,Archive ,默认引擎是InnoDB。
MyISAM 和 InnoDB 的区别:

  • InnoDB 支持事务,MyISAM 不支持
  • InnoDB 支持外键,而 MyISAM 不支持
  • InnoDB 是聚集索引:数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
  • InnoDB 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高; (但是可以通过sphinx插件支持,5.6.4之后都支持)
    • 全文索引主要用来解决where name like %zhang% 等针对文本的模糊查询效率低的问题
  • InnoDB 不保存表的具体行数,MyISAM 用一个变量保存了整个表的行数。
  • InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁,MyISAM 采用表级锁(table-level locking)。

InnoDB :支持事务、外键、聚集索引、行级锁,不支持全文索引、不保存表的具体行数
MyISAM:不支持事务、外键、聚集索引、表级锁,支持全文索引、用变量保存表的行数

10、mysql慢查询
MySQL慢查询就是在日志中记录运行比较慢的SQL语句,这个功能需要开启才能用

11、mysql组件(不太了解,尴尬)
连接器——与MySQL服务器相连
查询缓存
分析器——词法分析、是否符合语法
优化器——选择索引、表,确定sql执行顺序
执行器——执行sql,判断查询、修改权限
调用InnoDB引擎接口取表中的每一行,判断逻辑
12、索引以及explain使用
索引是一种为了提高表查询效率的数据结构。

13、各种mq的优势以及怎么选择
14、zk选举(说了一种场景,详细说说选举过程)
15、cas底层实现

算法:在纸上手撕股票买卖,拍照上传
反问:部门业务,面试反馈

  1. 买卖股票的最佳时机
  2. // 找到所有升序
  3. https://www.cnblogs.com/a1439775520/p/13076170.html
  4. class Solution {
  5. public int maxProfit(int[] prices) {
  6. int ans=0;
  7. for(int i=1;i<=prices.length-1;i++)
  8. {
  9. if(prices[i]>prices[i-1])
  10. {
  11. ans+=prices[i]-prices[i-1];
  12. }
  13. }
  14. return ans;
  15. }
  16. }

image.png
image.png

  1. public class Test {
  2. /**
  3. * 多个
  4. *
  5. * @param prices
  6. * @return
  7. */
  8. public int maxProfit(int[] prices) {
  9. if (prices == null || prices.length == 0) {
  10. return 0;
  11. }
  12. int cur = 0;
  13. int vally = prices[0];
  14. int peak = 0;
  15. int income = 0;
  16. while (cur < prices.length - 1) {
  17. //找到卖出点,谷底
  18. while (cur < prices.length - 1 && prices[cur] >= prices[cur + 1]) {
  19. cur++;
  20. }
  21. vally = prices[cur];
  22. //找到比当前大的值(即最高点,顶峰)
  23. while (cur < prices.length - 1 && prices[cur] <= prices[cur + 1]) {
  24. cur++;
  25. }
  26. peak = prices[cur];
  27. income += peak - vally;
  28. //如果此时cur仍然没有到最后,则进行再一次循环
  29. }
  30. return income;
  31. }
  32. public static void main(String[] args) {
  33. Test121 t = new Test121();
  34. int[] arr = {7, 1, 5, 3, 6, 4};
  35. int i = t.maxProfit(arr);
  36. System.out.println(i);
  37. }
  38. }
  1. 面向对象的三大特征?
    答:封装、继承、多态。

  2. 多态的表现形式?
    在Java中,对于多态的核心表现主要有以下两点

1.方法多态
重载:同一个名称可以根据参数列表的不同调用不同方法体
重写:同一个父类的方法可以根据实例化子类的不同有不同实现
2.对象多态
向上转型(99%):将子类对象变成父类对象
语法:父类 父类引用 = new 子类实例;,例如Person per = new Student();
应用场景:参数统一化。例如要求定义一个方法,这个方法可以接收Person类的所有子类实例,并调用Person类方法。参数列表就写父类
public static void WhoYouAre(Person per){
per.print();}
向下转型(1%):将父类对象变成子类对象
语法:子类 子类实例 = (子类)父类实例;,例如Student stu = (Student) per;
应用场景:发生在父类引用需要调用子类扩充的方法时,才向下转型成子类引用去调用其方法
前提:可以向下转型,首先是发生了向上转型,不然会报运行时异常,通常在向下转型前使用instanceof进行判断,看该引用能不能指向该类。
if(!(per instanceofStudent)){
per =newStudent();// 先建立起联系
}
Student stu =(Student) per;

  1. C语言面向过程与Java面向对象的区别?

1.面向过程:分析出解决问题的步骤,用函数把一个个步骤实现,使用时依次调用。面向对象:把问题按照功能划分成各个对象,更具有可扩展性。
2.面向过程:用函数描述对数据的操作,和数据分离开。面向对象:把数据和对数据的操作封装成整体操作。
3.面向过程:控制流程按程序预定顺序。面向对象:按运行时的实际发生,再调用。
4.面向过程:框架有MFC(我学过)。面向对象:框架很多,主要区别是在封装后有继承和多态特性
5.通俗的说java有更多的封装好的API,一些功能可能c中结构体也能实现,但是需要更多的代码来实现,没有java便携好用,对程序员友好。

  1. 两台服务器(其中一台应该可以视作客户端)已经完成TCP三次握手连接,那如果此时拔掉网线,会发生什么?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接

TCP设有保活计时器,时间设置为2小时。若2小时内服务器未收到任何数据,则会每隔75s发送一个探测报文段,一连十个没反应,则断开连接。

  1. HTTP的请求方式。
    答:常用的有GET、POST、PUT、DELETE。

image.png

  1. GET和POST的区别
    答:GET安全,POST不安全(追问:GET为什么不安全?-在地址栏输入会被看见或被拦截-那POST不会被拦截吗?-会,然后被问住了)。

    • GET在浏览器回退时是无害的,而POST会再次提交请求
    • GET产生的URL地址可以被Bookmark,而POST不可以。
    • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    • GET请求只能进行url编码,而POST支持多种编码方式。
    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    • GET请求在URL中传送的参数是有长度限制的,而POST么有。
    • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    • GET参数通过URL传递,POST放在Request body中。
    • 但是二者底层都是TCP连接,以上的区别是HTTP的规定的行为准则,导致了它们在应用过程中体现出一些不同。
    • GET产生一个TCP数据包,POST产生两个TCP数据包。对于GET的请求,浏览器会把header和data一起发送,服务器响应200。而对于POST请求,浏览器先发送header,服务器响应100 再继续发送data,服务器响应200(但是也有浏览器:像火狐浏览器还是一次性发送POST请求的)。
  1. Spring Boot用过哪些注解?
    答:@Repository、@Service、@RestController、@PostMapping、提示下想起来@Autowired。

  2. 提到@Autowired,那么了解IoC吗?讲讲IoC有什么作用。

IOC是控制反转的意思,意味着控制权的交换。两个相互依赖的对象本来要程序员手动创建,现在将他们解耦,全部由IOC创建,存放在容器中,这个角度IOC也是个容器。我们在需要的地方,通过IOC的依赖注入来获得对象。

  1. 有十亿的整型数据,范围1-10000,用什么排序算法?

有十亿的整型数据,找出前10000,用什么排序算法?https://blog.csdn.net/zyq522376829/article/details/47686867
top-K问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。
针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆
(字典树,功能和hashmap接近,不过它key是字符串,优势在于它插入和查询复杂度都是O(k)
小顶堆就是最小堆)
即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树或者Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。

快排:内存不够,要多次,O(nlogn),我只要前10000,他却都排序了,做了无用功。
image.png
image.png

image.png
image.png
位图法:
位图法的原理主要就是利用int类型数据,一个int类型数据是4个字节,一个字节8位,然后一个int数据利用自身字节位就可以表示0-31的数是否存在,bit位表示数值,位上0,1值表示这个数值是否存在。
image.png

image.png

https://www.jianshu.com/p/f672de30d436

总结

面试官在我反问的时候,问我是不是每准备面试(T - T),无话可说,因为确实没怎么准备,8月份基本在刷算法(不然大部分笔试都过不了),结果之前实习背的八股都忘了。
面试官问的都比较基础,然而还是大部分都没答到点上,说明基础薄弱,需要再针对性看一下Java、TCP、HTTP相关的基础,还需要复习一下排序算法。

  1. 没有好好准备面试。
  2. 需要针对Java基础、TCP、HTTP基础再复习一下。
  3. 需要学好设计模式和框架原理。

base南京,大概一小时,跟牛课上同学们说的30分钟出入有点大,隔了一周,只记得一部分了
手撕是力扣的题目,跳台阶到终点的最小步数,本地敲了通过腾讯会议发给面试官看
跳到n的时候有两种情况:n-1 + n-2

线程安全的集合类,并发下要使用hashmap怎么解决,concurrentHashMap ,get方法加不加锁;
Mybatis一二级缓存,怎么跟数据库建立连接的;
GC算法,了不了解三色标记法;
mysql隔离级别,默认什么级别,RR有没有解决幻读问题,如何解决的;
一张表主键id只有四个值1、3、5、7,现在使用select * from table where id>6 for update, 间隙锁锁住了哪一块区间;
类加载过程,在类路径下写了一个java.lang.String,会不会覆盖原有的String核心类,为什么有时候需要打破双亲委派;
JUC有没有了解,都有哪些同步手段,(CyclicBarrier不会读,场面很尴尬)ReentrantLock和Synchronized相比有什么不同;
想要实现线程按顺序执行,用什么手段,答了Semaphore,可能不是面试官想听的,提示我notify和Condition唤醒有啥不同,应该是想用Condition实现;
HashMap了解吗,为什么在长度是8的时候转红黑树
知识点可能比较简单,但是可能会突然灵光一闪地提出一些八股没背到的东西;
反问大概多久出结果,业务是B端还是C端;

补充一个:25匹马,5个赛道,没有计时器,只知道排名,最少需要多少次能找到最快的三匹马(7)。
25/5 = 5
每个
https://blog.csdn.net/qq_32040767/article/details/77677186

二面
base南京,大概20分钟,面试官比较严肃
没有手撕
项目遇到难点和解决;
底层是数组实现的集合有哪些;
JVM运行时数据区,哪个区不会OOM;
GC算法和垃圾回收器;
怎么解决超卖问题,如果用户下单未付款怎么解决;
数据库添加索引一般在多少数据量,一张表20个字段,如果要添加索引,你认为多少个比较合适;
场景题:游戏开服,等级分为1—100级,在线人数较多,假设1000万,需要实现排行榜,升级后能立即显示在全服的等级排名;
(玩过的都知道,等级低升级快,怎么解决在低等级时大量玩家同时升级,且频率高的问题)
对东财有什么了解;
作为理工男,愿不愿意学习金融知识;