技术标签: 找工作 javascript
基本数据类型(栈):Number,String,Boolean,null,undefined,symbol(创建唯一值),bigint(后两个为ES6新增)
引用数据类型(堆):object,function
1、typeof typeof 是一个操作符,返回该类型的字符串(全小写字母)形式表示,包括以下 7种:number、string、boolean、undefined、symbol、object、function 等。(对于 null,返回 object 类型。)
- 对于基本类型,除 null 以外,均可以返回正确的结果。
- 对于引用类型,除 function ,一律返回 object 类型。
2、instanceof 检测的是原型,instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
3、toString是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]]Object.prototype.toString.call('')
4、constructor是原型prototype的一个属性,当函数被定义时候,js引擎会为函数添加原型prototype,并且这个prototype中constructor属性指向函数引用, 因此重写prototype会丢失原来的constructor。
let 和 const 的优点?
let 和 const 有了块级作用域,变量声明不会提升相比于 var
var、let、const的区别
箭头函数与普通函数区别
作用:
不停检查 Call Stack 中是否有任务(也叫栈帧)需要执行,如果没有,就检查 Event Queue,从中弹出一个任务,放入 Call Stack 中,如此往复循环。
1、所有同步任务都在主线程上执行,形成一个执行栈
2、主线程之外,还存在一个"消息队列"。只要异步操作执行完成,就到消息队列中排队
3、一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取消息队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行
4、主线程不断重复上面的第三步
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围), 这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
闭包的特点:
- 让外部访问函数内部变量成为可能;
- 可以避免使用全局变量,防止全局变量污染;
- 可以让局部变量常驻在内存中;
- 会造成内存泄漏(有一块内存空间被长期占用,而不被释放)
function makeFunc() {
var name = "Mozilla";
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象共享同一块内存。
深拷贝会创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现浅拷贝方法:
(1)Object.assign方法
(2)for in方法
实现深拷贝方法:
(1)采用递归去拷贝所有层级属性
(2)使用JSON.stringify和JSON.parse实现深拷贝:JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象;
(3)热门的函数库lodash,也有提供_.cloneDeep用来做深拷贝;
Promise对象, 可以将异步操作以同步的流程表达出来。使用 Promise 主要有以下好处:
new Promise(function(resolve, reject)
then,catch,finally捕获错误Promse.race Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
(1)创建 XMLHttpRequest 对象,也就是创建一个异步调用对象;
(2)创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、 URL 以及验证信息;
(3)设置响应 HTTP 请求状态变化的函数;
(4)发送 HTTP 请求;
(5)获取异步调用返回的数据;
(6)使用 JavaScript 和 DOM 实现局部刷新。
他们都是用于在模块化定义中使用的,前三个是ES5中提供的模块化编程的方案,
AMD: 是RequireJS在推广过程中对模块定义的规范化产出(依赖前置、异步定义)
通过define()函数定义,第一个参数是一个数组,里面定义一些需要依赖的包,第二个参数是一个回调函数,通过变量来引用模块里面的方法,最后通过return来输出。
CMD:是SeaJS在推广过程中对模块定义的规范化产出,(同步模块,没有前置依赖)
通过define()定义,没有依赖前置,通过require加载jQuery插件,CMD是依赖就近,在什么地方使用到插件就在什么地方require该插件,即用即返,这是一个同步的概念
CommonJs:是通过module.exports定义的,通过node.js后端使用的。
import/export:是ES6中定义新增的,对模块进行导出导入的
import命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适)。
import()函数,完成动态加载。异步加载
require是运行时加载模块,只有运行时才知道,同步加载
https://blog.csdn.net/weixin_44135121/article/details/104161852
Parser 解析
第一步主要是将 ES6 语法解析为 AST 抽象语法树。简单地说就是将代码打散成颗粒组装的对象。这一步主要是通过 babylon 插件来完成。
Transformer 转换
第二步是将打散的 AST 语法通过配置好的 plugins(babel-traverse 对 AST 进行遍历转译)和 presets (es2015 / es2016 / es2017 / env / stage-0 / stage-4 其中 es20xx 表示转换成该年份批准的标准,env 是最新标准,stage-0 和 stage-4 是实验版)转换成新的 AST 语法。这一步主要是由 babel-transform 插件完成。plugins 和 presets 通常在 .babelrc 文件中配置。
Generator 生成
第三步是将新的 AST 语法树对象再生成浏览器都可以识别的 ES5 语法。这一步主要是由 babel-generator 插件完成
http请求的推演过程:
注:
1.DNS怎么找到域名的?
递归查询。 浏览器自身的DNS缓存->系统自身的DNS缓存->hosts文件->域名服务器
DNS优化两个方面:DNS缓存、DNS负载均衡
2.为什么HTTP协议要基于TCP来实现?
TCP是一个端到端的可靠的面相连接的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题(当发生错误时,会重传)
3.服务器关闭关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
TCP的三次握手过程如下:
C-> SYN -> S SYN标记的包,请求建立连接.
S->SYN/ACK->C SYN包的确认包,对第一个SYN包的确认
C->ACK->S 通知A连接已建立
三次握手的原因: “为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”1. 确保建立可靠连接2. 避免资源浪费
例如,客户端先发送了一个SYN,但是由于网络阻塞,该SYN数据包在某个节点长期滞留。然后客户端又重传SYN数据包并正确建立TCP连接,然后传输完数据后关闭该连接。该连接释放后失效的SYN数据包才到达服务器端。在二次握手的前提下,服务器端会认为这是客户端发起的又一次请求,然后发送SYN
,并且在服务器端创建socket套接字,一直等待客户端发送数据。但是由于客户端并没有发起新的请求,所以会丢弃服务端的SYN
。此时服务器会一直等待客户端发送数据从而造成资源浪费。
TCP的四次挥手过程如下:
C->FIN->S 客户端进程发出连接释放报文,并且停止发送数据。
S->ACK->C 服务器收到连接释放报文,发出确认报文
S->FIN->C 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文
C->ACK->S客户端收到服务器的连接释放报文后,必须发出确认
四次挥手的原因:由于连接的关闭控制权在应用层,所以被动关闭的一方在接收到FIN包时,TCP协议栈会直接发送一个ACK确认包,优先关闭一端的通信。然后通知应用层,由应用层决定什么时候发送FIN包。应用层可以使用系统调用函数read==0来判断对端是否关闭连接。
http 缓存控制
补充:
1. 为什么有expires 有需要cache-control
因为expires 有个服务器和浏览器时间不同步的问题
expires是绝对事件 cache-control是相对时间
Cache-Control的优先级比Expires的优先级高
2. last-modify和Etag
last-modify 最后一次被修改的时间,它是有个精度问题 到秒
e-tag 没有精度问题 只要文件改变 e-tag值就改变
Etag 的优先级高于 Last-Modified
共同点:都是保存在浏览器端、且同源的
web storage:sessionStorage, localStorage
区别:
写一个会过期的localStorage:
惰性删除:某个键值过期后不会被马上删除,等到下次被使用,检查到过期删除。
定时删除:每隔一段时间执行一次删除操作,并通过限制删除操作执行的次数和频率,来减少删除操作对CPU的长期占用。另一方面定时删除减少localStorage空间的浪费。
fetch是一个底层的 api 浏览器原生支持的 axios是一个封装好的框架
axios 1)支持浏览器和nodejs发请求 前后端发请求,
2)支持promise语法
3)支持自动解析json
4)支持中断请求
5) 支持拦截请求
6) 支持请求进度监测
7) 支持客户端防止csrf
一句话总结: 封装比较好
fetch
优点: 1. 浏览器级别原生支持的api
2. 原生支持promise api
3. 语法简洁 符合 es 标准规范
4. 是由whatwg 组织提出的 现在已经是w3c规范
缺点:
1. 不支持文件上传进度监测
2. 使用不完美 需要封装
3. 不支持请求中止
4. 默认不带cookie
一句话总结: 缺点是需要封装 优点 底层原生支持
1.跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。
(协议名,子域名,主域名,端口号)
跨域解决方案
jsonp:利用script 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据。JSONP优点是简单兼容性好,缺点是仅支持get方法具有局限性, 不安全可能会遭受XSS攻击。
cors:跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来进行跨域。浏览器会自动进行 CORS 通信,服务端设置 Access-Control-Allow-Origin 就可以开启 CORS。
HTTP响应由三部分组成:状态行,响应头,空格,消息体
状态行包括:协议版本、状态码、状态码描述
状态码: 状态码用于表示服务器对请求的处理结果
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——请求有语法错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。
列举几种常见的:
200(没有问题)
301是永久重定向
302(要你去找别人) 临时重定向
304(要你去拿缓存) 未修改
307(要你去拿缓存)
403(有这个资源,但是没有访问权限)
404(服务器没有这个资源)
500(服务器这边有问题)
响应头: 响应头用于描述服务器的基本信息,以及客户端如何处理数据
空格: CRLF(即 \r\n)分割
消息体: 服务器返回给客户端的数据
HTTP:是一种网络协议,用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是HTTP的安全版,即HTTP下加入SSL层。,如今 SSL 已废弃,HTTPS 引入了数据加密和身份验证机制。通过安全可靠的 TLS 协议进行加密。
HTTPS作用:
- 内容加密 建立一个信息安全通道,来保证数据传输的安全;
- 身份认证 确认网站的真实性
- 数据完整性 防止内容被第三方冒充或者篡改
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http1.x 和http2.x主要有以下4个区别:
加密在HTTPS协议中的应用
假如现在 你向支付宝 转账(术语数据信息),为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为:
盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border)
标准 W3C 盒子模型:width=content
IE 盒子模型:width=content+ border +padding;
BFC,块级格式化上下文,形成独立的渲染区域,盒子里面的子元素的样式不会影响到外面的元素。
BFC触发方式
作用
浮动元素引起的问题
clear当应用于非浮动块时,它将非浮动块的边框边界移动到所有相关浮动元素外边界的下方。这个非浮动块的垂直外边距会折叠。
1.使用空标签清除浮动。clear属性
<div style="clear:both;"></div>
2. 使用after伪对象清除浮动。clear属性
该方法只适用于非IE浏览器。该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;
3. 使用overflow。(计算BFC高度时,浮动子元素也参与计算)
可以给父元素设置overflow:auto或者hidden
4. 浮动外部元素 形成BFC
内联样式 > id选择器样式 > 类选择器样式 > 元素选择器样式
(1) link属于HTML标签,而@import是CSS提供的;
(2) 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
(3) import只在IE5以上才能识别,而link是HTML标签,无兼容问题;
1.absolute 生成绝对定位的元素,相对于 static 定位以外的第一个祖先元素进行定位。
2.fixed 生成固定定位的元素,相对于浏览器窗口进行定位(老IE不支持)。
3.relative 生成相对定位的元素,相对于其在普通流中的位置进行定位。
4.static 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right z-index 声明)。
5.inherit 规定从父元素继承 position 属性的值。
共同点
1.改变行内元素的呈现方式,display被置为block
2.让元素脱离普通流,不占据空间
3.默认会覆盖到非定位的元素上
不同点
块元素, 行内元素
语义化标签: header, section 等
异步加载JS文件: defer 和 async
Ajax->XMLHttpRequest
Axios->fetch
参考答案:
MVC: MVC是应用最广泛的软件架构之一,一般 MVC 分为: Model(模型) , View(视图) , Controller(控制 器) 。 这主要是基于分层的目的,让彼此的职责分开. View 一般用过 Controller 来和 Model 进行联系。 Controller 是 Model 和 View 的协调者, View 和 Model 不直接联系。基本都是单向联系。
MVVM: MVVM 是把 MVC 中的 Controller 改变成了ViewModel 。 View 的变化会自动更新到ViewModel , ViewModel 的变化也会自动同步到 View上 显示,通过数据来显示视图层。
MVVM和MVC的区别:
dom-diff 算法会比较前后虚拟 DOM ,从而得到 patches (补丁),然后与老 Virtual DOM 进行对比,将其应用在需要更新的地方,将 O(n^3) 复杂度的问题转换成 O(n^1=n) 复杂度的问题,得到新的
Virtual DOM 。降低时间复杂度的方法:
父子组件生命周期的顺序
加载渲染过程
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
子组件更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新过程
父beforeUpdate->父updated
销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
组件生命周期
的数据响应是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty () 来
劫持各个属性的setter、getter,但是它并不算是实现数据的响应式的完美方案,某些情况下需要对其
进行修补或者hack这也是它的缺陷,主要表现在两个方面:
Vue3.0 实现数据双向绑定的方法
vue3.0 实现数据双向绑定是通过Proxy
Vuex是专门为Vuejs应用程序设计的状态管理工具。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
具体工作:vuex是一种状态管理机制,将全局组件的共享状态抽取出来为一个store,以一个单例模式存在,应用任何一个组件中都可以使用,vuex更改state的唯一途径是通过mutation,mutation需要commit触发, action实际触发是mutation,其中mutation处理同步任务,action处理异步任务。
结合 Vue 的异步组件和 Webpack 的代码分割功能,可以实现路由组件的懒加载
参考答案:
vue-router是Vue官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。 vue-router 默认 hash 模式,还有一种是history模式。
原理:
进程是操作系统分配资源的单位,线程是CPU调度的基本单位,线程之间共享进程资源
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在不可靠的网络中提供一个可靠的端对端字节流。.
UDP是一种无连接的传输层协议,提供简单不可靠的非连接传输层服务,面向报文。
区别:
应用场景选择:
对实时性要求高和高速传输的场合下使用UDP;
在可靠性要求低,追求效率的情况下使用UDP;
需要传输大量数据且对可靠性要求高的情况下使用TCP。
OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。
1.应用层
作用:它是与其他计算机进行通信的应用,它是对应应用程序的通信服务的。各种应用软件,包括web应用。
协议:DNS、FTP、HTTP、SMTP、TELNET、IRC、WHOIS
2.表示层
作用:这一层的主要作用是定义数据格式和加密
3.会话层
作用:控制应用程序的会话能力,它定义了一段会话的开始、控制和结束,包括对多个双向消息的控制和管理,以便在只完成一部分消息时可以通知应用
4.传输层
作用:对差错恢复协议和无差错恢复协议的选择,对同一主机上不同数据流的输入进行复用,对数据包进行重新排序。是最关键的一层,是唯一负责整体的数据传输和数据控制的。对上三层提供可靠的传输服务,对网络层提供可靠的目的地信息。在这一层数据的单位被称为数据段。
协议:TCP、UDP等
5.网络层
作用:主要负责寻找地址和路由选择,网络层还可以实现阻塞控制、网际互联等。
协议:IP、IPX、RIP、OSPF等
6.数据链路层
作用:负责物理层面上的互联的、节点间的通信传输;该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)
协议:ARP、RARP、SDLC、HDLC、PPP、STP、帧中继等
7.物理层
作用:负责0、1 比特流(0/1序列)与电压的高低、逛的闪灭之间的转换 规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性;该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为比特(bit)。
典型规范:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45、fddi令牌环网等
期待的解决方案包括:
1、减少HTTP请求数
合理设置HTTP缓存:能缓存的越多越好,能缓存的越久越好。
资源合并和压缩:如果可以的话,尽可能的将外部的脚本、样式进行合并(CSS Sprites:合并css图片);另外css、js、image都可以用相应的工具进行压缩
Inline Images:使用data:URL scheme的方式将图片嵌入到页面或者CSS中
2、异步请求callback、异步执行脚本
3、Lazy Load Javascript:只有在需要加载的时候加载
随着js框架流行,越来越多的站点使用起了框架,不过一个框架往往包括很多的资源,这些功能并不是每个页面都需要的。为了节省资源和时间,目前有两种做法:mini版本和Lazy Load
4、避免重复的资源请求:这种情况主要是由于疏忽或者页面由多个模块拼接而成,然后每个模块都请求了同样的资源
(关于js的延迟加载)的好处是有助于提高页面加载速度,js延迟加载就是等页面加载完成之后在加载js文件
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法