提问涉及集合类、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底层实现
算法:在纸上手撕股票买卖,拍照上传
反问:部门业务,面试反馈
买卖股票的最佳时机
// 找到所有升序
https://www.cnblogs.com/a1439775520/p/13076170.html
class Solution {
public int maxProfit(int[] prices) {
int ans=0;
for(int i=1;i<=prices.length-1;i++)
{
if(prices[i]>prices[i-1])
{
ans+=prices[i]-prices[i-1];
}
}
return ans;
}
}
public class Test {
/**
* 多个
*
* @param prices
* @return
*/
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
}
int cur = 0;
int vally = prices[0];
int peak = 0;
int income = 0;
while (cur < prices.length - 1) {
//找到卖出点,谷底
while (cur < prices.length - 1 && prices[cur] >= prices[cur + 1]) {
cur++;
}
vally = prices[cur];
//找到比当前大的值(即最高点,顶峰)
while (cur < prices.length - 1 && prices[cur] <= prices[cur + 1]) {
cur++;
}
peak = prices[cur];
income += peak - vally;
//如果此时cur仍然没有到最后,则进行再一次循环
}
return income;
}
public static void main(String[] args) {
Test121 t = new Test121();
int[] arr = {7, 1, 5, 3, 6, 4};
int i = t.maxProfit(arr);
System.out.println(i);
}
}
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;
- C语言面向过程与Java面向对象的区别?
1.面向过程:分析出解决问题的步骤,用函数把一个个步骤实现,使用时依次调用。面向对象:把问题按照功能划分成各个对象,更具有可扩展性。
2.面向过程:用函数描述对数据的操作,和数据分离开。面向对象:把数据和对数据的操作封装成整体操作。
3.面向过程:控制流程按程序预定顺序。面向对象:按运行时的实际发生,再调用。
4.面向过程:框架有MFC(我学过)。面向对象:框架很多,主要区别是在封装后有继承和多态特性。
5.通俗的说java有更多的封装好的API,一些功能可能c中结构体也能实现,但是需要更多的代码来实现,没有java便携好用,对程序员友好。
- 两台服务器(其中一台应该可以视作客户端)已经完成TCP三次握手连接,那如果此时拔掉网线,会发生什么?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
TCP设有保活计时器,时间设置为2小时。若2小时内服务器未收到任何数据,则会每隔75s发送一个探测报文段,一连十个没反应,则断开连接。
- HTTP的请求方式。
答:常用的有GET、POST、PUT、DELETE。
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请求的)。
Spring Boot用过哪些注解?
答:@Repository、@Service、@RestController、@PostMapping、提示下想起来@Autowired。提到@Autowired,那么了解IoC吗?讲讲IoC有什么作用。
IOC是控制反转的意思,意味着控制权的交换。两个相互依赖的对象本来要程序员手动创建,现在将他们解耦,全部由IOC创建,存放在容器中,这个角度IOC也是个容器。我们在需要的地方,通过IOC的依赖注入来获得对象。
- 有十亿的整型数据,范围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,他却都排序了,做了无用功。
位图法:
位图法的原理主要就是利用int类型数据,一个int类型数据是4个字节,一个字节8位,然后一个int数据利用自身字节位就可以表示0-31的数是否存在,bit位表示数值,位上0,1值表示这个数值是否存在。
https://www.jianshu.com/p/f672de30d436
总结
面试官在我反问的时候,问我是不是每准备面试(T - T),无话可说,因为确实没怎么准备,8月份基本在刷算法(不然大部分笔试都过不了),结果之前实习背的八股都忘了。
面试官问的都比较基础,然而还是大部分都没答到点上,说明基础薄弱,需要再针对性看一下Java、TCP、HTTP相关的基础,还需要复习一下排序算法。
- 没有好好准备面试。
- 需要针对Java基础、TCP、HTTP基础再复习一下。
- 需要学好设计模式和框架原理。
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万,需要实现排行榜,升级后能立即显示在全服的等级排名;
(玩过的都知道,等级低升级快,怎么解决在低等级时大量玩家同时升级,且频率高的问题)
对东财有什么了解;
作为理工男,愿不愿意学习金融知识;