工作线程 进程可以执行任务而不干扰页面互动吗?

21、静态分析是运行程序后进行调试?
您的答案: 标准答案: B

22、安卓反编译后会出现$符号字节码表示是匿名内部类?

您的答案: 标准答案: A

23、反编译安卓应用后,一般应该先查看哪一个smali文件的代码?

A、 编译程序打开控制台

B、 打开匿名类smali文件

C、 打开加密解密smali文件

您的答案: 标准答案: D

24、在整个工作中,无权限程序1发送广播到程序2,有权限的程序2不能让程序1下载文件。()

您的答案: 标准答案: B

25、哪个选项不是利用Activity劫持对系统进行恶意攻击的?

A、 遍历运行中的程序

B、 恶意程序启动带标志的钓鱼试Activity覆盖正常的Activity

C、 用户在伪造的界面上进行操作

D、 查杀恶意程序发送的信息

您的答案: 标准答案: D

26、程序加载的时候有两种视图,分别是链接视图和执行视图。

您的答案: 标准答案: A

27、Dex文件结构是一个.class集合,它会把.class里变量、符号和字符串放在池子里面,通过索引来使用,来压缩文件大小。()

您的答案: 标准答案: B

您的答案: 标准答案: A

D、 基于代码指令执行检测

您的答案: 标准答案: B

您的答案: 标准答案: C

31、Method ids索引是一个相对于前一个索引的增量,例如:第一个方法是0,第二个方法相对于第一个方法偏移1,就是1。第三个方法相对于第二个方法偏移是1,其实还是1,意思是往下递加。

您的答案: 标准答案: A

32、Dex加密使用shell的Dex替换原始的Dex,把原始的Dex当成资源或者附加数据进行隐藏。()

您的答案: 标准答案: A

您的答案: 标准答案: B

您的答案: 标准答案: A

35、下面对名称替换的概念性说法有误的是?

A、 把程序里面有意义的类、方法和字段替换无意义随机文本

B、 无意义的随机文有自动还原方法

您的答案: 标准答案: B

您的答案: 标准答案: B

37、在安卓逆向中经常用到的ADB全称是什么?

您的答案: 标准答案: B

38、以下哪些功能不是ADB的常用功能?

您的答案: 标准答案: D

39、以下命令中哪个是(使用ADB)安装apk的正确命令?

您的答案: 标准答案: A

31、计算机病毒的会造成哪些危害?

B、 计算机用户的伤害

D、 程序和数据的破坏

您的答案: 标准答案: D

32、在Windows 32 位操作系统中,其EXE文件中的特殊表示为?

您的答案: 标准答案: B

33、能够感染EXE、COM 文件的病毒属于?

您的答案: 标准答案: C

34、下列描述不正确的是?

A、 不存在能够防治未来的所有病毒的发病毒软、硬件

B、 现在的杀毒软件能够查杀未知病毒

C、 病毒产生在前,反病毒手段相对滞后

D、 数据备份是防治数据丢失的重要手段

您的答案: 标准答案: B

35、下列预防计算机病毒的注意事项中,错误的是?

A、 不使用网络,以免中毒

B、 重要资料经常备份

D、 尽量避免在无防毒软件机器上使用可移动储存介质

您的答案: 标准答案: A

36、什么是敲竹杠病毒?

A、 对电脑设置开机密码类,再提供密码索要费用的木马病毒

B、 盗取数据信息的病毒

C、 破坏计算机运行的病毒

您的答案: 标准答案: A

37、在OD工具调试中,JE跳转不成立,不改变病毒运行顺序的情况下,可以把ZF标志位修改为1。

您的答案: 标准答案: A

38、EAX寄存器保存的是操作字符串的地址信息。

您的答案: 标准答案: A

39、病毒屏蔽杀毒软件后可以用改文件名的方法来进行绕过。

您的答案: 标准答案: A

40、注册表映像劫持的路径是?

您的答案: 标准答案: C

A、 检索系统快照中遇到的第一个进程的信息

B、 搜索一个文件或子目录名匹配一个特定名称的目录

C、 获取进程信息为指定的进程、进程使用的堆、线程建立一个快照

D、 函数终止指定进程及其所有线程

您的答案: 标准答案: C

42、每个函数都有自己的栈帧,每个函数都是利用自己的栈帧空间保存全局变量与函数的调用关系。()

您的答案: 标准答案: B

43、如果能控制进程的执行流程,不能够执行想要执行的指令,达到我们目的的指令序列就叫做shellcode。()

您的答案: 标准答案: B

44、下面是漏洞代码,分析的结果:创建一个ba数组,将ba内容加密,修改ba内容,为ba解密。()

您的答案: 标准答案: B

45、缓冲区溢出漏洞的原理,它就是因为我们输入了过长的字符,而缓冲区本身又没有有效的验证机制,导致过长的字符将返回地址覆盖掉了

您的答案: 标准答案: A

您的答案: 标准答案: A

您的答案: 标准答案: A

您的答案: 标准答案: A

49、32位的无符号整数可以表示的整数范围是:0-2的16次方-1。

您的答案: 标准答案: B

50、在操作系统中安装全局钩子以后,只要目标进程符合我们所设定的条件,全局钩子的DLL文件会被操作系统自动或强行地加载到该进程中。

您的答案: 标准答案: A

1、企业常见身份标识技术有ID、用户名、AD域控、行为管理设备、账号、LDAP。()

您的答案: 标准答案: A

2、通过观景、入口、设施社区布局、照明等条件模式来预防犯罪。()

您的答案: 标准答案: A

3、在车库内、楼梯间和电梯使用玻璃窗能让犯罪者打消作案心里想法。()

您的答案: 标准答案: A

4、TOGAF框架需求管理迭代步骤方法正确的是():

A、 架构愿景,业务架构,信息系统架构,技术架构,机会及解决方案,迁移规划,实施治理,构架变更管理

B、 预备阶段,架构能力管理,架构愿景,业务架构,信息系统架构,技术架构,机会及解决方案,迁移规划,实施治理,构架变更管理

C、 信息系统架构,技术架构,机会及解决方案,迁移规划,实施治理,构架变更管理

D、 构架变更管理,实施治理,迁移规划,机会及解决方案,,技术架构,信息系统架构

您的答案: 标准答案: A

5、Zachman企业框架方向和设计都是采用纵横坐标。()

您的答案: 标准答案: A

6、Zachman模型不是基于人来开发的一个模型框架。()

您的答案: 标准答案: B

7、SABSA模型内容不包括的层次是():

您的答案: 标准答案: C

8、SABSA模型纵横坐标定义错误的是():

A、 纵坐标:上下文,概念层,逻辑层,物理层,组件层,运营层

B、 横坐标:什么,为什么,过程,谁,地点,时间

C、 纵坐标:业务连续性,风险管理,服务和支持,管理和支持,平台安全,日程表

D、 横坐标:数据结构,标准,工具,标识、功能、ACL,过程和协议,顺序

您的答案: 标准答案: C

9、SABSA模型不是基于安全架构开发的一个模型和方法论。()

您的答案: 标准答案: B

10、CobiT是一个IT实践帮助模型,也是指导、IT管理标岗、控制和参考模型。()

您的答案: 标准答案: A

11、第一代防火墙技术是基于电路层流量

您的答案: 标准答案: B

12、数据通过防火墙传输是发生在哪层

您的答案: 标准答案: C

13、防火墙术语中Trust指的是

您的答案: 标准答案: B

14、集成防火墙类似于UTM

您的答案: 标准答案: A

15、防火墙的简单包过滤工作相关说法正确的是

A、 防火墙会检查数据区是否有恶意数据

B、 防火墙会建立连接状态表用于保持连接

D、 防火墙对应用层控制较强

您的答案: 标准答案: C

16、防火墙包过滤规则中,21端口用于FTP数据包的传输

您的答案: 标准答案: B

17、CPU指令类型包括进程和线程

您的答案: 标准答案: A

18、分层级设计的操作系统中,0层控制哪方面

您的答案: 标准答案: C

19、微内核架构中,核心在微内核,其它在客户端服务器端

您的答案: 标准答案: B

20、系统安全架构中属于终端防护的是

您的答案: 标准答案: A

21、操作系统安全保护的核心是系统应用程序及数据库功能

您的答案: 标准答案: B

22、Linux系统中对文件的权限控制属于哪类信息安全模型

您的答案: 标准答案: D

23、以下哪类模型采用了分层级的设计

您的答案: 标准答案: C

24、状态机模型描述了一种无论处于何种状态都是绝对安全的系统

