测开面经整理

项目介绍

1.项目负责模块的流程,具体怎么做

基础知识

2.git常用命令
https://blog.csdn.net/u012505618/article/details/78552522

3.面向对象有三大特征:封装性、继承性、多态性(2)

封装:对类的自身属性和方法进行保护,不被外部类访问。
继承:两个类之间具备一定的关系,这种关系允许一个类访问另外一个类的方法和属性。也就是我们常说的父类和子类:父类是指被访问的类;子类是指访问的类
多态:一种接口,多种形态。通过一种接口,实现不同的目的。

4.python常见的数据类型,list set 的区别,底层实现

Number(数字)
String(字符串)

List(列表)
(1)元素外置,每个元素只存储id
(2)分离式结构,表内元素和表头信息不在一起
(3)动态扩充,在python中创建空list时,会申请一个8个元素大小的内存区域。以后如果满了,就扩容4倍,不断反复,直至当元素总数达到50000时,再扩容就改为2倍

Tuple(元组)

Set(集合)
set(): 一种可变的、无序的、有限的集合,其元素是唯一的、不可变的(可哈希的)对象。
frozenset(): 一种不可变的、可哈希的、无序的集合,其元素是唯一的,不可变的哈希对象。

Dictionary(字典):CPython使用伪随机探测(pseudo-random probing)的散列表(hash table)作为字典的底层数据结构,故只有可哈希的对象才能作为字典的键

list:
1.可以重复且有序
set:
2.不可重复且无序

5.常用标准库

datetime time copy random functools os.path logging json

6.MVC架构

模型(Model):负责存储系统的中心数据。
视图(View):将信息显示给用户(可以定义多个视图)。
控制器(Controller):处理用户输入的信息。负责从视图读取数据,控制用户输入,并向模型发送数据,是应用程序中处理用户交互的部分。负责管理与用户交互交互控制。

7.线程安全

当多个线程同时共享同同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读的操作不会发生线程安全问题。
使用多线程之间同步synchronized或使用锁(lock),将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,然后才能让其他线程进行执行。这样的话,就可以解决线程不安全问题。

8.一次url请求页面从点击后发生了什么

  1. 首先嘛,你得在浏览器里输入要网址
  2. 浏览器查找域名的IP地址:导航的第一步是通过访问的域名找出其IP地址(浏览器缓存->系统缓存->路由器缓存->ISP DNS 缓存->递归搜索)
  3. 发起TCP连接
  4. 发送HTTP请求

发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口 请求报文由请求行,请求报头,请求正文组成。

  1. 服务器发回一个HTML响应
  2. 浏览器开始显示HTML
  3. 浏览器发送获取嵌入在HTML中的对象

9.session和cookie的区别

1、存放位置不同:
Cookie保存在客户端,Session保存在服务端。
2 、存取方式的不同:
Cookie中保存的是字符串,Session保存的是对象
3、安全性(隐私策略)的不同
Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。
而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险,安全性更高。
4、有效期上的不同:
只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。
由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。
5、对服务器造成的压力不同 :
Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。
Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。
6、跨域支持上的不同 :
Cookie支持跨域名访问,而Session则不会支持跨域名访问。
Session仅在他所在的域名内有效。

10.问了下转发和重定向了解吗,那个效率高一点

原理
转发:是在服务器内部控制权的转移,是由服务器区请求,客户端并不知道是怎样转移的,因此客户端浏览器的地址不会显示出转向的地址。
重定向:是服务器告诉了客户端要转向哪个地址,客户端再自己去请求转向的地址,因此会显示转向后的地址,也可以理解浏览器至少进行了两次的访问请求。
地址栏
转发:不变,不会显示出转向的地址
重定向:会显示转向之后的地址
请求
重定向:至少提交了两次请求
数据
转发:对request对象的信息不会丢失,因此可以在多个页面交互过程中实现请求数据的共享
重定向:request信息将丢失

11.垃圾回收机制,怎么样的对象算是垃圾(2)

