Android高级面试题汇总——高级开发技术面试题(1)
(一)图片
1、图片库对比
(1)Universal ImageLoader是很早开源的图片缓存,在早期被很多应用使用
优点:
- 支持下载进度监听
- 可以在 View 滚动中暂停图片加载
- 默认实现多种内存缓存算法
- 支持本地缓存文件名规则定义
缺点:不支持GIF图片加载,缓存机制没有和Http的缓存很好的结合,完全是自己的一套缓存机制
(2)Picasso是Square开源的项目,且他的主导者是JakeWharton,所以广为人知
优点:
- 自带统计监控功能
- 支持优先级处理
- 支持延迟到图片尺寸计算完成加载
- 支持飞行模式、并发线程数根据网络类型而变
- “无”本地缓存
缺点:于不支持GIF,并且它可能是想让服务器去处理图片的缩放,它缓存的图片是未缩放的,并且默认使用ARGB_8888格式缓存图片,缓存体积大
(3)Glide是Google员工的开源项目
优点:
- 图片缓存->媒体缓存
- 支持优先级处理
- 与Activity/Fragment生命周期一致,支持trimMemory
- 支持okhttp、Volley
- 内存友好
(4)Fresco是Facebook的开源的图片缓存
优点:
图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中,图片的中间缓冲数据也存放在本地堆内存,所以,应用程序有更多的内存使用,不会因为图片加载而导致oom,同时也减少垃圾回收器频繁调用回收Bitmap导致的界面卡顿,性能更高
渐进式加载JPEG图片,支持图片从模糊到清晰加载
图片可以以任意的中心点显示在ImageView,而不仅仅是图片的中心
JPEG图片改变大小也是在native进行的,不是在虚拟机的堆内存,同样减少OOM
很好的支持GIF图片的显示
缺点:
- 框架较大, 影响Apk体积
- 使用较繁琐
2、图片库的源码分析
Picasso源码分析
(1)构造Picasso实例对象
Picasso实例对象不是通过默认的构造器来构建的,而是通过内部类Bulider方式来构建的,这样可以方便用户自定义构建Picasso对象,默认方法是通过with来创建
Builder可以组装构建Picasso的各种参数,例如定义内存缓存的大小
(2)利用load方法加载图片
Picasso支持多种加载图片的方式,例如根据网络Uri来加载图片,或者是加载ResourceId指定的图片等,所以load方法被重载了,有多种实现方式
load方法最终都是返回一个RequestCreator,RequestCreator保存请求的参数
(3)into方法将ImageView传入
ImageView是通过into方法传入的,该方法在RequestCreator中实现
RequestCretor是将Request封装成Action,然后提交请求到任务队列中,让任务异步执行。在构造请求之前,先从内存缓存中查看是否意见有图片了,如果有的话,则直接返回缓存中的图片,并回调callback接口
(4)提交任务
RequestCreator封装好任务请求后,将请求提交到任务队列中,请求入队列的过程在Picasso类中实现
取消图片加载:
(1)Dispatcher发送取消消息
(2)延迟请求的取消
当尝试调整图片的大小适应ImageView的边界,这将延迟执行该请求直至ImageView布局好了。具体在RequestCreator的fit方法中实现
Glide源码分析
(1)with()方法
with()方法有很多的重载,传入的参数分别是Context、Activity、FragmentActivity、Fragment
with()
方法返回一个RequestManager对象,该对象是请求管理的对象,是通过RequestManagerRetriever的get()
方法获取的,RequestManagerRetriever就是用来生产RequestManager对象的
get()如果在主线程中执行,则使用当前页面的Context,否则使用ApplicationContext
Glide没法直接监听Activity的生命周期,会在RequestManagerRetriever的fragmentGet()中创建一个没有UI的Fragment,通过它来间接的监听对应的生命周期
(2)load()方法
load()
方法根据数据的来源不同有很多的重载
load()中通过asDrawable()
方法创建一个RequestBuilder实例,然后调用该实例的load()
方法,该方法最终会调用loadGeneric()
方法给RequestBuilder的成员变量赋值
(3)into()方法
在配置好imageUrl和一些参数设置之后调用into()
方法显示图片
into()
方法必须要主线程中调用,否则抛出异常。在该方法中将传入的ImageView对象封装成了Target对象,创建Target实例以后就会调用参数为该实例的into()
方法执行请求
3、图片框架缓存实现
Universal ImageLoader,Picasso和Glide采用三级缓存策略,即内存缓存,本地缓存和网络缓存
App优先访问内存中的图片缓存。若内存中没有,则查找本地缓存的图片,并将图片存储到内存中。若本地缓存中没有,则通过网络获取图片资源,将图片存储到本地缓存中
Fresco采用四级缓存策略,即两级内存缓存,本地缓存和网络缓存
App优先访问已解码内存缓存(Bitmap缓存)。若已解码内存缓存中没有,则查找未解码图片的内存缓存,将图片进行解码后,存储到已解码内存缓存中。若未解码图片的内存缓存中没有,则查找本地未解码的图片缓存,将解码后的图片存储到已解码内存缓存,将未解码的图片存储到未解码图片的内存缓存。若本地缓存中没有,则通过网络获取图片资源,将图片存储在本地缓存
已解码内存缓存和未解码图片的内存缓存在APP进入后台后会将图片内存清空
已解码内存缓存在5.0以下,Fresco将图片放到一个特别的内存区域ashmem中,GC将会显著地引发界面卡顿。在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM
在5.0以上,直接位于java的heap上
内存缓存:MemeryCache(LruCache最近最少使用算法)、WeakReference(弱引用缓存,ActiveResources弱引用,每次GC会被回收)
本地缓存:DiskCache(磁盘缓存)
4、LRUCache原理
LruCache内部采用LinkedHashMap数组+双向链表存储结构,保留HashMap数组元素的链表形式,同时,所有节点加上pre和next指针,改装成一个双向链表,使节点集合全部链接。
LruCache的双向链表按照访问顺序(get)排序,经常访问的和新插入的节点放置在链表尾部,不经常访问的节点慢慢会移到头部,当到达最大值时,从头部开始删除
5、图片加载原理
(1)使用三级缓存,最终的形式都是将文件解析成Bitmap加载到图片上
(2)图片Drawable其实只是一个加载图片的工具,并不是一张图片。它可以加载xml文件,解析出所需的图片,也可以从drawable文件夹中加载图片进行处理并交由画布绘制
6、Glide缓存原理
首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存缓存中,缓存到强引用中 也就是LruCache中。如果强引用中空间不足,就会将较早存储的图片对象驱逐到软引用(softReference)中存储,然后将图片缓存到文件(内部存储外部存储)中;读取图片的时候,先读取内存缓存,判断强引用中是否存在图片,如果强引用中存在,则直接读取,如果强引用中不存在,则判断软引用中是否存在,如果软引用中存在,则将软引用中的图片添加到强引用中并且删除软引用中的数据,如果软引用中不存在,则读取文件存储,如果文件存储不存在,则网络加载
7、Glide内存缓存如何控制大小
(1)设置LruCache缓存的大小,一般为当前进程可用容量的1/8
(2)重写sizeOf方法,计算出要缓存的每张图片的大小
注意:缓存的总容量和每个缓存对象的大小所用单位要一致
(二)网络和安全机制
1、网络框架对比和源码分析
Volley
特点:
(1)基于HttpUrlConnection,封装了UIL图片加载框架,支持图片加载
(2)网络请求的排序、优先级处理缓存
(3)多级别取消请求
(4)Activity和生命周期的联动(Activity结束生命周期同时取消所有网络请求)
性能:可拓展性好,可支持HttpClient、HTTPURLConnection、OkHttp
缺点:不能下载大数据文件
适用场景:适合轻量级网络交互。网络请求频繁,传输数据量小。不能进行大数据的网络操作,比如音频文件的下载传输
注:Volley的Request和Response都是把数据放在byte数组中,不支持输入输出流,把数据放在数组中,如果文件大,数组就会很大,需要消耗很大的内存
OkHttp
特点:
(1)高性能http请求库,使用连接池来复用连接以提供效率
(2)支持SPDY,共享同一个Socket来处理同一个服务器所有的请求
(3)支持http2.0、Websocket
(4)支持同步、异步执行
(5)封装线程池、数据转换、参数使用、错误处理等
(6)无缝支持Gzip来减少数据流量
(7)缓存响应数据来减少重复的网络请求
(8)能从很多常用的连接问题中自动恢复
(9)解决了代理服务器问题和SSL握手失败问题
性能:拥有Nio和Okio,所以性能更高,请求、处理速度更快(io:阻塞式 nio:非阻塞式)
适用场景:重量级网络交互场景。网络请求频繁,传输数据量大
Retrofit
特点:
(1)Resrful api设计风格
(2)支持同步、异步
(3)通过注解配置请求,包括请求方法、参数、请求头、返回值等
(4)可以搭配多种Converter将获得数据解析&序列化
(5)持Gson(默认)、Jsckson、Protobuf等
(6)提供RxJava支持
性能:代码简化,结构彻底,职责细分。易于和RxJava使用,使用方法较多,原理复杂
适用场景:所有场景
2、自己去设计网络请求框架,怎么做
网络请求框架的核心就是封装了网络请求+异步+数据处理,其中网络请求一般使用Android的网络请求原生方法(HttpClient或HttpURLConnection)
一般而言,需要考虑的方面有:
(1)构建请求Request:包含url,请求方法,请求参数,请求头,编码,请求体,编码格式,超时时间,代理端口,代理主机等
(2)由Dispatcher分发器并行分发我们的Request请求,这里的分发器实际是一个线程池
(3)准备开始连接服务器,连接http获取https服务器地址,https需要考虑自签名证书、双向SSL验证等安全问题
(4)Response得到服务器的回调,考虑输入流关闭的问题,大文件传输的问题,线程切换问题,缓存问题
3、OkHttp源码
(1)生成了一个OKHttpClient对象,注意OKHttpClient对象的生成有两种方式:一种是直接使用的方式,另一种是使用建造者(Builder)模式
第一种会使用OkHttp默认设置的属性,第二种可以利用建造者模式单独的设置每一个属性
(2)定义了请求对象request之后,需要生成一个Call对象,该对象代表了一个准备被执行的请求,Call是可以被取消的。Call对象代表了一个request/response 对(Stream).还有就是一个Call只能被执行一次
同步请求生成的是RealCall对象,而异步请求生成的是AsyncCall对象。AsyncCall是Runnable的子类(间接)
如果RealCall的execute(同步)方法和enqueue(异步)方法中的executed等于true,说明该Call已经被执行,再次调用执行就抛出异常,这说明了一个Call只能被执行一次
如果可以执行,则对当前请求添加监听器等操作,然后将请求Call对象放入调度器Dispatcher中。最后由拦截器链中的各个拦截器来对该请求进行处理,返回最终的Response
(3)Dispatcher(调度器)是保存同步和异步Call的地方,并负责执行异步AsyncCall
针对同步请求,Dispatcher使用了一个Deque保存了同步任务,针对异步请求,Dispatcher使用了两个Deque,一个保存准备执行的请求,一个保存正在执行的请求
注:Dispatcher默认支持最大的并发请求是64个,单个Host最多执行5个并发请求,如果超过,则Call会先被放入到readyAsyncCall中,当出现空闲的线程时,再将readyAsyncCall中的线程移入到runningAsynCalls中,执行请求
在经过拦截器的处理之后,得到了响应的Response,最终会执行finally语句块,而异步任务会调用两个finish
(4)拦截器之所以可以依次调用,并最终再从后先前返回Response,都依赖于RealInterceptorChain(拦截器链)的proceed方法
下一个(index+1)拦截器的调用依赖于当前拦截器的Intercept方法中,对RealInterceptorChain的proceed方法的调用,当执行到最后一个拦截器之后,就会沿着相反的方向依次返回Response,最终得到我们需要的“终极版”Response
4、网络请求缓存处理,OkHttp如何处理网络缓存的
OkHttp缓存流程分为读取缓存和存储缓存两个过程
读取缓存的流程从HttpEngine的sendRequest发送请求开始
先查找是否有可用的Cache,然后通过Cache找到对应的缓存,然后将请求和缓存交给缓存策略去判断使用请求还是使用缓存,得出结果后,自己再判断使用缓存还是使用请求,如果使用缓存,则用缓存构造响应直接返回,如果使用请求,那么开始网络请求流程
OkHttp的存储缓存流程是从HttpEngine的readResponse发送请求开始的
缓存的使用策略基本都是按照HTTP的缓存定义来实现的,所以对HTTP缓存相关字段的理解是很重要的
5、从网络加载一个10M的图片,说下注意事项
需要注意开启子线程加载,注意内存是否会溢出
6、TCP的三次握手和四次挥手
三次握手:
(1)客户端发送syn包(seq = x)到服务器,并进入SYN_SENT(同步发送)状态,等待服务器确认
(2)服务器收到syn包,必须确认客户的SYN(ack = x+1),同时自己也发送一个SYN包(seq = y),即SYN+ACK包,此时服务器进入SYN_RECV(同步接收)状态
(3)客户端收到服务器的SYN+ACK包,向服务器确认包ACK(ack = y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(建立连接)状态
四次挥手:
(1)主动关闭方发送一个FIN(seq = x)和ACK(ack = y),用来关闭主动方到被动方的数据传输,也就是主动关闭方告诉被动关闭方:我已经不会再给你发送数据了(当然,在FIN之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接收数据
(2)被动关闭方收到FIN+ACK包后,发送一个ACK(ack = x+1)给对方,确认序号为收到序号加1(与SYN相同,一个FIN占用一个序号)
(3)被动关闭方发送一个FIN(seq = y+1),用来关闭被动关闭方到主动关闭方的数据传输,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发送数据了
(4)主动关闭方收到FIN后,发送一个ACK(ack = y+2)给被动关闭方,确认序号为收到的序号+1,致此完成四次挥手
7、TCP与UDP的区别
(1)TCP是面向连接(如打电话要先拨号建立连接)。UDP是无连接的,即发送数据之前不需要建立连接
(2)TCP提供可靠服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付
(3)TCP面向字节流,实际上是TCP把数据看成了一连串无结构的字节流。UDP面向报文,UDP没有拥塞控制,网络出现拥塞不会使源主机的发送效率降低(对实时应用很有用,如IP电环,实时视频会议等)
(4)每一条TCP连接只能是点对点的。UDP支持一对一,一对多,多对一和多对多交互通信
(5)TCP首部开销20字节。UDP的首部开销小,只有8个字节
(6)TCP的逻辑通信信道是全双工的可靠信道。UDP则是不可控信道
8、TCP与UDP的应用
当对网络通信质量有要求时,使用TCP,如:浏览器使用的HTTP,FlashFXP使用ftp,QQ文件传输等
对当前网络通信质量要求不高,或要求网络通讯速度尽量的快,使用UDP,如:QQ语音,QQ视频,TFTP
9、HTTP协议
Http协议是超文本传输协议。请求分成三个部分,分别是请求行,消息报头,请求正文
10、HTTP1.0与2.0的区别
HTTP1.0:浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)
HTTP2.0:
(1)采用多路复用,多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行(HTTP2.0引入了二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器在收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情)
(2)压缩头部报文,降低头部传输产生的流量
(3)服务器推送,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源
11、HTTP报文结构
HTTP的请求报文由四个部分组成:请求行,请求头部,空行,请求数据
HTTP响应报文分为三个部分:响应行,响应头,响应体
12、HTTP与HTTPS的区别以及如何实现安全性
区别:
(1)HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
(2)HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
(3)Https在网络请求效率上会低于Http,因为采用了不同的请求协议以及更复杂的安全验证操作,
(4)Http和Https用的端口不一样,前者是80,后者是443
(5)HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
加密的方式有两种
(1)对称加密
对称加密速度快,但是加密和解密的钥匙是相同的
(2)非对称加密
算法更加复杂,速度慢,加密和解密钥匙不相同
在https中,加密过程大致如下:
首先服务器将公钥给浏览器,浏览器拿到公钥之后,生成一个“会话密钥”,这个会话密钥属于对称加密,然后用公钥加密这个“会话密钥”发送给服务器,最后,在数据传输的过程中,就用这个会话密钥来加密数据。打个比方:我有二把钥匙,我把其中一把钥匙放在信封里,然后把信封交给你。但是这个信封只有你能打开
13、如何验证证书的合法性
(1)验证证书是否在有效期内
(2)验证证书是否被吊销了
(3)验证证书真实性,是否是由上级CA签发的
14、Https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解
Https协议中加密使用了SSL协议,SSL的加密既用了对称加密也用了非对称加密,对称加密速度快,平时传输用对称加密,非对称加密传密码比较安全,所以对称加密的密码是用非对称加密来传的,这种加密的关键是用非对称加密的方式用密文传输对称加密用的密码
RSA非对称加密
(1)任取两个质数,比如p=3,q=11
(2)计算n=p*q,也就是n=33
(3)计算A=(p-1)*(q-1),也就是A=20(欧拉函数)
(4)在1到A之间随便选个数e,要求e和A互质,比如选e=3(随便选的,和p=3没有关系)
(5)计算d,要求e*d mod(A)=1,也就是3*d对20取模等于1,d=7
(6)于是得到了e和d,e和d关于A互为模反元素,那么,公钥就是(n,e)也就是(33,3),私钥就是(n,d)也就是(33,7)
(7)公钥(33,3)由服务器发给浏览器,私钥(33,7)由服务器自己留下。假如浏览器要发送的内容是18,用m表示,即m=18,那么m的e次方对n取模,即18的3次方对33取模,得到结果c=24,也就是浏览器发送的加密内容是24
(8)服务器收到24的加密内容后,用c的d次方对n取模,即24的7次方对33取模,得到m=18,也就是浏览器本来要发送的内容
15、Client如何确定自己发送的消息被Server收到
当Client收到Server返回的二次握手的信息,包含Client发送的SYN+服务器确认的SYN时,Client就能确定自己发送的消息被Server收到
16、谈谈你对WebSocket的理解
WebSocket是应用层Html5出的一种协议,相比较Hhttp而言优势是支持长连接,WebSocket只需要一次HTTP握手,整个通信过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道Client的信息,直到关闭请求。同时WebSocket协议解决了服务器与客户端全双工通信的问题
信息只能单向传送为单工。信息能双向传送,但不能同时双向传送称为半双工。信息能够同时双向传送称为双工
17、WebSocket与Socket的区别
区别:
(1)Socket处于抽象层,是Http底层协议。WebSocket是应用层html5出的协议
(2)WebSocket最大的特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种
18、谈谈你对安卓签名的理解
Android签名是为了保证应用发布者是本人,大致有几种:以前Eclipse用keyStore进行签名,现在Android Studio开发app采用JKS签名,Android系统签名采用的是pem/pk8
每个Android App都会有自己的签名,如果没有指定签名,编译时会默认用SDK目录下的debug签名文件。
常见的签名jks在Android studio中有两种方式给app签名,一种是build时generate signed apk,一种是在build文件中配置签名信息
19、请解释安卓为啥要加签名机制
(1)应用程序升级,需要验证app的唯一性,当包名和签名都一致才能升级
(2)应用程序模块化,只要多个应用的签名都一样,就可以模块化部署到一个进程,
(3)代码或者数据共享,同一个签名有相同的权限,可以共享数据和代码
20、视频加密传输
(1)分片加密
基于苹果公司的HLS协议,服务器需要切片出TS文件并进行AES加密,生成m3u8索引文件,然后客户端下载到本地给播放器播放
(2)文件前中后加密
这三段文件加密都涉及到文件的读取,尤其是对大文件的读取,使用java的RandomAccessFile(随机访问文件)这个类来进行文件的加密解密
盗链:用户通过一次付费行为,就可以拿到付费视频的播放URL,将播放的URL进行二次分发
盗播:用户将视频直接下载到本地,然后进行二次上传分发
21、App 是如何沙箱化,为什么要这么做
Android是一个多用户系统,每个应用是一个独立的用户。系统为每个应用分配一个唯一的用户标识(UID),并为应用中所有的文件设置该用户才能访问的权限。每个进程中有一个独立的VM。每个应用在自己的进程中运行,应用组件需要执行时,系统创建该进程,当系统内存不足时,系统会销毁该进程
在很多情况下,源自同一开发者或同一开发机构的应用程序,相互间存在信任关系。Android系统提供一种所谓的共享UID(SharedUserID)机制,使具备信任关系的应用程序可以运行在同一进程空间
沙箱是为app提供隔离环境的一种安全机制,严格控制执行的程序所访问的资源,以确保系统的安全,让app在独立的进程中执行任务,让其不能访问外部进程的资源,这样一个应用出问题了,其他的应用进程能够保障不被影响
22、权限管理系统(底层的权限是如何进行grant的)
应用程序在应用层的AndroidManifest.xml中所申请的权限将会在Android系统启动时,经过解析后,逐步映射到内核层的组ID和用户ID,最终由内核层setgid()和setuid()函数设置后才能执行。在进行权限申请时,6.0以上危险权限组需要动态代码申请,6.0以下直接在AndroidManifest.xml中注册即可
(三)数据库
1、SQLite升级,增加字段的语句
alter table TABLE_NAME(表名) add column FIELD_NAME(新字段名) FIELD_TYPE(字段类型)
2、数据库框架对比和源码分析
Room
优点:
(1)通过注解生成代码,减少代码量
(2)编译期SQL检查机制,降低风险
(3)对源生数据库做了一些优化性能的改写
缺点:没有缓存机制
GreenDao
优点:
(1)通过注解生成代码,减少代码量
(2)通过api调用完成操作,多数情况下避免编写sql语句
(3)缓存机制,提升了一定的效率(但每次都会执行sql操作)
缺点:
(1)通过JDT生成的文件无法与IDE建立关联,新增或修改相关表结构需要两次构建,特别是项目后期,特别浪费时间
(2)学习成本高,除了要学习相关的注解使用,还要学习相关的API调用方法
ObjectBox
优点:
(1)通过注解生成代码,减少代码量
(2)缓存机制,提升了一定的效率
(3)格式灵活,存储数据的格式可以是key-value形式、文档形式、图片形式等等
(4)运行速度快,NOSQL可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘,比经常使用的SQLite数据库快10倍
缺点:
(1)CPU架构支持方面非常局限,目前只支持2个平台(armeabiv-v7a,arm64-v8a)
(2)学习成本高,不支持sql,且需要学习相关的注解使用
3、数据库的优化
性能上:
(1)批量事务插入,提升数据插入的性能
(2)单条sql优于多条sql
(3)读和写操作是互斥的,写操作过程中可以休眠让读操作进行
(4)使用索引或使用联合索引,但勿使用过多索引
(5)增加查询条件
(6)提前将字段的index映射好
设计上
(1)通过冗余换取查询速度
(2)减少数据来提升查询速度
(3)避免大数据多表的联合查询
4、数据库数据迁移问题
(1)将表A重命名,重命名为A_temp
(2)创建新表A
(3)将表A_temp中的数据插入到新表A中
(4)删除表A_temp
Android高级面试题汇总——高级开发技术面试题(1)相关推荐
- jdbc和mysql面试题_JDBC数据访问技术面试题(附答案)
随着移动互联网的发展,从事计算机行业的人越来越多,这些人中,选择java的人占了很大一部分比例,相信有很多的人都有面试的需要.在java面试中,少不了的内容就是面试题了,今天来说一说JDBC数据访问技 ...
- java机试题下载_java开发机试题(总题库).pdf
java开发机试题(总题库) 平安Java 开发机试题 一.单选题 1. 关于WORKNET,下列描述错误的是? 应用系统必须是通过UM 认证才能使用WORKNET WORKNET-ENGINE 是核 ...
- 百度校园招聘历年经典面试题汇总:开发测试岗
(1).sql语句增.删.查.改 (2).CPU 和 GPU的区别 (3).推荐的算法有哪些 (4).协同过滤怎么实现的? (5).熟悉的Linux命令,查看磁盘空间的命令,如何找到一个文件中含有aa ...
- java mvc 面试题_2018年java技术面试题整理
1.servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request.resp ...
- 年终盘点 | 2019年Java面试题汇总篇(附答案)
作者 | 老王 来源 | Java中文社群「微信公众号」 在这岁月更替辞旧迎新的时刻,老王盘点了一下自己 2019 年发布的所有文章,意外的发现关于「Java面试」的主题文章,竟然发布了 52 篇,几 ...
- 【吐血整理】年度盘点 | 2019年Java面试题汇总篇——附答案
在这岁月更替辞旧迎新的时刻,老王盘点了一下自己 2019 年发布的所有文章,意外的发现关于「Java面试」的主题文章,竟然发布了 52 篇,几乎是全年每周一篇面试文章的节奏,当然其中有不少的面试题来源 ...
- spark 面试题汇总
大数据面试题汇总 大数据面试题汇总 - 简书 spark 资源调优 1.列式存储和行式存储的区别 行存储,数据行存储,一个文件可表达一个二维表.适用于一般的业务场景如CSV文件,文本文件 因为这里的行 ...
- python后端面试题2020_2020年ajax面试题及答案(最新),python面试题2020
2020年ajax面试题及答案(最新)2020年阿贾克斯面试问答最新,Ajax作为一种创建更好.更快.更具交互性的Web应用的技术,目前越来越受到大家的重视,所以提前掌握ajax面试题知识点有助于求职 ...
- 2023年中高级Android面试题汇总(不断更新中)
前言 今年年底疫情宣布全面解封,由于疫情带来的影响2022年可谓是近十年以来最低谷的一天,但在2023年,我相信将会是面试求职的高峰时期,如果此时手里有份高质量的面试宝典,那么你将得心应手面对考官各种 ...
最新文章
- JavaScript教程--从入门到精通
- php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...
- 安卓分辨率_免费的安卓群控1数字云免费安卓群控系统
- 特斯拉加州工厂无视禁令强行复工,马斯克:要抓就只抓我
- pip install 报错 Error: Cannot uninstall ‘pyparsing‘ 的解决方法
- ubuntu 18.04 conda 环境中编译 pytorch
- WEB前端资源项目整合
- labview入门到出家11(补充)——基于单片机和labview开发的虚拟示波器
- Inventory文件扩展
- html背景斜线,巧妙的实现 CSS 斜线
- Unity中Combined Mesh (root: scene)的解决方法
- neo4j配置远程连接
- EasyPoi导出Excel实现标记颜色
- 微信支付-当前页面的URL未注册
- Android审计平台,Android系统安全审计方法研究
- 什么是共享办公室,你想知道的都在这
- 2019 年终回顾:不忘初心,负重前行
- 基于新版本Gradle上传jitpack开源项目
- 边缘计算:电信运营商5G时代战略转型的关键一步
- [Vue warn]: Failed to resolve directive: focus
热门文章
- 2020 搞个 Mac 玩玩
- python基础语法总结笔记
- 天九共享第51届战略股东联谊会在武汉成功举办
- 【CSS】课程网站 Banner 制作 ③ ( Banner 栏右侧课程盒子测量及样式 | Banner 版心盒子模型右侧课程栏代码示例 )
- 微信公众号申请服务器,微信公众号服务器接口验证示例
- 二代锐龙服务器芯片,AMD锐龙二代CPU开盖:比Intel良心万倍
- 1111111111111111111111111111111
- ios信号从4g变成无服务器,iPhoneX升至iOS12.1.4,4G信号还剩一格,网友:差到要哭了...
- 【微信小程序】实现小程序下拉刷新与上拉加载
- 小米/红米开启游戏消息屏蔽