您的答案: 标准答案: B

25、人在互联网中的角色呈现多样性这个说法正确吗

您的答案: 标准答案: A

26、视频中以下哪项不是舆情分析需要的知识储备?

您的答案: 标准答案: D

27、舆情是指社会公众对于网络上的某些事件和话题在现实中所进行的行为这个说法正确吗

您的答案: 标准答案: B

28、企业和政府中的舆情分析体系包括信息监测这个环节吗?

您的答案: 标准答案: A

29、在进行舆情事件分析时首先考量的是所在组织的利害关系这个说法对吗

您的答案: 标准答案: A

30、在案例中相关企业应当快速回应避免对品牌造成伤害这个说法正确吗

您的答案: 标准答案: A

31、监测系统的作用在于海量信息的筛选这个说法正确吗?

您的答案: 标准答案: A

32、舆情分析工作中可以根据情况自己进行决策执行这个说法正确吗

您的答案: 标准答案: B

33、研究舆情事件中参与者的身份构成重要吗

您的答案: 标准答案: A

34、下面哪些步骤是舆情管理中不必要的?

您的答案: 标准答案: C

35、组织在舆情事件出现后的协同要根据组织架构中各个部分的职责和职能进行协同这个说法正确吗

您的答案: 标准答案: A

36、单个维权和群体维权对于舆情工作的区别只是在于数量这个说法正确吗

您的答案: 标准答案: B

37、这次事件后国家食品药品监督管理总局针对社会关心的疫苗安全问题发布科普知识予以回应,这是一种舆情处理吗?

您的答案: 标准答案: A

38、课程中的组织设计的管理考核是指划定舆情工作任务量化目标这个说法正确吗?

您的答案: 标准答案: A

39、管理者除了对舆情部门的管理还必须包括对自身信息的管理这个说法正确吗

您的答案: 标准答案: A

40、领导能力只包括政策解读和决策对应两种能力这个说法正确吗?

您的答案: 标准答案: B

41、分析研判包括对信息产生的后果的预测这个说法正确吗

您的答案: 标准答案: A

42、舆情工作的技术环节重点在于信息的收集和过滤这个说法正确吗

您的答案: 标准答案: A

43、视频中从哪个角度分析网民对快播案件的态度?

您的答案: 标准答案: B

44、视频中提出的分析报告中网民主要的年龄段是多少?

您的答案: 标准答案: C

45、网站登记备案归以下哪个部门管理?

您的答案: 标准答案: B

46、监测系统的最终目标在于什么?

您的答案: 标准答案: D

47、关键字监测和敏感词发现的目的在于过滤不相关信息这个说法正确吗

您的答案: 标准答案: A

48、棱镜计划是只收集美国公民手机的隐私数据这个说法正确吗

您的答案: 标准答案: B

49、监测系统用户管理中的审批功能是为了保障信息安全这个说法正确吗?

您的答案: 标准答案: A

50、监测系统的重点在于信息收集能力,而不在于信息关联能力这个说法正确吗?

您的答案: 标准答案: B

1、下列哪项不是信息安全的定义?

A、 数据安全,确保数据不会被非法入侵者读取或破坏

B、 程序安全,重视软件开发过程的品质及维护

C、 系统安全,维护计算机系统正常操作

D、 环境安全,管理员不能用弱口令

您的答案: 标准答案: D

2、下列哪项不是正确的防止被骗操作?

A、 在淘宝购买东西应该使用旺旺交流

B、 商家发送的发票文件,直接打开

C、 商品多次修改价格,应该提高警惕

D、 对商家发送的文件进行查杀

您的答案: 标准答案: B

3、下列选项中对DES加密算法描述不正确的是?

A、 以64位为分组对数据进行加密

B、 其密钥长度为56位

C、 运用相同算法进行加密解密

D、 DES加密算法为最安全的加密算法之一

您的答案: 标准答案: D

4、下列关于标准防火墙的描述错误的是?

A、 防火墙安全规则遵循从上到下匹配原则,一旦有一条匹配,剩余的规则就不匹配了

B、 所有的规则都没有匹配到,数据包将丢弃

C、 安全过滤规则主要包含源、目的地址和端口

D、 防火墙的主要功能是防止病毒等恶意程序的传输

您的答案: 标准答案: D

31、计算机病毒的会造成哪些危害?

B、 计算机用户的伤害

D、 程序和数据的破坏

32、在Windows 32 位操作系统中,其EXE文件中的特殊表示为?

33、能够感染EXE、COM 文件的病毒属于?

34、下列描述不正确的是?

A、 不存在能够防治未来的所有病毒的发病毒软、硬件

B、 现在的杀毒软件能够查杀未知病毒

C、 病毒产生在前,反病毒手段相对滞后

D、 数据备份是防治数据丢失的重要手段

35、下列预防计算机病毒的注意事项中,错误的是?

A、 不使用网络,以免中毒

B、 重要资料经常备份

D、 尽量避免在无防毒软件机器上使用可移动储存介质

36、什么是敲竹杠病毒?

A、 对电脑设置开机密码类,再提供密码索要费用的木马病毒

B、 盗取数据信息的病毒

C、 破坏计算机运行的病毒

37、在OD工具调试中,JE跳转不成立,不改变病毒运行顺序的情况下,可以把ZF标志位修改为1。

38、EAX寄存器保存的是操作字符串的地址信息。

39、病毒屏蔽杀毒软件后可以用改文件名的方法来进行绕过。

40、注册表映像劫持的路径是?

A、 检索系统快照中遇到的第一个进程的信息

B、 搜索一个文件或子目录名匹配一个特定名称的目录

C、 获取进程信息为指定的进程、进程使用的堆、线程建立一个快照

D、 函数终止指定进程及其所有线程

42、每个函数都有自己的栈帧,每个函数都是利用自己的栈帧空间保存全局变量与函数的调用关系。()

43、如果能控制进程的执行流程,不能够执行想要执行的指令,达到我们目的的指令序列就叫做shellcode。()

44、下面是漏洞代码,分析的结果:创建一个ba数组,将ba内容加密,修改ba内容,为ba解密。()

45、缓冲区溢出漏洞的原理,它就是因为我们输入了过长的字符,而缓冲区本身又没有有效的验证机制,导致过长的字符将返回地址覆盖掉了

49、32位的无符号整数可以表示的整数范围是:0-2的16次方-1。

50、在操作系统中安装全局钩子以后,只要目标进程符合我们所设定的条件,全局钩子的DLL文件会被操作系统自动或强行地加载到该进程中。

1、下列哪项不是信息安全的定义?

A、 数据安全,确保数据不会被非法入侵者读取或破坏

B、 程序安全,重视软件开发过程的品质及维护

C、 系统安全,维护计算机系统正常操作

D、 环境安全,管理员不能用弱口令

2、下列哪项不是正确的防止被骗操作?

A、 在淘宝购买东西应该使用旺旺交流

B、 商家发送的发票文件,直接打开

C、 商品多次修改价格,应该提高警惕

D、 对商家发送的文件进行查杀

3、下列选项中对DES加密算法描述不正确的是?

A、 以64位为分组对数据进行加密

B、 其密钥长度为56位

C、 运用相同算法进行加密解密

D、 DES加密算法为最安全的加密算法之一

4、下列关于标准防火墙的描述错误的是?

A、 防火墙安全规则遵循从上到下匹配原则,一旦有一条匹配,剩余的规则就不匹配了

B、 所有的规则都没有匹配到,数据包将丢弃

C、 安全过滤规则主要包含源、目的地址和端口

D、 防火墙的主要功能是防止病毒等恶意程序的传输

B、 规则强度为101,不允许TCP连接,禁止所有主机对198.78.46.8的www服务进行访问

C、 匹配顺序为101,允许TCP连接,所有主机对198.78.46.8的www服务进行访问

D、 匹配顺序为101,允许TCP连接,禁止禁止所有主机对198.78.46.8的www服务进行访问

6、下列那些SMTP命令是用来发送邮件的Envelop的?

7、下列关于信息安全保障的描述错误的是?

A、 信息安全保障的是核心业务,信息安全保障是为了支撑业务的正常运行

B、 信息系统安全的保障是在整个信息系统的生命周期中

C、 要确保信息系统的保密性、完整性、和可用性

D、 信息安全保障策略的制定没办法考虑到地震、海啸等大自然的不可抗力

8、下列对于下一代防火墙的描述错误的是?

A、 将访问控制对象从网络层、传输层延伸到应用层

B、 下一代防火墙能够识别应用和内容

C、 下一代防火墙可以限制用户是否能在上班时间访问娱乐社交软件