引用计数
标记清除
分代回收
导致引用计数 +1 的情况
对象被创建,例如 a=23
对象被引用,例如 b=a
对象被作为参数,传入到一个函数中,例如func(a)
对象作为一个元素,存储在容器中,例如list1=[a,a]
导致引用计数-1 的情况
对象的别名被显式销毁,例如del a
对象的别名被赋予新的对象,例如a=24
一个对象离开它的作用域,例如 f 函数执行完毕时,func函数中的局部变量(全局变量不会)
对象所在的容器被销毁,或从容器中删除对象

12.Linux的通信方式——进程的通讯方式

进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等

13.多线程,怎么加锁,知不知道死锁,死锁的概念和产生条件,如何避免死锁等

互斥锁
重用锁
同步锁
信号量

1). 死锁的概念
  在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。
2). 死锁产生的四个必要条件
互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;
非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

避免死锁的几个常见方法:
避免一个线程同时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
尝试使用定时锁,使用 lock.tryLock(timeout) 来代替使用内部锁机制。
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

15.内存泄露, 内存拷贝
https://blog.csdn.net/qq_41552331/article/details/106614676

16.三次握手,TCP、udp、udp应用,osi七层模型

三次握手:
第一次握手:
客户端发送syn包(Seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(Seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

四次挥手
第一次挥手:
客户端发送一个FIN,用来关闭客户端到服务器的数据传送,也就是客户端告诉服务器:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但是,此时客户端还可 以接受数据。 FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
第二次挥手:
服务器收到FIN包后,发送一个ACK给对方并且带上自己的序列号seq,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
第三次挥手:
服务器发送一个FIN,用来关闭服务器到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手:
主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
至此,完成四次挥手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

17.进程线程区别说一下 ,线程在操作系统中有堆区栈区代码段全局变量等等,哪些是共享的哪些独有, 进程间通信(只说了个管道流,让后讲了一下线程间通信)

进程:在操作系统中能够独立运行,并且作为资源分配的基本单位。它表示运行中的程序。系统运行一个程序就是一个进程从创建、运行到消亡的过程。
线程:是一个比进程更小的执行单位,能够完成进程中的一个功能,也被称为轻量级进程。一个进程在其执行的过程中可以产生多个线程。

【注】线程与进程不同的是:同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多。
堆:是进程中最大的一块内存,主要用于存放新创建的对象 (所有对象都在这里分配内存)。
方法区:主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

计算机基础
https://blog.csdn.net/yuyibo95/article/details/88595435

18.get post区别 post几次交互
https://www.zhihu.com/question/28586791

GET
“读取“一个资源。比如Get到一个html文件。反复读取不应该对访问的数据有副作用。比如”GET一下,用户就下单了,返回订单已受理“,这是不可接受的。没有副作用被称为“幂等“(Idempotent)。因为GET因为是读取,就可以对GET请求的数据做缓存。这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),或者做到server端(用Etag,至少可以减少带宽消耗)
POST
在页面里 标签会定义一个表单。点击其中的submit元素会发出一个POST请求让服务器做一件事。这件事往往是有副作用的,不幂等的。
不幂等也就意味着不能随意多次执行。因此也就不能缓存。

关于安全性
关于编码
浏览器的POST需要发两个请求吗?_客户端决定
关于URL的长度

留意,1个汉字字符经过UTF8编码 + percent encoding后会变成9个字节。

20.深拷贝浅拷贝,引用

copy浅拷贝,没有拷贝子对象,所以二者子对象变化一致
deepcopy深拷贝,包含对象里面的子对象的拷贝,即二者之后再无关系
在Python程序中,每个对象都会在内存中申请开辟一块空间来保存该对象,该对象在内存中所在位置的地址被称为引用

22.手写生产者消费者模型

数据库

1.sql语句——内联查询,如何在一条sql语句执行前输出一个随机数

2.如何提高Mysql的查询效率???
https://www.cnblogs.com/itsharehome/p/6160780.html

3.数据库写一个查询数学成绩前三的学生信息(数据库排序(升序降序),having命令等)

select i.name, g.subject, g.grade
from student_grade g
left join student_info i on g.user_id = i.id
# group by i.name, g.subject, g.grade
having g.subject = "math"
order by g.grade desc limit 3;

4.数据库的命令,相关连接有哪些 左连接,右连接,内连接的区别

5.手写自己的表,查询最近一个小时发布的文章作者

select * from student_grade where create_time > now() - interval 10 minute

6.sql 查询超过三次的记录

select g.subject
from student_grade g
left join student_info i on g.user_id = i.id
group by g.subject
having count(g.subject) > 3
order by g.create_time desc;

7.查询平均分以上的同学

select t.user_id, t.subject, t.grade, t1.avgScore
from student_grade t
left join (select subject, avg(grade) as avgScore from student_grade group by subject) t1
on t.subject = t1.subject
where t.subject="math" and t.grade > t1.avgScore;

8.mysql 有哪些索引,用过哪些

1.主键索引的添加
2.普通索引
3.全文索引
4.唯一索引
5.组合索引

9.让统计某个年龄段的学生信息。

select * from student_info i
where i.age > 10 and i.age < 20

使用redis的好处

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

https://blog.csdn.net/m0_37450089/article/details/78740692

具体的项目中Redis的用法,考虑没考虑缓存过期,除了设置过期时间,其他改动怎么更新缓存等

Redis的七种数据结构

  1. redis 内部数据结构 dict:https://www.cnblogs.com/christmad/p/11365740.html
  2. redis 内部数据结构 sds:https://www.cnblogs.com/christmad/p/11365746.html
  3. redis 内部数据结构 robj:https://www.cnblogs.com/christmad/p/11365750.html
  4. redis 内部数据结构 ziplist:https://www.cnblogs.com/christmad/p/11365753.html
  5. redis 内部数据结构 quicklist:https://www.cnblogs.com/christmad/p/11365756.html
  6. redis 内部数据结构 skiplist:https://www.cnblogs.com/christmad/p/11365774.html
    .7. redis 内部数据结构 intset:https://www.cnblogs.com/christmad/p/11365853.html

Linux

1.linux命令:查询指定文件的行数

命令语法:wc [选项] 文件
该命令选项参数如下:
-c 统计字节数
-l 统计行数
-w 统计字数
-m 统计字符数
-L 最长的那一行是多少个字符数

2.find命令,find 找.log文件
https://www.runoob.com/linux/linux-comm-find.html

find . -name "*.log"

3.查看文件怎么看(我说小文件直接vim,大文件cat,less,more,配合一些head和tail可以很方便)

#从第3000行开始,显示1000行。即显示3000~3999行
cat filename | tail -n +3000 | head -n 1000

#显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000

cat主要有三大功能:
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $ cat file1 file2 > file
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting

4.怎么看倒数第二行

tail -n 2 filename | head -n 1

5.字符串出现次数,行数

vim filename
:%s /string//ng

# 统计行数
grep -o "string" filename | wc -l

5.linux 查看端口号,查看服务器的内存命令,查看文件 awk sed grep 后面问统计多少行

ps -ef|grep java

ps auxw |sort -rn -k3


lsof -i | grep pid
lsof  -i:port

netstat -nap | grep pid
netstat -nap | grep port

6.讲一下sleep()和wait()方法的区别

相同点:
两者都可以暂停线程的执行,都会让线程进入等待状态。
不同点:
sleep()方法没有释放锁,而 wait()方法释放了锁。
sleep()方法属于Thread类的静态方法,作用于当前线程;而wait()方法是Object类的实例方法,作用于对象本身。
执行sleep()方法后,可以通过超时或者调用interrupt()方法唤醒休眠中的线程;执行wait()方法后,通过调用notify()或notifyAll()方法唤醒等待线程。

7.sed、 xargs 命令

# 时间段查询
sed -n '/2019-10-24 22:16:22/,/2019-10-24 22:16:59/p' all.log

# 文件中 1-10行查出 8182前后3行
find . -name "uwsg*" |xargs sed -n "1,10p" |grep -C 3 8182

# 找到文件中的 # 并替换为 ##
find . -name "uwsg*" |xargs sed -i "s/#/##/g"

8.删除某行 或某几行

nl /etc/passwd | sed '2d' 
nl /etc/passwd | sed '2,5d'

# 删除第 3 到最后一行
nl /etc/passwd | sed '3,$d' 

算法

1.如何找到一个链表的中间节点?

双指针,快慢指针

2.如何判断一个三角形的类型?(利用特殊数据结构?)

3.字符串中每个字符出现的次数

字典统计,散列表统计

4.合并两个有序数组

指针遍历

5.快排(3)

6.如何判断链表有环

快慢指针

7.数组全排列

回溯,广度优先,深度优先遍历

8.蚂蚁爬杆问题

最长距离

9.跳台阶(剑指offer)n个台阶,一次走一步,走两步,走三步,有多少种可能

动态规划,斐波拉契

10.怎么判断链表有没有公共节点

双指针

11.怎么判断一个字符串是不是ip地址

12.判断是不是回文字符串 如(“level”)

从中间扩散 or 动态规划

13.数组中出现次数最多的数字

摩尔投票法

14.两个有序数组求中位数,长度相同 (困难)

15.求100-999水仙花数

16.两个出现一次的数,其余出现两次

分组异或

17.多叉树求出它树的长度

18.线程A与线程B,A打印字符a,B打印字符b。在主线程中循环输出ab

19.数组中,连续和最大的区间

动态规划

20.10进制转8进制

21.求两个字符串的最大交集,输出这个字符串和其长度。

22.大量文件中大量字符串,输入一个字符串找出字符串存在的文件有哪些?

23.括号生产(回溯)

测试

1.如果要对对购物车模块进行测试

2.用户登录怎么测试,我怎么实现登录的,怎么保障订票不重复订一张票(3)

3.如何对百度的搜索框进行测试 (2)
思路:功能测试、性能测试、UI测试、安全性测试、兼容性测试、易用性测试、其他测试

功能测试
1.输入内容
内容为空
内容含有特殊字符,如空格,前后空格是否会忽略,中间空格是否保留
内容含有非法字符
输入不同形式的内容,是否有默认高频相关字符在下拉菜单显示
反复输入相同数据,如10次以上,看结果是否符合预期
反复搜索同一个内容以后,高频提示内容是否会有改变
登录前后高频提示内容是否会有改变

2.边界值测试
内容在指定长度内
内容在指定长度外,是否能够正确截取
只能允许的字符串长度

3.是否支持快捷键
复制粘贴剪切撤回
4.是否支持回车进行搜索
5.结果页面是否有搜索内容,可否继续输入
性能测试
1.网络情况好的前提下跳转时长
2.网络情况不好前提下跳转时长
3.压测
4.页面打开速度是否满足设计要求
5.结果返回速度是否满足设计要求
UI测试
1.UI显示是否正确,是否与设计图相同
2.页面布局,样式检查
3.组件控件位置是否合适
4.是否支持快捷键
5.Tab键切换焦点顺序正确性
6.已查看过的结果链接,链接的颜色要灰化处理,和没有点击过的结果链接区分
7.当结果数量庞大时,页面的分页布局合理
8.鼠标悬停点击响应是否符合预期
安全性测试
1.SQL注入攻击防范
2.脚本注入测试
3.被删除、加密、授权的数据,不允许被查出来的,是否有安全控4.制设计
5.敏感内容的检索是禁止的
兼容性测试
1.不同操作系统平台
2.不同浏览器
3.不同移动端
4.不同分辨率
其他测试
1.对用户是否友好
2.第一次访问的页面是否有帮助文档

4.知道哪些测试(2)

5.测试微信聊天怎么测

6.测试当前视屏会议的界面
UI、功能、性能、兼容、安全、

7.bug的生命周期
发现BUG–>提交BUG–>指派BUG–>研发确认BUG–>研发去修复BUG–>回归验证BUG–>是否通过验证–>关闭BUG

8.一个网页突然打开没内容了怎么办

9.测试的分类说一下
https://zhidao.baidu.com/question/475737709.html

10.测试一个自动售货机

智力

1.四棵树,怎么两两相等

2.三等分一张纸

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值