背景:做一个问题总结,希望可以给别人一些参考。
偏前端类的问题:
一.安卓的四大组件
这个网上有很多资料,我也会把链接放大下面,大家可以做些参考,这里面我就说下我理解的。
1.1 activity
作用:activity我理解是一个GUI页面,里面可以放置组件,比如说button,select等。
生命周期:
oncreate->onstart->onresume->running->onpause->onstop->ondestory
activity是存放到栈中,采用先进后出的方式。
1.2 说下intent()
intent两种跳转形式:
功能:intent可以跳转到activity,server和广播。
第一种:显示跳转
距离就是从一个activity跳转到另一个activity
构造函数的形式:
Intent intent=new Intent(second.activity);
方法的形式:
通过setClass/setClassname的形式:
Intent intent=new Intent()
intent.setClass();
第二种:隐示跳转
intent(action,data,类别)交给系统,系统会做出匹配完成跳转。
这个其实就是intent七个属性:action,data,类别,extra,type,flag,组件。
这里面说下flag:
flag正好对应activty的4中启动模式:
standard:这个是默认启动模式,即栈内activity每次oncreat都会创建实例,无论栈内是否已有实例。
single top模式:activity已经位于栈顶,oncreate不会创建实例。------>push场景会用到。
single task模式:非栈顶的activity被oncreate,会放到栈顶,之前栈顶实例会pop出去。------>首页场景会用到。
single instance模式:一个activity一个栈。----->拨号盘场景。
1.3 intent最大能传递多大数据
intent跳转的另一个activity最大传输数据1M,大于1M会出现静默崩溃。
解决这类问题方法:
进程内:缓存磁盘或者文件缓存
进程外:通过contentprovider进行进程内数据共享和传递。
2. server
server我理解用来做一些后台数据交互的组件。
2.1生命周期:
第一种:oncreate->onstartcommend->ondestory--->这种一般直接启动服务做处理
第二种:oncreate->onbind->onunbind->ondestroy---->这个把server和另一个组件做绑定,比如activity。
2.2 服务类型 前台服务和普通服务:
前台服务:比如状态标志展示的服务
普通服务:后台运行服务。
2.3 ANR现象:
服务启动后如果不手动开启进程就会默认运行在主进程中,在主进程中做耗时操作就会出现ANR现象,表现形式就是卡顿无反应。
2.4 intentserver类和server类区别在哪里:
两点:
一方面: intentserver有一个onHandleIntent()函数可以直接创建子进程。server也可以调用函数创建子进程。
最大优势就是在多次调用onHandleIntent()函数的时候可以按照顺序执行。(类似python unittest中case1->case2那种形式)
3. contentProvider
这个组件主要用来做数据存储,有点类似python sqlalcheny这个库,主要通过orm形式做数据库增删改查。
3.1 6个核心方法
oncreate(),query(),insert(),update(),delete(),gettype();
3.2 如何访问内部数据
方式类似uri的形式:存放地址和报名(有点类似mysql中库名和表名)。
4.广播:
角色:发送者和接受者(跟后端MQ类似)。
用户:不同组件通信(同一个app或者不同app之间),多线程通信和安卓系统通信。
核心方法:onrecevice()方法
注册方法:
静态注册:在xml中注册。特点:不跟随任何组件生命周期(有点类似spring初始化即可调通)。缺点:耗电和耗内存。
动态注册:在代码中调用注册方法进行注册。特点:灵活,生命周期跟随被绑定组件。缺点:在app关闭前一定要注销,否则会引发内存泄漏。
参考博客:
https://blog.csdn.net/xchaha/article/details/80398620
https://blog.csdn.net/xiankog/article/details/81702119
二.H5相关
2.1 能说下jsbridge的原理嘛
jsbridge是H5和native之前作为数据交互的通道,主要包含两块:通信调用和句柄解析。
通信调用:
js调用native一共有两种形式:注入api和拦截url scheme
注入api:
native通过某种形式把类或者方法注入js.content(window)中(这个我理解就是会有中间方法把方法封装成js可以调用接口形式)
native注入成功后就js可以直接把data传入。
这种方式最大特点就是native来维护各种版本的桥名,对应测试更好H5测试兼容性一个节点。
缺点:因为注入时机不确定,有可能会出现注入api失败的情况,这样就需要js在调用前确认是否注入成功。
拦截url scheme:
js通过莫种形式比如说iframe.src(src是iframe一个属性),调用内部框架即native对应类的方法。形式类似uri 区别点就是
协议和host可以自定义。这个方式有一种缺陷就是uri是有长度限制(好像是256字节)。为了避免这个缺陷ios会通过ajrax形式把data放入header或者body中。
缺点:js需要维护各种版本桥名,还有就是uri是有长度限制的。
native调用js:
native可以直接调用js的代码块。
句柄解析:
信息通信消息都是单向,所以为了回调会有一个callbackid的存在。这个callbakcid在全局必须是唯一的,client发送消息给server,
server处理完成后吧callbakcid作为key和处理结果发送给client。
比如说js->native流程就是:js发送bridgename,data,callbacikd给natvie,native通过bridgename找到类和方法,把data传入进行运算,再以callbackid作为key和运算结果作为value返回给js。
https://blog.csdn.net/yuzhengfei7/article/details/93468914
2.2 简单说下webview
webview一共两个作用:一.用来展示html页面;二.跟js进行交互。
webview类:
加载页面;
前进/后退;
清除缓存;
获取html的高度和滚动距离
下载文件;
websetting类(配置类):
设置js交互->websetting.setjavascriptenable(true);
缩放操作;
设置字体大小;
设置缓存;
设置编码格式;
webviewclinet类(处理各种通知和请求事件):
拦截url进行重定向;
处理浏览器的按键事件;
处理https事件;
webchromeclient:辅助webview处理js对话框,网站标题等
加载进度展示;
获取网页标题回调;
打开/关闭窗口回调;
网页提示框;
https://www.jianshu.com/p/3e0136c9e748
2.3 能简单说下小程序的mini框架嘛?
框架结构:
index ----------->对应小程序的首页
log
log.js ------------>log的js逻辑
log.wxml ------------>log的html页面模板
log.wxss ------------>log的页面样式
log.json ------------>log的配置页面
utils
utils.js
app.js ------------>小程序加载逻辑
app.json ------------->应用全局配置,如背景颜色
app.wxss ------------->全局样式
wxml:构建页面内容-->html
wxss:页面样式----->颜色配置
wxs:wxml的增加版本,脚本语言,快速构建页面。
js:交互逻辑,数据通信。
wxml的4个特性:
特性1 绑定数据:
id;
class;---->对应css的类名
style;------>对应样式模板
hidde;------>是否隐藏
特性2 列表展示:
特性3 条件展示:
特性4 模板展示:
2.4 小程序的启动机制:
分成两种启动:冷启动和热启动。
冷启动:首次打开或者微信死掉,走小程序的全部生命周期(这个是我理解的)
热启动:一段时间内再次进入小程序,不请求接口更新直接进入首页
小程序生命周期:onlunch ->onshow->onhide->onerror
页面生命周期:onload->onshow->onready->onhide->onerror
ps:我觉得了解生命周期可以帮助我们在遇到问题的时候快速定位哪里修改,我记得之前遇到因为热启动,前端没有调用启动接口更新数据,我们可以在提bug的时候可以提出自己想法,虽然fe可能不接受,但是也是自我学习过程嘛。
页面路由 小程序页面路由全部由框架管理:
初始化,加载----->进栈
返回 ------>出栈
切换tab ------>之前tab页面全部出栈,新tab页面出栈
https://www.jianshu.com/p/64170244e64c
2.5 简单介绍下html
html是标签语言主要用来构建页面内容,主要模块如下:
布局标签:
div:分区。
header:介绍信息。
section:区段。
article:内容,评论。
字体标签:
h1-h6:标题大小。
u:下划线。
strong:加粗。
表单标签:
form:
button:按钮。
select:筛选组件。
input:输入框
图片:
image:图片
超链接:
java基础相关
三.java基础
3.1 final关键字可以修饰什么?
final可以修饰class,方法和变量。
final修饰class后这个类不可以被继承。
final修饰方法是防止其他类继承后修改方法和提高效率。
final修饰变量后,变量的值不可被修改。
3.2 final和static的区别是什么?
static用来修饰方法和变量,类初始化的时候会优先加载static修饰方法和变量。
static修饰方法的时候,同一个类中其他方法可以通过 类名.方法 的访问。
static修饰方法或者变量,在类初始化的时候会被优先执行。
final 就只是变量值不可变。
https://blog.csdn.net/kuangay/article/details/81485324
https://www.jb51.net/article/157603.htm
3.3 java 继承和导入的区别是什么:
导入可以导入多个,并且导入直接加载构造器。
继承可以重新父类的方法和构造函数,并且只能有一个父类。
3.4 arraylist和linkedlist的区别是什么:
arraylist:做get()和set()效率高。
linkedlist:做insert()和remove()效率高,因为只需要改变指针即可。
3.5 简单说下java的反射机制
java的反射机制就是java在运行中动态获取类的变量和属性的机制就是反射机制。反射可以获取一个对象所属类,成员变量和方法。
spring的ioc就是基于java的反射原理,newInstance创建,来获取bean对应对象的所属类,成员变量和方法来调用。
反射获取class对象的三种方法:
Class.forName(String className);
className.class;
实例对象.getClass;
偏后端问题:
四.服务端
4.1 cookie和session有什么区别
区别1:存储位置不同;cookie存放在客户端。session存放在服务端。
区别2:大小不同;cookie有大小限制。session没有大小限制,但是session还是占服务端资源需要有清除逻辑。
区别3:编码格式不同;cookie一般是unicode编码格式。session没有要求。
区别4:兼容性:cookie跟client所在容器有关,需要适配。session没有兼容的问题。
区别5:并发:服务端有并发压力时,用cookie方式较多。
区别6:隐私性:cookie不安全,因为client可见。session相对安全很多。
区别7:过期时间:cookie一般是一个月。session一般是链接关闭即失效。
4.2 http请求有哪些:
一共7种
post:提交表单。
get:获取信息。
put:向服务提供上传资源。
delete:向服务请求删除某个资源。
head:类似get,但是response没有体只有头部信息。
trace:返回服务信息,调试使用。
option:服务端允许客户端查看性能。
4.3 get和post区别是什么:
区别1:请求方式上,get的参数拼接到url上。post一般放置在body中。
区别2:长度限制。get请求有长度限制,最长2048字节。post放置到体中没有长度限制。
区别3:安全性。get请求暴露在url上,post不会。
区别4:浏览器历史。get请求会被收藏,post请求不会。
区别5:重新请求无害。get重复请求无害。post重复请求会造成多条数据的插入。
区别6:编码格式。get请求数据只能是ascii字符。post请求不限制可以二进制。
4.4 如何理解http是无状态的:
无状态表示,服务端不会记忆之前请求的参数的值,即请求接口A,在请求接口B如果需要A中参数也需要在B中再次上传。
4.5 tcp中为什么三次握手和四次挥手
tcp请求理论很难记,我之前看到晚上有一个很好用解释,我记了下来。
三次握手:
client:能听到吗? ---------->客户端发送序SYN报文和初始化序列号ISN。客户端处于SYN_SEND状态。
server:可以听到,你能听到吗? -------->服务端接受客户端SYN,会初始化服务端ISN,并发送客户端的ISN+1作为ACK的值。服务端处于SYN_REVD状态。
client:可以听到,开始吧。 ----------->客户端接受服务端报文会发送ACK报文,把服务端ISN+1作为ACK的值。双方进入通信状态。
四次挥手:
client:我说完了。 ------>客户端发送FIN请求报文和自身序列号ISN。 客户端处于FIN_WAIT1状态。
server:知道了,我可能还没说完。 ------->服务端接受FIN后发送ACK报文并发客户端ISN+1作为值。服务端CLOSE_WAIT状态。此时TCP进入半关闭状态,客户端收到服务端会进入FIN_WAIT2状态。
server:我也说完了。 ---->服务端再次发送FIN和SYN号,服务端进入LAST_ACK的状态。
client:那关闭吧。 ---->客户端接收FIN并把服务端SYN+1作为ACK的值发送给服务端,客户端进入TIME_WAIT的状态,2MSL后关闭连接。
四次挥手主要是因为server在接受到关闭请求时可能还有没有处理完的数据,需要确认一下,所以比握手多一次。
4.6 握手为什么是3次不能是2次嘛
第一次握手:客户端可以确认自身发送是正常的,服务端自身可以确认接收能力正常的。
第二次握手:客户端可以确认自身发送和接收都是正常;服务端自身可以确认接受和发送正常,但是不知道自己发送请求客户端正常。
第三次握手:客户端和服务端都知道彼此正常可以通信
4.7 什么是半链接队列
服务端进入SYN_REVD状态就会把连接放到队列中成为半链接队列。
SYN-ACK 重传次数:当服务端一直没有收到客户端上报就会进行重试,直到到达重试次数。重试时间1s,2s,4s.....
4.8
https://yuanrengu.com/2020/77eef79f.html
五.mysql
5.1 delete和truncate的区别是什么:
区别1:执行语句上,delete可以添加where语句,晚上单条删除;truncate不可以,只能删除整个表。
区别2:删除索引,delete可以删除索引;truncate不能删除索引。
却别3:删除速度上,delete因为要生成详细的日志,truncate不需要所以truncate速度会更快。
区别4:事务回滚,delect运行时候放到roolback中所以可以回滚,truncate不可以回滚。
5.2 什么是内连接,外连接
内连接:A表 inner join B表 on A表.字段=B表.字段 where ******;这个取出来的时候A表和B端的交集数据。
左外 :A表 left join B表 on A表.字段=B表.字段 where ******;A表全部数据+AB交集数据,重复字段已A表为主。
右外:A表 left join B表 on A表.字段=B表.字段 where ******;B表全部数据+AB交集数据,重复字段已B表为主。
六.linux相关:
6.1 配置文件怎么批量替换
vim/vi 有一个批量喜欢的命令:"%s/p1/p2/g" ->%s表示全局替换,p1匹配的字符串,p2是替换字符串。
七.算法相关
7.1 将 "aaabbbbccccc"变成"a_3_b_4_c_5"
7.2 "Hello word 1994_1_2" 字符串翻转,非字符串正常输出
7.3 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
输入: [-2,1,-3,4,-1,2,1,-5,4]。
输出: 6。
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
7.4 用递归的方式翻转字符串
7.5 判断一个字符串是不是回文算法,举例:abccba是回文,abca不是回文。
7.6 一位数组中两个数的等于给定target,返回数组的下标。(两种方式)
7.7 顺时针输出二维数组的内容。
7.8 给定一个二叉树,找到二叉树的最大深度。
八.软性问题
8.1 你做为一个系统的负责为你是如何保证系统的质量的呢