D、 下一代防火墙已经丢弃了传统防火墙的工作模式

9、下列关于KDC的描述错误的是?

A、 KDC是秘钥分发中心

B、 网络中所有客户机和服务器都信任KDC,并使用KDC验证用户身份

C、 KDC是由认证服务和票据授予服务组成

D、 认证服务的作用主要是生成两个主题之间通信的票据

10、下列哪项不是防火墙常见的工作方式?

11、下列选项中关于ACL规则的匹配原则描述不正确的是?

A、 防火墙安全规则遵循从上到下匹配的原则

B、 如果所有的规则都没有匹配到,数据包将被丢弃

C、 安全过滤规则只包含源、目的地址和端口

D、 防火墙安全规则匹配时一旦有一条匹配,剩余的都不再进行匹配

12、下列选项中关于防火墙的透明部署方式描述错误的是?

A、 内外网在一个网段内

B、 优点是直接串联到链路上,不改变原有的网络IP地址配置

C、 缺点是像玻璃一样,屋内屋外一览无余

D、 透明模式即用户可以访问到网络安全设备

A、 打开并监听本地端口31337,等待主机连接

D、 使用的是反向连接方式反弹shell

14、下列选项中最复杂的密码是____。

15、下列关于Netcat的操作的描述错误的是____。

A、 nc -G 追踪连接可用于网络排查

B、 -o 会将显示的内容输出到一个指定文件

C、 -h 打开nc的帮助文档

A、 打开并监听本地端口31337,等待主机连接

D、 使用的是反向连接方式反弹shell

17、下列哪些功能不是netcat能做到的?

A、 在两台主机之间通信

B、 在两台主机之间传输文件

D、 漏洞扫描以及利用

18、下面对于"nc 80"的描述错误的是?

A、 连接 开放的80端口

B、 可以获取一些关于主机的信息

C、 可以发送http请求包来访问网站

19、使用____命令检测目标主机的端口开放情况。

D、 扫描结果会包含主机操作系统信息

21、只进行主机存活探测,使用____命令。

22、密码术中永恒的两大原则是____。

23、下列关于DES算法描述不正确的是____。

C、 适用于加密大量数据的场合

D、 加解密的密钥相同

24、下列选项中不属于密码对信息的保护的是____。

25、下列____不属于单钥体制的密码系统。

}

== : 关系操作符, 比较的是两个变量本身的
equal:Object类中的方法,比较的是字符串中包含的内容是否相同

  • == 指的是两个对象或示例是否指向同一个内存空间,equals指的是两个对象或示例所指的内存空间的值是否相同
  • ==表示引用是否相同,equals表示是否相同

适用于存储少量数据,以key+value形式存储数据,存储的数据以xml文件的形式存储于设备

进程之间进行数据的共享,即跨进程通信

3、安卓服务启动的两种方式

3、服务和主进程关系的区别

startService在activity被终止后,服务依旧存在,用这个方法创建的服务是个单独的进程,占用一定资源
bindService:主进程被终止后,服务也会被终止掉

需求分析、原型设计、功能开发、产品测试、应用上架

10、线程优先级的理解

每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。
启动一个线程是调用start()方法 , run()方法是线程启动后要进行回调(callback)的方法。


蓝牙ble数据传输最大字节数20

<!--为适配安卓6.0以及以上版本需要添加一个模糊定位的权限 否则会出现无法搜索到设备的情况。-->

12、BLE低功耗蓝牙和传统蓝牙

蓝牙BLE低功耗蓝牙介绍:
蓝牙BLE相对于传统蓝牙的优点:最大化的待机时间、快速连接和低峰值的发送/接收功耗。

有关BLE低功耗蓝牙和传统蓝牙的五大区别:
1、低功耗蓝牙的发送和接受任务会以最快的速度完成,完成之后蓝牙BLE会暂停发射无线(但是还是会接受),等待下一次连接再激活;
传统蓝牙是持续保持连接。
2、低功耗蓝牙的广播信道(为保证网络不互相干扰而划分)仅有3个;传统蓝牙是32个。
3、低功耗蓝牙“完成”一次连接(即扫描其它设备、建立链路、发送数据、认证和适当地结束)只需3ms;传统蓝牙完成相同的连接周期需要数百毫秒。
4、低功耗蓝牙使用非常短的数据包,多应用于实时性要求比较高,但是数据速率比较低的产品,遥控类的如键盘,遥控鼠标,传感设备的数据发送,
如心跳带,血压计,温度传感器等;传统蓝牙使用的数据包长度较长,可用于数据量比较大的传输,如语音,音乐,较高数据量传输等。
5、低功耗蓝牙无功率级别,一般发送功率在+4dBm,一般在空旷距离,达到70m的传输距离;传统蓝牙有3个功率级别,Class1,Class2,Class3,
分别支持100m,10m,1m的传输距离。

13、异步消息处理机制

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同的线程之间交换数据。比如使用Message的what字段携带消息具体是
哪一条,用arg1和arg2字段来携带一些整形数据,使用obj字段携带一个Object对象。

Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用到Handler的sendMessage()方法,而发出的消息经过一

.MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。

着一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象。

15、安卓各个版本新特性以及有相关适配经验

一些权限6.0以后使用需要在代码中动态申请,例如:拍照、读写、定位等

  • JDK是面向开发人员使用的SDK
  • JRE是JAVA的运行环境,面向JAVA程序的使用者
  • JVM是Java虚拟机,是Java跨平台的核心部分,他的作用是将.class文件翻译给本地系统
  • ==:两个变量或者实例对应的内存空间是否相同。--------空间
  • equals:两个变量或者实例所对应的内存空间的值是否相同。------------值
    final修饰类的时候表示该类不能被集成 只能赋值一次,不能再改变

21、String 属于基础的数据类型吗?

22、java 中操作字符串都有哪些类?它们之间有什么区别?

24、如何将字符串反转?

25、String 类的常用方法都有那些?

26、抽象类必须要有抽象方法吗?

  • 抽象类不一定必须要抽象方法, 但有抽象方法的类一定是抽象类

27、普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以
  • 普通类能实例化,抽象类不能

28、抽象类能使用 final 修饰吗?

  • 抽象类的作用就是为了继承
  • 而final修饰的类是不能继承的

29、接口和抽象类有什么区别?

  • 构造参数:抽象类能有构造参数,而接口没有
  • main:抽象类能有main方法,并且可以运行,而接口不能
  • 实现数量:类可以实现多个接口,但只能继承一个抽象类
    字节流:以8位长度以字节为单位输出
    字符流:以16位长度一字符位单位输出
  • BIO:Block IO 同步阻塞式IO,即最传统方式的IO,特点是模式简单、使用方便,处理并发能力低
  • NIO:New IO 同步非阻塞IO,在BIO基础上的升级,客户端和服务端通过Channel(通道)通信,实现了多路复用

32、Files的常用方法都有哪些?

33、java 容器都有哪些?

  • Collection 是一个集合接口 它提供了对集合操作的通用接口方法
  • Collections是一个工具类 它提供了对集合操作的静态多态方法
    1、都实现了Map接口
  • 对元素进行插入删除等操作使用HashMap
  • 需要对有序的集合进行遍历则使用TreeMap
  • 基于哈希原理(Hashing):HashMap是基于哈希表的Map接口的非同步实现
  • 使用put()和get()方法来存储获取数据
  • 当get()对象是 通过键对象的equals()的方法找到正确的键值对,然后返回值对象
  • 基于HashMap实现,由哈希表支持
  • 实际上是一个HashMap实例
    ArrayList的底层数据结构是数组,支持随机访问,而LinkedList的底层数据结构是双向循环链表,不支持随机访问 ArrayList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后一次查询,所以LinkedList的效率较慢 ArrayList自由行低,需要手动设置固定大小容量,但它使用方便
    LinkedList的自由行较高,但是使用不方便

41、如何实现数组和 List 之间的转换?

  • Array能存放基本类型和对象,而ArrayList只能存放对象
  • Array指定大小后不可变,ArrayList指定大小后可变
  • Queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。
  • poll()获取元素失败时货返回null,remove()获取元素失败则会抛出异常

46、哪些集合类是线程安全的?

  • 迭代器Iterator是Java常用的一种设计模式
  • 它是一个对象,它能遍历并选择序列中的对象
  • 被称为“轻量级”对象,创建它的代价小

48、Iterator 怎么使用?有什么特点?

    (1)功能简单,只能单向移动
    (2)next():获取下一个元素
    (4)remove():移除迭代器新返回的元素
  • ListIterator功能比Iterator要多,例如:增加元素,替换元素,获取亲一个或后一个元素的索引等

