跟谁学面经
-
微信点赞测试
(1)功能测试
是否可以点赞
是否可以取消点赞
多次点赞是什么情况
多人点赞顺序是否按照时间顺序排列
点赞后是否显示头像和名称
点赞后是否能进行评论
点赞后退出再进入时是否还存在点赞消息
多用户点赞再次打开朋友圈是否可以按照顺序看谁点赞了
点赞之后相同好友是否收到点赞信息
相同好友收到的点赞信息是否按照时间排列
相同好友的点赞是否显示头像和名称
(2)兼容性测试
不同手机端和电脑端是否可以点赞和取消
不同移动端是否可以点赞和取消
(3)性能测试
弱网点赞
网络断开是否可以点赞
用户点赞后多长时间可以看到点赞成功,还有取消时间
多用户同时点赞是否可以完全收到提示信息
(4)安全性测试
点赞是否会泄漏用户信息 -
数据库查询语句
Select语句 -
平时怎么学习
如果有时间会拿专业的书和视频配合学习,如果时间很赶的话就会看网上的文档、经验贴、技术博客来学习 -
手写快排
-
数据库逆序查询
Select * from table order by filename desc.
(desc是逆序查询) -
链表查询
-
排序
直接插入排序
void InsertionSort(vector<int> &data){
for(int i = 1;i<data.size();++i){
int tmp = data[i];
for(int j = i;j>0&&tmp<data[j-1];--j){
data[j]=data[j-1]; //向后覆盖
}
data[j]=tmp;
}
}
简单选择排序
void SelectSort(vector<int> &data){
for(int i = 0;i<n-1;++i){
int min = i;
for(int j = i;j<n;j++){
if(data[j]<data[min])
min = j;
}
if(i!=min) swap(data[i],data[min]);
}
}
-
手撕归并排序
-
数组查重
-
字符串最长连续子串
-
如果你是一个小组的领导,和另一个小组合作一个任务,然而另外一个小组的小组长去干别的任务了,会影响到你们组的进度,你该咋办
与那个小组长协商,让他们组选出一个熟悉业务的代理小组长,和代理小组长交涉。主要思想就是让对方组除了小组长之外的人一起完成任务。 -
如果你是个领导,你的下属说不想做枯燥乏味的搬砖工作了,想干别的活,你该咋办(一下子感觉自己走错片场)
-
了解一下他到底想做什么。告诉他,看别人的工作老是觉得这是光鲜亮丽、多姿多彩的,但其实不深入了解根本不知道那个工作到底是什么样子,想换的工作只是处于想象之中。
-
如果他没有特定的想做的工作,我就会让他多思考一下自己到底想要什么,大家都是成年人,除了兴趣之外还要考虑生活,考虑很多东西,不能凭一时冲动就做出一些不一定正确的决定。况且,我认为任何工作做一段时间失去新鲜感可能都会有一个疲倦期,多做一些相关的有趣的事情,比如自己去实现一些有趣的项目啊,找到成就感,就不会对自己的事业那么排斥了。
-
如果他真的有什么远大理想,毕生追求,自己想得很清楚的话,我觉得应该鼓励他去追求。
-
你有男朋友吗,他是哪个学校的,干啥的,他找实习了吗,以后你俩想去哪发展呀(一下子感觉到了来自面试官的母爱)!!!
无 -
索引种类
普通索引,加速查询
唯一索引,加速查询+列值唯一(可以有null)
主键索引,加速查询+列值唯一(不可以有null)+表中只有一个
组合索引,多列值组成一个索引,专门用于组合搜索,效率大于索引合并
全文索引,对文本内容进行分词搜索
索引类型:
Fulltext,全文索引。只有char、varchar、text列可以建立全文索引。
Hash,类似于键值对,高效
Btree,默认和最常用的索引类型
Rtree,少用,优势在于范围查找。存储引擎MyISAM、BDb、innoDb、NDb -
建立索引应该注意什么
把该字段按照一定的方式排序,建立索引。
注意: -
如果对权标都要扫描,那么建立索引没有意义。
-
对非唯一字段,比如性别,增加索引没有意义
-
对于记录比较少的表,如果建立索引就要占用很多空间,不会带来速度优化反而浪费存储空间。 对于update/insert/delete执行,字段的索引都要重新计算
-
sql怎么优化
-
数据库设计方面
表与表的业务联系要明确
表字段尽量使用数值型,数值型字段在mysql底层应用性能比string类型好
建立合理的索引 -
Sql语句优化
-
合理使用表连接(不超过5个表连接)
考虑使用临时表或表变量存放中间结果
视图嵌套不要过深(不超过2个)
表连接得越多性能越差
最好将连接拆分成若干个过程逐一执行
外连接效果差,必须对左右表都进行扫描
尽量使用inner join查询(outer join意味着必须对左表或右表查询所有行) -
合理使用索引,
通配符中like的使用 select id,name from userinfo where name like ‘name%’这样是会使用索引的,而用‘%name%‘或者‘%name‘的形式是会全表扫描的。(通配符使用在首位就无法用索引)
Where子句左边不要用函数、算数运算、其他表达式运算。用了就不会用索引了
Where子句不要用is null, is not null判断,用了就不是索引了
避免在where子句中使用!=或者< >操作符
少用in和not in
少用or,用union代替
不要建立太多索引,索引会提高select的效率,但是会降低insert和update的效率
Select … from … on … where … group by…having …order by…limit…
On where having,尽量在where过滤,比having早
Not in 效率低用not exists代替
数据量过大的时候少用select*
读写分离和分库分表 -
索引数据结构,为什么用B+树
首先,B+树的一个结点就是一页,磁盘读取以页为单位,减少磁盘io次数,会使查询效率提高(局部性原理)。B+树的内结点不存数据,只存索引。 -
聚集索引和非聚集索引
聚集索引通过索引可以查到需要查找的数据,而非聚集索引可以查找到对应的主键值,再通过主键的值查找到需要的数据 -
- JVM分区
堆
栈
本地方法栈
程序计数器
方法区
- JVM分区
-
垃圾回收算法
标记清除算法:标记清除过程效率不高,清除后产生不连续的内部碎片
复制算法:分成两块,每次只对其中一块内存进行回收,效率高。最大可分配内存少了一半。
标记整理算法:让所有对象都移向一边,然后清理到端边界以外的内存。
分代收集:根据对象的存活周期将内存划分为几块。分为新生代和老年代。新生代用复制算法,老年代用标记清除算法或者标记整理算法。
增量算法:垃圾收集线程和应用程序线程交替执行,直到垃圾收集完成。 -
volatile作用
用volatile修饰的变量,线程在每次使用变量时都会读取变量修改后的值,不进行编译器优化,volatile变量随时可能变化,每次从地址中读取。 -
get和post请求的区别和用法
区别: -
get在浏览器回退是无害的,post会再次提交请求
-
get请求会被浏览器主动cache,post不会
-
get请求只支持url编码,post请求支持多种编码
-
get请求参数会被完整保存在浏览器历史记录,post参数不会被保留
-
get请求在url中传送的参数有长度限制,post没有长度限制
-
get只接受ascii字符,post没有限制
-
get更不安全,参数直接暴露在url
-
get参数通过url传递,post放在request body
post更安全
post能发送的数据量更大
post能发送更多的数据类型
post比get慢
post请求产生两个tcp包,get请求产生一个tcp包
get是从服务器获取数据,post是给服务器传送数据
数据查询时建议用get,数据添加、修改、删除时建议用post
包含机密的话用post更好
-
从技术层面讲讲在线教育和抖音这种短视频平台的区别
-
最长的无重复子字符串 https://leetcode.com/problems/longest-substring-without-repeating-characters
-
10万个数找出最大的不重复的10个
先hash去重,用最小堆,不断往最小堆中插入数字,当堆的元素超过10个时,就将堆顶的元素弹出。最后中序遍历小顶堆是有序的最大不重复的十个数 -
重载和重写
重载:一个类中多个方法有相同的名字,方法的参数列表不同。是多态性的体现。
重写:重写是针对子类对父类的重写,有相同的方法名,参数列表,返回值 -
Java面向对象的特点
封装:根据职能将属性和方法封装在一个抽象的类中,用类创建对象,用对象调用方法,对象方法的细节都封装在类中。
继承:实现代码重用,相同的代码不需要重复写。子类拥有父类的属性和方法。
多态:由于子类重写了父类的方法,用父类的引用指向子类的对象,调用方法时进行动态绑定。提高可扩展可维护性。 -
mysql的存储引擎,区别
myisam:不支持事务,不支持外键
innodb:支持事务 -
复合索引的查找规则
-
表中(id,Name) ,根据name查找,怎么个查找过程
-
TCPIP哪层t
Tcp传输层,ip网络层 -
TCP UDP区别,聊天为什么UDP。
-
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
-
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
-
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
-
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
-
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
-
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
-
线程间通信
Wait/notify 等待
Volatile 内存共享
阻塞队列 -
进程间通信
管道
消息队列
信号量
共享内存 -
堆区和栈区的区别
-
栈是自动分配,堆是人为分配
-
栈获得空间较小,堆获得空间较大
-
栈分配的速度较快,堆分配的速度较慢
-
栈向下生长,堆向上生长
-
同步异步
同步:程序1调用程序2时,程序1停下来等待,直到程序2完成回到程序1,程序1才继续执行下去
异步:程序1调用程序2,程序1继续执行自己的下一个动作,不受程序2的影响 -
什么是野指针
指向不可知位置的指针
危害:触发段错误
避免:定义指针时初始化为null;使用完之后赋值为null -
常见的hash算法
MD4,MD5 -
hash表满了,效率变低之后,你想怎样处理?
虚函数原理
被virtual关键字修饰的成员函数就是虚函数。主要是为了实现多态。
实现原理:虚函数表+虚表指针。每个类使用一个虚函数表,每个类对象使用一个虚表指针 -
malloc和new
malloc是库函数,new是运算符
new底层是用malloc实现的,但是new更加智能,因为会自动执行构造函数和析构函数
new返回指定类型的指针,malloc返回void* -
指针和引用
指针是地址,引用是别名
指针可以为空,引用不能为空
指针可以有多级,引用只能有一级
指针可以改变指向,引用不能改变
有const指针,没有const引用
Sizeof指针是指针的大小,sizeof引用时对象的大小 -
判断一个点在不在三角形内部(这种题我居然也想了快三分钟。。。我真是个智障。。)
用double算面积相等只能跑出百分之五十多
3次握手,4次挥手
48.http状态码(gg)
100-199请求收到继续处理
200-299成功
300-399资源重定向
400-499客户端请求出错
500-599服务器端出错
200响应成功
302跳转,重定向
400客户端语法错误
403服务器拒绝提供服务
404资源不存在
505服务器内部错误
score (id, 科目, 分数, 学生id) 学生表(学生id,姓名) 求数学排名前三的学生id,及分数。
49. 编程是斐波拉契数列和反转整数
50. 数学问题(不知道怎么就考这个,,):时钟,时针指向1,分针指向0,一点整时,时针和分针夹角多少度。然后当分针越过时针,夹角再为30度时,时间是多少?(感觉像是在考编程。。可以理解为下次30度在什么时间)
30度
- 测试的职责
搭建测试环境、撰写测试用例、执行测试用例、写测试计划和测试报告、测试、提交bug表单跟踪bug修改情况、执行自动化测试、执行性能测试
非递归遍历二叉树
递归
修饰符作用范围
时间复杂度