49-1、怎么确保一个集合不能被修改?

50、并行和并发有什么区别?

你吃饭吃一半儿了电话来了,你吃完饭才去接电话,说明你既不支持并发也不支持并行
你吃饭吃一半儿了电话来了,你停下吃饭去接电话,说明你支持并发
你吃饭吃一半儿了电话来了,你一边吃饭一边接电话说明支持并行

    并发要求的是你有能处理多个问题的能力,不需要同时
    并行要求你能同属处理多个问题

51、线程和进程的区别?

进程=火车 线程=车厢

  • 一个进程可以包含多个线程(一个火车可以有多个车厢)
  • 不同进程间数据很难共享(不同火车间沟通不易)
  • 不同线程间数据共享很简单(同一列车上不同车厢进行沟通很简单)
  • 进程要比线程小号更多计算机资源
  • 进程间不会相互影响,但一个线程挂了有可能导致整个进程挂掉(一列火车着火了不会影响其他火车,但一节车厢着火了会导致整个火车毁掉)
  • 进程使用的内存地址可以上锁,即一个进程使用某些共享内存时,其他线程必须等它结束才能使用这一块儿(例如火车上的公共厕所)—互斥锁
  • 进程使用的内存地址可以限定使用量(即火车上的餐厅,同一时间段只允许多少人数使用,如果满了要等有人出来才能进去)–信号量

52、 守护线程是什么?

  • 一个服务线程,作用是服务其他线程

53、创建线程有哪几种方式?

有返回值的线程的循环变量主的值:0
有返回值的线程的循环变量主的值:99
子线程返回的值:100

  • JNI接口:实现了Java和其他语言的通信(例如C++、C)

56、线程有哪些状态?

  • 创建状态:在生成线程对象,但并没有调用start()方法的时候处于创建状态
  • 就绪状态:当线程对象调用了start()方法后,就进入了就绪状态,但此时线程调度程序还没把该线程设置为当前线程
  • 运行状态:当线程调度程序将处于就绪状态的线程设置为当前线程的时候就处于运行状态,此时运行run()方法
  • 阻塞状态:当线程运行中,被暂停,通常是为了等待某一时刻后再继续运行,sleep()、wait()方法都能使线程处于阻塞状态
  • 死亡状态:当一个线程run()方法运行结束或者直接调用了stop()方法后,线程就处于死亡状态,死亡后的线程无法通过start()方法重新唤醒
    sleep()后,没有释放同步锁
    wait()后,或释放同步锁 sleep():可以设定指定时间后自动醒来,如果要强行醒来需要使用interreput()

object类、对象唤醒线程

  • 两者都是object类提供的用于提醒处于等待该对象的线程的方法
  • notufy():唤醒一个等待该对象的线程
  • start()用来启动线程 ,线程处于可运行状态,真正实现了多线程运行,无需等待run方法执行完毕就可以执行下面的方法,轮到该线程执行时候会自动调用run方法
  • run()方法称为线程体,它包含了该线程要执行的方法,run()执行完毕后该线程终止
  • run()方法是单线程内的,不是多线程

59、创建线程池有哪几种方式?

 

  • 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小
 
  • 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务

60、线程池都有哪些状态?

  • RUNNING(Running):线程池的初始化状态,线程池一旦被创建就处于RUNNING状态,任务数0,接受新的任务,对已排队的任务进行处理

62、在 java 程序中怎么保证多线程的运行安全?

  • 1、原子性:一个或多个操作在CPU执行的过程中不被中断的特性
    2、可见性:一个线程对共享变量的修改,另外一个线程能立即看到
    3、有序性:程序执行的顺序按照代码的先后顺序来执行

  • 1、缓存导致的可见性的问题
    2、线程切换导致的原子性问题
    3、编译优化带来的有序性问题

63、多线程锁的升级原理是什么?

  • 在Java中锁共有四种状态:级别从低到高分别为:无锁状态,偏向锁,轻量级锁和重量级锁
    这几种状态会随着急症情况逐步升级
  • 死锁指两个或两个以上线程在执行过程中,由于资源竞争或者互相通信而造成的一种阻塞现象,若无外力作用,他们将一直阻塞下去,此时称系统处于死锁状态或系统产生了死锁
  • 使用tryLock设置超时时间,超时退出可以防止死锁
  • 尽量不要多个功能使用同一个锁
  • 尽量减少同步的代码块儿
  • ThreadLocal是一个数据结构,可以保存键值对,但一个ThreadLocal只能保存一对,并且各个线程互不干扰
    2、在线程级别传递信息 把获取日期转换的方法用在线程中


    1、原子性:原子性意味着不可分,即同一时刻只有一个线程能操作他
    2、可见性:在被synchronized修饰的代码块儿中,如果线程A执行结束,会强制将缓存内容更新到内存,并通知被synchronized修饰的线程X的值无效,需要重新读取,这样B线程在执行的时候就能读到线程A对线程X的修改了
    3、有序性:即同一时刻只有一个线程对该变量进行操作
  • volatile的本质在于告诉jvm当前变量在工作内存中的值是不确定的需要重新读取,synchronized是锁定当前变量,保证只有当前线程能访问该变量,其他线程别阻塞住
  • volatile只能使用在变量级别,synchronized能使用在变量,方法和类级别
  • volatile只能实现变量修改的可见性,不能保证其原子性,synchronized能保证伯娘修改的可见性和原子性
  • volatile标记的变量不会被编译器优化,synchronized标记的变量会被编译器优化
  • synchronized不需要用户手动去释放锁,而Lock若不手动释放可能会造成死锁现象
  • synchronized不能被中断,除非抛出异常或者运行完成,Lock可以通过设置tryLock()方法设置超时方法
  • synchronized是非公平锁,Lock默认非公平锁,可设置为公平锁
  • synchronized要么唤醒一个线程,要么唤醒所有线程,Lock可以实现精准唤醒
  • synchronized竞争锁的时候会一直等待,ReentrantLock可以尝试获取锁,并得到获取结果
  • 我们在使用多线程的时候,为了保证数据安全,会考虑使用同步的方法,通常我们会使用synchronized和Lock,但使用synchronized意味着内核态的一次切换,是比较重的操作,此时我们就可以使用
    atomic来进行轻量级的数据同步
    在多个线程下,当多个线程对同一变量进行操作是时,具有排他性,即同一时间只有一个线程能成功对变量进行操作,失败的线程会排队继续尝试,直至成功
  • java的反射机制是,在运行过程中对于任何一个类,都能知道他的所有属性和方法,对于任何一个对象,都能调用他的所有属性和方法,这种动态获取信息以及动态调用方法的方法叫做java的反射机制
  • 指程序可以访问、检测和修改它本身状态或行为的一种能力

73、什么是 java 序列化?什么情况下需要序列化?

  • 序列化:将Java对象转为字节流的过程
  • 返序列化:将字节流转化为java对象的过程
  • 使用情况:将java对象进行网络传输,或者保存本地文件的时候需要进行序列化

74、动态代理是什么?有哪些应用?

  • 当想要给实现了某个接口类中的方法加一些额外的处理,例如加日志和事务等,可以给这个类创建一个
    代理,即创建一个新的类,这类不仅包含原来类的所有方法,而且还在原来的基础上增加了额外处理的新类,这个代理类不是定义好的,是动态生成的,具有解耦意义,灵活,扩展性强

75、怎么实现动态代理?

76、为什么要使用克隆?

  • 想对一个对象进行处理,又要保留他的原始数据进行接下来的操作,这时候就需要使用克隆,java中克隆针对的是类的实例

77、如何实现对象克隆?

我们发现bean2变了,但是bean1也变了,这样并不能满足我们的需求,因此我们需要深克隆!!

(1)方法1、在克隆对象时候手动属性

78、深拷贝和浅拷贝区别是什么?

  • 浅拷贝:对象A1中有对B1的引用,B1中有对C1的引用,浅拷贝A1到A2,A2中依旧包含对B1的引用,B1中包含对C1的引用
  • 深拷贝:对象A1中有对B1的引用,B1中有对C1的引用,深拷贝A1到A2,A2中包含对B2(copy B1)的引用,B2中包含对C2(copy C1)的引用
  • 如果不对clone()进行重写则为浅拷贝
  • throw表示方法内抛出某种具体异常对象
  • 执行到throw语句后面的语句不再执行
  • throws 表示该方法可能抛出的所有异常信息,throws不处理异常,只上传,即谁调用谁处理
  • final-修饰符(关键字)
    final修饰类、方法、变量,不能被被继承,final修饰的类不能被继承,final修饰的变量不能被修改,final修饰的方法不能被重写
  • finally在异常处理中提供finally代码块儿来执行任何清除操作
    不管有没有异常抛出,finally块代码都会被执行
  • finalized是Object中的方法,在垃圾回收器回收该对象使用的内存之前被调用,即一个对象在被虚拟机宣告死亡前调用finalize方法,让她处理生前事
  • 会,会在return之前执行

83、常见的异常类有哪些?

  • NullPointerException:当应用程序试图访问空对象时,则抛出该异常。
  • SQLException:提供关于数据库访问错误或其他错误信息的异常。
  • IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
  • NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
  • FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。
  • IOException:当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
  • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。
  • ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。
  • IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
  • ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
  • SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。

84、http 响应码 301 和 302 代表的是什么?有什么区别?

  • 301:代表永久性转移
  • 302:代表暂时性转移
  • forward:直接转发 客户端和浏览器执法处一次请求
  • redirect:间接转发 实际是HTTP两次请求 服务器在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的
  • 间接转发:A找B借钱,B没有,让A去找C借
    直接转发:A找B借钱,B没有,B找C借,B借到借不到都会把信息传递给A
  • UDP是面向无线连接的通讯协议,UDP数据包括目的端口号和IP
    优点:操作简单,速度快,占用资源少,由于不需要连接,所以可以使用广播发送
    缺点:由于不建立连接,不确定数据是否被正确接收,也不重复发送,不可靠
  • TCP是面向连接的通讯协议,通过三次握手建立连接,通信完成后四次挥手
    优点:发送时能保证数据的正确性,可靠
    缺点:速度慢,占用资源多

88、tcp 为什么要三次握手,两次不行吗?为什么?

  • TCP是双全工的,即客户端再给服务端发信息的同时,服务端也在给客户端发信息

  • 半全工的意思是,A能给B发信息,B也能给A发信息,但是不能同时

  • 单工是指A和B之间的通信是单向的,即A能给B发,但B不能给A发,或者B能给A发,A不能对B发

  • 第一次握手:A跟B打电话问,你能听到我说话吗
    第二次握手:B收到A的信息,并回信息说我可以听到你说话
    第三次握手:A跟B说,可以,那我要开始向你发信息了
    经过三次握手,确认A能听到B说话,B能听到A说话,这样就能开始正常通信了

  • 由于TCP协议中,建立见连接后,AB双方谁都能先发送信息,所以只握手两次的话,无法确定A是否能听到B说话,会出现问题,但是四次的话,又会造成浪费

  • 正式情况下 三次握手都做了什么

  • B:好的,等我把最后一句说完

89、说一下 tcp 粘包是怎么产生的?

    发送方发送的数据在到达到接受方的缓存区时候,首尾相连,粘成一包,被接收 TCP协议默认Nagle算法可能会把多个数据包一次发送到接受方
    程序读取速度小于接收速度,缓存中 的多个数据包会被应用程序当成一个包一次读取 数据包增加开始符和结束符
    在数据包的头部定义数据包的长度,应用程序先读取长度,在读取改长度的数据,保证读取的整个包数据完整
  • ndk:安卓开发使用的一系列工具集合,使用C语言
  • sdk: 安卓软件开发工具包,使用Java语言

(1)地图:百度map,高德。

(3)聊天:环信、腾讯。

(4)第三方登陆:新浪,qq,微信等

(5)json解析:fastjson,速度最快,简单易用

90、OSI 的七层模型都有哪些?

  • OSI:开放式系统互联通信参考模型,是一种概念模型,有国际标准化组织提出,一个试图使各种计算机在世界范围内互联为网络的标准框架
  • OSI模型分为7层,从下往上分别为:物理层、数据链路层、网络层、传输层、会话层、表达层、应用层
    记忆方式:物数网传会表应
    get是向服务器传数据
    post是从服务器获取数据 get方法产生一个TCP数据包,post产生两个数据包
    对于get来说,将http header和data一起发送出去,服务器响应200(返回数据)
    对于post来说,先发送header 获取服务器100,在提交data,服务器响应200(返回数据)
    也就是说:get一趟就把数据送到了,post需要跑两趟,第一趟先去跟服务器打个招呼“嗨,我要给你送东西了,你打开门迎接我”,然后回去再把数据送来 get请求是把数据队列加到提交表单的ACTION属性所指的URL中,值和表单中的字段一一对应,在URL中可以看出
    post请求是通过Http post机制将变淡中各个字段和其内容放在HTML Header中一起传送到Action属性所指的URL地址,这个过程用户看不到
    因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
  1. GET与POST都有自己的语义,不能随便混用。
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

92、说一下你熟悉的设计模式?

    工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

93、简单工厂和抽象工厂有什么区别?

  • 简单工厂:用来生产同一等级结构中的任意产品(对于增加新产品无能为力)
  • 工厂方法:用于生产同一等级中的固定产品(支持增加任意产品)
  • 抽象工厂:用于生产不同产品族的全部产品(对于增加新产品无能为力,支持增加新产品族)

94、说一下 jvm 的主要组成部分?及其作用?

    负责加载class类信息,加载出的类信息存放在方法区中 存在于java堆外,直接向系统申请的内存空间,访问直接内存的速度会优于java堆,所以一些读写频繁的情况会选择使用直接内存。 会对堆、方法区、直接内存进行回收 会执行虚拟的的字节码,会使用及时编译技术将方法编译为机器码后再执行

95、说一下 jvm 运行时数据区?

    有的区域随着虚拟机的启动而存在,有的区域则依赖用户进程的启动和结束而创建和销毁

96、说一下堆栈的区别?

    (1)堆栈:是自动分配变量,以及函数调用时候所使用的空间
    (2)堆:是由malloc(动态内存分配)之类函数分配的空间所在地 (1)堆栈:地址方向是由高到低减少性扩展,有总长度大小限制
    (2)堆:地址方向是由低到高增加型扩展,没有总长度大小限制 (1)堆栈:由编译器释放
    (2)堆、由程序人员释放

97、队列和栈是什么?有什么区别?

  • 队列:是限定只能在表的一端进行插入,在另一端进行删除的线性表-------插入删除两头进行
  • 栈:是限定只能在表的一端进行插入和删除的线性表-------插入删除同端进行
  • (1)队列:基于地址指针进行遍历,而且可以从头开始遍历也可以从尾部开始遍历,但不能同时进行,无需开辟空间,因为遍历过程不改变数据结构,所以遍历速度要快
    (2)栈:只能从顶部取数据,即最先进入栈底的需要遍历整个队列才能取得,遍历数据时需要开辟临时空间,保持数据数据在遍历前的一致性

98、说一下类加载的执行过程?

  • 前言:一个Java文件从编译到最终执行完成一般要经历两个过程:
    (1)编译:即将我们写好的java文件通过javac命令编译成class文件
    (2)运行:即将编译好的class文件交给JVM(Java虚拟机)执行
    JVM 并不是一开始就把所有的类都加载进内存中,而是第一次遇到某个需要运行的类才会加载,且只加载一次
  • 而链接又可以分为三部分
    每一部分的详细解释清参照:

99、怎么判断对象是否可以被回收?

    为每个对象创建一个引用计数,当对象那个被引用时,计数器+1,释放时,计数器-1
    但这个方法存在一个问题,就是循环引用问题,所以发方法已被摒弃 从GC Roots开始向下搜索,搜索所走过的路径称为引用链。
    当一个对象到GC Roots没有任何引用链时,则认为此对象可以被回收。
    大家可以认为就是一个树的根节点开始计算引用情况。

100、java 中都有哪些引用类型?

    引用队列可以和软、弱、虚引用一起使用
    当垃圾回收器准备回收一个对象时候,如果发现他还在引用就会在这个对象回收之前将这个引用加入到与之关联的引用队列里面。程序可以通过判断引用队列中是否加入了引用,来判断对象是否将要被回收,这样就可以在被回收前采取一定的措施
    注意:虚引用必须和引用队列一起使用

101、说一下 jvm 有哪些垃圾回收算法?

102、说一下 jvm 有哪些垃圾回收器?

}

基本数据类型的==比较的值相等.
类的==比较的内存的地址,即是否是同一个对象,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。而equals()可以返回true或者false主要取决于重写实现,在不覆盖equals的情况下,同比较内存地址,原实现也为 == ,如String等重写了equals方法.
hashCode也是Object类的一个方法。返回一个离散的int型整数。在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等比较是否为同一个)

如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。

如果两个对象不equals,他们的hashcode有可能相等。

如果两个对象hashcode相等,他们不一定equals。

如果两个对象hashcode不相等,他们一定不equals。

String:字符串常量 不适用于经常要改变值得情况,每次改变相当于生成一个新的对象

4、什么是内部类?内部类的作用

内部类可直接访问外部类的属性
Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法, 不依赖外围类)

进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。
进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。
一个进程内可拥有多个线程,进程可开启进程,也可开启线程。
一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。

final:修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法不可重写
finalize:类的方法,垃圾回收之前会调用此方法,子类可以重写finalize()方法实现对资源的回收

Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量临时变量的生成,内部执行大量的i/o操作,效率很低。
Parcelable Android 序列化接口 效率高 使用麻烦 在内存中读写(AS有相关插件 一键生成所需方法) ,对象不能保存到磁盘中

8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

可继承 不可重写 而是被隐藏
如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。

9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法, 不依赖外围类)

使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
因为Java不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

11、哪些情况下的对象会被垃圾回收机制处理掉?

1.所有实例都没有活动线程访问。

2.没有被其他任何实例访问的循环引用实例。

3.Java 中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。

要判断怎样的对象是没用的对象。这里有2种方法:

1.采用标记计数的方法:

给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:

从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的

14、Java中实现多态的机制是什么?

重写Overriding是父类与子类之间多态性的一种表现

重载Overloading是一个类中多态性的一种表现.

16、说说你对Java反射的理解

JAVA反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意一个方法和属性。 从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性 Field[]、某个属性的完整信息、构造器 Constructors),调用类的属性或方法自己的总结: 在运行过程中获得类、对象、方法的所有信息。

17、说说你对Java注解的理解

元注解的作用就是负责注解其他注解。java5.0的时候,定义了4个标准的meta-annotation类型,它们用来提供对其他注解的类型作说明。

在源码中string是用final 进行修饰,它是不可更改,不可继承的常量。

19、String为什么要设计成不可变的?

字符串池是方法区(Method Area)中的一块特殊的存储区域。当一个字符串已经被创建并且该字符串在 池 中,该字符串的引用会立即返回给变量,而不是重新创建一个字符串再将引用返回给变量。如果字符串不是不可变的,那么改变一个引用(如: string2)的字符串将会导致另一个引用(如: string1)出现脏数据。

2、允许字符串缓存哈希码

在java中常常会用到字符串的哈希码,例如: HashMap 。String的不变性保证哈希码始终一,因此,他可以不用担心变化的出现。 这种方法意味着不必每次使用时都重新计算一次哈希码——这样,效率会高很多。

String广泛的用于java 类中的参数,如:网络连接(Network connetion),打开文件(opening files )等等。如果String不是不可变的,网络连接、文件将会被改变——这将会导致一系列的安全威胁。操作的方法本以为连接上了一台机器,但实际上却不是。由于反射中的参数都是字符串,同样,也会引起一系列的安全问题。

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)

由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快

List的特征是其元素以线性方式存储,集合中可以存放重复对象。

ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。

LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。

Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。

LinkedHashMap: 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

WeakHashMao :弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。

2、添加数据时扩容时的处理不一样,进行了new操作,重新创建对象,开销很大。ArrayMap用的是copy数据,所以效率相对要高。

3、ArrayMap提供了数组收缩的功能,在clear或remove后,会重新收缩数组,是否空间

HashSet实现了Set接口,HashSet仅仅存储对象,使用add()方法将元素放入set中,HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false。HashSet较HashMap来说比较慢。

HashSet不能添加重复的元素,当调用add(Object)方法时候,

首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。

(1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;

( 2 ) 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;

34、数组和链表的区别

数组:是将元素在内存中连续存储的;它的优点:因为数据是连续存储的,内存地址连续,所以在查找数据的时候效率比较高;它的缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低。

链表:是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据(就是通过存在元素的指针来联系)

35、开启线程的三种方式?

ava有三种创建线程的方式,分别是继承Thread类、实现Runable接口和使用线程池

36、线程和进程的区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

39、如何控制某个方法允许并发访问线程的个数?

semaphore.acquire() 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)

Java程序中wait 和 sleep都会造成某种形式的暂停,它们可以满足不同的需要。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。

等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。

调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。

唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。

42、什么导致线程阻塞?线程如何关闭?

阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。

一种是调用它里面的stop()方法

另一种就是你自己设置一个停止线程的标记 (推荐这种)

43、如何保证线程安全?

4###4、如何实现线程同步?

1、synchronized关键字修改的方法。2、synchronized关键字修饰的语句块3、使用特殊域变量(volatile)实现线程同步

46、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解

java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的

3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性

5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

ava在过去很长一段时间只能通过synchronized关键字来实现互斥,它有一些缺点。比如你不能扩展锁之外的方法或者块边界,尝试获取锁时不能中途取消等。Java 5 通过Lock接口提供了更复杂的控制来解决这些问题。 ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义且它还具有可扩展性。

53、死锁的四个必要条件?

系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。

  1. 进程运行推进顺序不合适

互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件: 若干进程间形成首尾相接循环等待资源的关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何让这四个必要条件不成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

死锁避免和死锁预防的区别:

死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。

56、什么是线程池,如何使用?

创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。

57、Java中堆和栈有什么不同?

为什么把这个问题归类在多线程和并发面试题里?因为栈是一块和线程紧密相关的内存区域。每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。

58、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。而线程间通信的方式有很多,比如广播,Eventbus,接口回掉,在Android中主要是使用handler。handler通过调用sendmessage方法,将保存消息的Message发送到Messagequeue中,而looper对象不断的调用loop方法,从messageueue中取出message,交给handler处理,从而完成线程间通信。

FixedThreadPool线程池是通过Executors的new FixedThreadPool方法来创建。它的特点是该线程池中的线程数量是固定的。即使线程处于闲置的状态,它们也不会被回收,除非线程池被关闭。当所有的线程都处于活跃状态的时候,新任务就处于队列中等待线程来处理。注意,FixedThreadPool只有核心线程,没有非核心线程。

CachedThreadPool线程池是通过Executors的newCachedThreadPool进行创建的。它是一种线程数目不固定的线程池,它没有核心线程,只有非核心线程,当线程池中的线程都处于活跃状态,就会创建新的线程来处理新的任务。否则就会利用闲置的线程来处理新的任务。线程池中的线程都有超时机制,这个超时机制时长是60s,超过这个时间,闲置的线程就会被回收。这种线程池适合处理大量并且耗时较少的任务。这里得说一下,CachedThreadPool的任务队列,基本都是空的。

ScheduledThreadPool线程池是通过Executors的newScheduledThreadPool进行创建的,它的核心线程是固定的,但是非核心线程数是不固定的,并且当非核心线程一处于空闲状态,就立即被回收。这种线程适合执行定时任务和具有固定周期的重复任务。

SingleThreadExecutor线程池是通过Executors的newSingleThreadExecutor方法来创建的,这类线程池中只有一个核心线程,也没有非核心线程,这就确保了所有任务能够在同一个线程并且按照顺序来执行,这样就不需要考虑线程同步的问题。

AsyncTask是Android本身提供的一种轻量级的异步任务类。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递给主线程更新UI。实际上,AsyncTask内部是封装了Thread和Handler。虽然AsyncTask很方便的执行后台任务,以及在主线程上更新UI,但是,AsyncTask并不合适进行特别耗时的后台操作,对于特别耗时的任务,个人还是建议使用线程池。

1、onPreExecute():该方法在主线程中执行,在执行异步任务之前会被调用,一般用于一些准备工作。

4、onPostExecute(Long aLong):在主线程中执行,在异步任务执行完毕之后,该方法会被调用,该方法的参数及为后台的返回结果。

除了这几个方法之外还有一些不太常用的方法,如onCancelled(),在异步任务取消的情况下,该方法会被调用。

直观来说,Binder是Android中的一个类,它实现了IBinder接口,从IPC的角度来说,Binder是Android中的一种跨进程通信的一种方式,同时还可以理解为是一种虚拟的物理设备,它的设备驱动是/dev/binder/。从Framework角度来说,Binder是ServiceManager的桥梁。从应用层来说,Binder是客户端和服务端进行通信的媒介。

我们先来了解一下这个类中每个方法的含义:

asInterface(android.os.IBinder obj):用于将服务端的Binder对象转换成客户端所需的AIDL接口类型的对象,这种转化过程是区分进程的,如果客户端和服务端位于同一个进程,那么这个方法返回的是服务端的stub对象本身,否则返回的是系统封装后的Stub.proxy对象。

flags),服务端通过code可以确定客户端所请求的目标方法是什么,接着从data中取出目标方法所需的参数,然后执行目标方法。当目标方法执行完毕后,就像reply中写入返回值。这个方法的执行过程就是这样的。如果这个方法返回false,客户端是会请求失败的,所以我们可以在这个方法中做一些安全验证。

Binder的工作机制但是要注意一些问题:1、当客户端发起请求时,由于当前线程会被挂起,直到服务端返回数据,如果这个远程方法很耗时的话,那么是不能够在UI线程,也就是主线程中发起这个远程请求的。

2、由于Service的Binder方法运行在线程池中,所以Binder方法不管是耗时还是不耗时都应该采用同步的方式,因为它已经运行在一个线程中了。

view的事件分发和view的工作原理

unSpecified:父容器不对view有任何限制,要多大有多大。一般系统用这个多。

Exactly:父容器已经检测出view所需要的精确大小,这个时候,view的大小就是SpecSize所指定的值,它对应者layout布局中的math_parent或者是具体的数值

对于viewGroup来说,除了完成自己的measure过程以外,还要遍历去调用子类的measure方法,各个子元素在递归执行这个过程,viewGroup是一个抽象的类,没有提供有onMeasure方法,但是提供了一个measureChildren的方法。measureChild方法的思想就是取出子元素的layoutParams,然后通过getChildMeasureSpec来常见子元素的MeasureSpec,然后子元素在电泳measure方法进行测量。由于viewGroup子类有不同的布局方式,导致他们的测量细节不一样,所以viewGroup不能象view一样调用onMeasure方法进行测量。

注意:在activity的生命周期中是没有办法正确的获取view的宽高的,原因就是view没有测量完。

普通的view的话,可以通过setFrame方法来的到view四个顶点的位置,也就确定了view在父容器的位置,接着就调用onLayout方法,该方法是父容器确定子元素的位置。

该方法就是将view绘制到屏幕上。分以下几步

由于手机硬件的限制,内存和CPU都无法像pc一样具有超大的内存,Android手机上,过多的使用内存,会容易导致oom,过多的使用CPU资源,会导致手机卡顿,甚至导致anr。我主要是从一下几部分进行优化:

布局优化,绘制优化,内存泄漏优化,响应速度优化,listview优化,bitmap优化,线程优化

1、删除无用的空间和层级。

绘制优化指view在ondraw方法中避免大量的耗时操作,由于ondraw方法可能会被频繁的调用。

1、ondraw方法中不要创建新的局部变量,ondraw方法被频繁的调用,很容易引起GC。

2、ondraw方法不要做耗时操作。

内存优化:参考内存泄漏。

响应优化:主线程不能做耗时操作,触摸事件5s,广播10s,service20s。

1、getview方法中避免耗时操作。

3、滑动不适合开启异步加载。

5、图片使用三级缓存。

2、不用的图片,及时recycler掉

线程优化的思想是使用线程池来管理和复用线程,避免程序中有大量的Thread,同时可以控制线程的并发数,避免相互抢占资源而导致线程阻塞。

1、少用枚举,枚举占用空间大。

3、适当的使用软引用和弱引用。

加密算法(base64、MD5、对称加密和非对称加密)和使用场景。

RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

1.随机选择两个大质数p和q,p不等于q,计算N=pq;

2.选择一个大于1小于N的自然数e,e必须与(p-1)(q-1)互素。

最终得到的N和e就是“公钥”,d就是“私钥”,发送方使用N去加密数据,接收方只有使用d才能解开数据内容。

RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。

使用场景:项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密。

 MD5英文全称“Message-Digest Algorithm 5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的,是一种单向加密算法,是不可逆的一种的加密方式。

MD5加密有哪些特点?

压缩性:任意长度的数据,算出的MD5值长度都是固定的。

容易计算:从原数据计算出MD5值很容易。

抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

HashMap是基于哈希表的map接口的非同步实现,它允许使用null值作为key和value。在Java编程语言中最基本的结构就是两种,一种是数组,另一种是模拟指针(引用)。所有的数据结构都可以用这两个基本的结构来构造,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构。即数组和链表的结合体。

HashMap底层就是一个数据结构,数组中的每一项又是一个链表。

HashMap在put时候,底层源码可以看出,当程序试图将一个key-value对象放入到HashMap中,首先根据该key的hashCode()返回值决定该Entry的存储位置,如果两个Entry的key的hashCode()方法返回值相同,那他们的存储位置相同,如果这两个Entry的key通过equals比较返回true,新添加的Entry的value将会覆盖原来的Entry的value,但是key不会被覆盖,反之,如果返回false,新添加的Entry将与集合中原有的Entry形成Entry链,新添加的位于头部,旧的位于尾部

利用key的hashCode重新hash计算出当前对象的元素在数组中的下标。
存储时如果出现hash值相同的key,分两种情况:1、如果key相同,则覆盖原来的值。2、如果key不同(出现冲突),则放在链表中。
获取时,直接找到hash值对应的下标,再进一步判断key是否相同,从而拿到对应的值。
Hashmap的核心就是使用数组进行存储,出现key冲突的时候,就存放在链表中。

3、Activity的启动过程(不要回答生命周期)

此处延伸:什么情况下用动态注册

Broadcast广播,注册方式主要有两种.
第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。

第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露
广播是分为有序广播和无序广播。

这两种方式都支持Https协议,都是以流的形式进行上传或者下载数据,也可以说是以流的形式进行数据的传输,还有ipv6,以及连接池等功能。HttpClient这个拥有非常多的API,所以如果想要进行扩展的话,并且不破坏它的兼容性的话,很难进行扩展,也就是这个原因,Google在Android6.0的时候,直接就弃用了这个HttpClient.

1、java虚拟机基于栈。 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多。
2、java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件)
1、dalvik虚拟机是基于寄存器的
2、Dalvik运行的是自定义的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据
3、常量池已被修改为只使用32位的索引,以 简化解释器。
4、一个应用,一个虚拟机实例,一个进程(所有android应用的线程都是对应一个linux线程,都运行在自己的沙盒中,不同的应用在不同的进程中运行。每个android dalvik应用程序都被赋予了一个独立的linux PID(app_*))

7、进程保活(不死进程)

此处延伸:进程的优先级是什么
当前业界的Android进程保活手段主要分为** 黑、白、灰 **三种,其大致的实现思路如下:
黑色保活:不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
白色保活:启动前台Service
灰色保活:利用系统的漏洞启动前台Service
所谓黑色保活,就是利用不同的app进程使用广播来进行相互唤醒。举个3个比较常见的场景:
场景1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒app
场景2:接入第三方SDK也会唤醒相应的app进程,如微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。由此发散开去,就会直接触发了下面的 场景3
场景3:假如你手机里装了支付宝、淘宝、天猫、UC等阿里系的app,那么你打开任意一个阿里系的app后,有可能就顺便把其他阿里系的app给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)
白色保活手段非常简单,就是调用系统api启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个app在运行着,哪怕当前的app退到了后台。如下方的LBE和QQ音乐这样:
灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到Notification),但你的进程优先级又是高于普通后台进程的。那么如何利用系统的漏洞呢,大致的实现思路和代码如下:
熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app。这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM

了解完 Low Memory Killer,再科普一下oom_adj。什么是oom_adj?它是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj的作用,你只需要记住以下几点即可:
进程的oom_adj越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收
有些手机厂商把这些知名的app放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通app一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。
所以,进程保活的根本方案终究还是回到了性能优化上,进程永生不死终究是个彻头彻尾的伪命题!

Context是一个抽象基类。在翻译为上下文,也可以理解为环境,是提供一些程序的运行环境基础信息。Context下有两个子类,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类, Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

  1. 队列先进先出,栈先进后出
  2. 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。
    如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
    如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
    在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

1、组合控件。这种自定义控件不需要我们自己绘制,而是使用原生控件组合成的新控件。如标题栏。
2、继承原有的控件。这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。
3、完全自定义控件:这个View上所展现的内容全部都是我们自己绘制出来的。比如说制作水波纹进度条。

第二步:OnLayout():确定View位置,进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数,将子View放在合适的位置上。

第三步:OnDraw():绘制视图。ViewRoot创建一个Canvas对象,然后调用OnDraw()。六个步骤:①、绘制视图的背景;②、保存画布的图层(Layer);③、绘制View的内容;④、绘制View子视图,如果没有就不用;
⑤、还原图层(Layer);⑥、绘制滚动条。

帧动画:指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。
补间动画:指通过指定View的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha、Scale、Translate、Rotate四种效果。注意:只是在视图层实现了动画效果,并没有真正改变View的属性,比如滑动列表,改变标题栏的透明度。
属性动画:在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。

15、Android中跨进程通讯的几种方式

intent:这种跨进程方式并不是访问内存的形式,它需要传递一个uri,比如说打电话。
contentProvider:这种形式,是使用数据共享的形式进行数据共享。

此处延伸:简述Binder

AIDL: 每一个进程都有自己的Dalvik VM实例,都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行着自己的操作,都在自己的那片狭小的空间里过完自己的一生。而aidl就类似与两个进程之间的桥梁,使得两个进程之间可以进行数据的传输,跨进程通信有多种选择,比如 BroadcastReceiver , Messenger 等,但是 BroadcastReceiver 占用的系统资源比较多,如果是频繁的跨进程通信的话显然是不可取的;Messenger 进行跨进程通信时请求队列是同步进行的,无法并发执行。

大角度来说为啥要用进程通讯:
进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
进程间,内核空间的数据可共享,所以内核空间 = 可共享空间 。

Android中主线程是不能进行耗时操作的,子线程是不能进行更新UI的。所以就有了handler,它的作用就是实现线程之间的通信。

(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。
(2)引起内存泄露的原因

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出通俗的讲就是内存不够用。
内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光
一、Handler 引起的内存泄漏。
解决:将Handler声明为静态内部类,就不会持有外部类SecondActivity的引用,其生命周期就和外部类无关,
如果Handler里面需要context的话,可以通过弱引用方式引用外部类
二、单例模式引起的内存泄漏。
三、非静态内部类创建静态实例引起的内存泄漏。
解决:把内部类修改为静态的就可以避免内存泄漏了
四、非静态匿名内部类引起的内存泄漏。
解决:将匿名内部类设置为静态的。
五、注册/反注册未成对使用引起的内存泄漏。
注册广播接受器、EventBus等,记得解绑。
六、资源对象没有关闭引起的内存泄漏。
在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放。
七、集合对象没有及时清理引起的内存泄漏。
通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。

App启动优化(针对冷启动)
App启动的方式有三种:
冷启动:App没有启动过或App进程被killed, 系统中不存在该App进程, 此时启动App即为冷启动。
热启动:热启动意味着你的App进程只是处于后台, 系统只是将其从后台带到前台, 展示给用户。

介于冷启动和热启动之间, 一般来说在以下两种情况下发生:

(1)过于复杂的布局.
(2)UI线程的复杂运算
(3)频繁的GC,导致频繁GC有两个原因:1、内存抖动, 即大量的对象被创建又在短时间内马上被释放.2、瞬间产生大量的对象会严重占用内存区域。

内存优化:参考内存泄露和内存溢出部分

API设计:App与Server之间的API设计要考虑网络请求的频次, 资源的状态等. 以便App可以以较少的请求来完成业务需求和界面的展示.
图片的Size:可以在获取图片时告知服务器需要的图片的宽高, 以便服务器给出合适的图片, 避免浪费.
网络缓存:适当的缓存, 既可以让我们的应用看起来更快, 也能避免一些不必要的流量消耗.

最终都是通过java层的createBitmap来完成的,需要消耗更多内存.
(2)图片进行缩放的比例,SDK中建议其值是2的指数值,值越大会导致图片不清晰。
(3)不用的图片记得调用图片的recycle()方法

  1. 通过WebView的loadUrl(),使用该方法比较简洁,方便。但是效率比较低,获取返回值比较困难。
  2. 通过WebView的evaluateJavascript(),该方法效率高,但是4.4以上的版本才支持,4.4以下版本不支持。所以建议两者混合使用。
  3. 通过WebView的addJavascriptInterface()进行对象映射 ,该方法使用简单,仅将Android对象和JS对象映射即可,但是存在比较大的漏洞。

漏洞产生原因是:当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类),从而进行任意代码执行。

垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象
,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能。

(1)不要在主线程中做耗时的操作,而应放在子线程中来实现。如onCreate()和onResume()里尽可能少的去做创建操作。
(3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
(4)service是运行在主线程的,所以在service中做耗时操作,必须要放在子线程中。

RecyclerView可以完成ListView,GridView的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平);
RecyclerView中view的复用不需要开发者自己写代码,系统已经帮封装完成了。
如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。
如果只是作为列表展示,则两者区别并不是很大。

  1. 图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中, 图片的中间缓冲数据也存放在本地堆内存, 所以, 应用程序有更多的内存使用, 不会因为图片加载而导致oom, 同时也减少垃圾回收器频繁调用回收 Bitmap 导致的界面卡顿, 性能更高。

  2. 渐进式加载 JPEG 图片, 支持图片从模糊到清晰加载。

  3. 图片可以以任意的中心点显示在 ImageView, 而不仅仅是图片的中心。

  4. JPEG 图片改变大小也是在 native 进行的, 不是在虚拟机的堆内存, 同样减少 OOM。

  5. 很好的支持 GIF 图片的显示。

  1. 框架较大, 影响 Apk 体积

3.默认实现多种内存缓存算法 这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。
4.支持本地缓存文件名规则定义

  1. 自带统计监控功能。支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。

2.支持优先级处理。每次任务调度前会选择优先级高的任务,比如 App 页面中 Banner 的优先级高于 Icon 时就很适用。

3.支持延迟到图片尺寸计算完成加载

4.支持飞行模式、并发线程数根据网络类型而变。 手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数,比如 wifi 最大并发为 4,4g 为 3,3g 为 2。 这里 Picasso 根据网络类型来决定最大并发数,而不是 CPU 核数。

5.“无”本地缓存。无”本地缓存,不是说没有本地缓存,而是 Picasso 自己没有实现,交给了 Square 的另外一个网络库 okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。

  1. 不仅仅可以进行图片缓存还可以缓存媒体文件。Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video,所以更该当做一个媒体缓存。

  2. 内存友好。Glide 的内存缓存有个 active 的设计,从内存缓存中取数据时,不像一般的实现用 get,而是用 remove,再将这个缓存数据放到一个 value 为软引用的 activeResources map 中,并计数引用数,在图片加载完成后进行判断,如果引用计数为空则回收掉。内存缓存更小图片,Glide 以 url、view_width、view_height、屏幕的分辨率等做为联合 key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小与 Activity/Fragment 生命周期一致,支持 trimMemory。图片默认使用默认 RGB_565 而不是 ARGB_888,虽然清晰度差些,但图片更小,也可配置到 ARGB_888。

start()方法是用来启动新创建的线程,而start()内部调用了run()方法,这和直接调用run()方法是不一样的,如果直接调用run()方法,
则和普通的方法没有什么区别。

1、final变量即为常量,只能赋值一次。
2、final方法不能被子类重写。
3、final类不能被继承。

1、static变量:对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,
在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。

static代码块是类加载时,初始化自动执行的。

static方法可以直接通过类名调用,任何的实例也都可以调用,因此static方法中不能用this和super关键字,
不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

5、Java中重载和重写的区别:
1、重载:一个类中可以有多个相同方法名的,但是参数类型和个数都不一样。这是重载。
2、重写:子类继承父类,则子类可以通过实现父类中的方法,从而新的方法把父类旧的方法覆盖。

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。

7、Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议?
从下到上:物理层->数据链路层->网络层->传输层->应用层
其中tcp/ip位于模型中的网络层,处于同一层的还有ICMP(网络控制信息协议)。http位于模型中的应用层
由于tcp/ip是面向连接的可靠协议,而http是在传输层基于tcp/ip协议的,所以说http是可靠的数据传输协议。

8、HTTP链接的特点
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。
从建立连接到关闭连接的过程称为“一次连接”。

tcp是面向连接的,由于tcp连接需要三次握手,所以能够最低限度的降低风险,保证连接的可靠性。
udp 不是面向连接的,udp建立连接前不需要与对象建立连接,无论是发送还是接收,都没有发送确认信号。所以说udp是不可靠的。
由于udp不需要进行确认连接,使得UDP的开销更小,传输速率更高,所以实时行更好。

10、Socket建立网络连接的步骤
1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。注意:客户端的套接字必须描述他要连接的服务器的套接字,
指出服务器套接字的地址和端口号,然后就像服务器端套接字提出连接请求。
3、连接确认:当服务器端套接字监听到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述
发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务端套接字则继续处于监听状态,继续接收其他客户端套接字的连接请求。

}

我要回帖

更多关于 线程 进程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信