前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >码仔精心整理的“70道”常问面试题

码仔精心整理的“70道”常问面试题

作者头像
用户1564362
发布2019-09-02 17:38:06
5140
发布2019-09-02 17:38:06
举报
文章被收录于专栏:飞总聊IT飞总聊IT

01

谈谈对命令模式的理解

将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

何时使用:

  • 程序需要在不同的时刻指定、排列和执行请求。
  • 程序需要提供撤销操作。
  • 程序需要支持宏操作。

优点:

  • 在命令模式中,请求者(Invoker)不直接与接受者(Receiver)交互,及请求者(Invoker)不包含接受者(Receiver)的引用,因此彻底消除了彼此间的耦合。
  • 命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有具体命令和接收者,新增加的调用者就可以使用已有的具体命令。
  • 由于请求者的请求被封装到具体的命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
  • 使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。

一个对象有多种操作,但是我们不希望调用者(请求者)直接使用,我们就额外添加一个对象,然后让调用者通过这个对象来使用那些操作。比如,我们有一个类可以在磁盘上新建或是删除文件(接收者),但是我们不希望直接提供给别人(请求者)使用,所以我们就为它的各种操作创建对应的命令

代码语言:javascript
复制
//接收者
public class MakeFile {
   //新建文件
   public void createFile(String name) throws IOException{
     File file = new File(name);
     file.createNewFile();
  }
   //删除文件
   public boolean deleteFile(String name){
     File file = new File(name);
     if(file.exists()&&file.isFile()){
       file.delete();
     return true;
  }
      return false;
  }
}
代码语言:javascript
复制
//命令接口
public interface Command {
   void execute(String name) throws Exception;
}
代码语言:javascript
复制
//新建文件命令
public class CommandCreate implements Command {
   MakeFile makeFile;
   public CommandCreate(MakeFile makeFile) {
     this.makeFile = makeFile;
  }
   @Override
   public void execute(String name) throws Exception {
     makeFile.createFile(name);
  }
}
代码语言:javascript
复制
//删文件命令
public class CommandDelete implements Command{
   MakeFile makeFile;
   public CommandDelete(MakeFile makeFile) {
     this.makeFile = makeFile;
  }
   @Override
   public void execute(String name) throws Exception {
     makeFile.deleteFile(name);
  }
}
代码语言:javascript
复制
//请求者
public class Client {
  Command command;
   public Client setCommand(Command command){
     this.command = command;
     return this;
  }
   public void executeCommand(String name) throws Exception{
     if(command==null)
     throw new Exception("命令不能为空!");
     command.execute(name);
  }
}
代码语言:javascript
复制
public class Test {
 public static void main(String args[]) throws Exception{
   //接收者
  MakeFile makeFile = new MakeFile();
   //命令
  CommandCreate create = new CommandCreate(makeFile);
  CommandDelete delete = new CommandDelete(makeFile);
   //请求者
  Client client = new Client();
  //执行命令
  client.setCommand(create).executeCommand("d://test1.txt");
  client.setCommand(create).executeCommand("d://test2.txt");
  client.setCommand(delete).executeCommand("d://test2.txt");
  }
}//执行完后在D盘会有一个test1.txt的文件,test2.txt本页创建了,不过又被删除了

命令模式不宜滥用,比如:使用这种模式,会多出来很多对象(命令)。

02

简述TCP和UDP的区别

tcp 和 udp 是 OSI 模型中的运输层中的协议。tcp 提供可靠的通信传输,而 udp 则常被用于让广播和细节控制交给应用的通信传输。

两者的区别大致如下:

  • tcp 面向连接,udp 面向非连接即发送数据前不需要建立链接;
  • tcp 提供可靠的服务(数据传输),udp 无法保证;
  • tcp 面向字节流,udp 面向报文;
  • tcp 数据传输慢,udp 数据传输快;

03

Android网络数据的加密方式

对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。

非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。

04

Http和Https的区别

HTTP超文本传输协议(HyperText Transfer Protocol),是目前互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。现在主要是一个客户端和服务器端请求和应答的标准(TCP),但是正在被HTTPS取代。

HTTPS安全套接字层超文本传输协议(Hyper Text Transfer Protocol over Secure Socket Layer)或超文本传输安全协议(Hypertext Transfer Protocol Secure),由网景公司(Netscape)于1994年创建的,是以安全为目标的HTTP通道。简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

主要区别:

  1. URL:http 一般以http:// 开头,https以https:// 开头。
  2. 证书:http不需要证书;https需要到ca申请证书,一般免费证书很少,所以需要一定费用。
  3. 安全:http信息是明文传输;https 则是具有安全性的ssl加密传输协议。
  4. 端口:http 默认端口是80;https是443。
  5. 连接:http 的连接很简单,是无状态的;https协议是由SSL+http协议构建的可进行加密传输、身份认证的网络协议,所以首次建立连接会慢一些,但是比http协议安全。

附:https优缺点:

优点:

  1. 通过证书可以更信任服务器。
  2. 更安全,防篡改。

缺点:

  1. https 需要证书。
  2. 因为对传输进行加密,会一定程度增加cpu消耗。
  3. 由于https 要还密钥和确认加密算法的需要,所以首次建立连接会慢一些。
  4. 带宽消耗会增加,服务端压力大。

进阶Http:https://mp.weixin.qq.com/s/3TaonTzAsqqLLbJ-yrwNdw

进阶Https:https://mp.weixin.qq.com/s/lCr7NuQNLQh4Ake8yXorxg?scene=25#wechat_redirect

05

简述apk打包流程

  1. 打包资源文件,生成R.java文件 输入:res文件,Assets文件,AndroidManifest.xml文件,Android基础类库(Android.jar文件) 输出:R.java,resources.arsc 工具:aapt 工具位置:SDK\build-tools\29.0.0\aapt.exe
  2. 处理aidl文件,生成相应java文件 输入:源码文件,aidl文件,framework.aidl文件 输出:对应的.java文件 工具:aidl工具 工具位置:SDK\build-tools\29.0.0\aidl.exe
  3. 编译工程源代码,生成相应class文件 输入:源码文件(包括R.java和AIDL生成的.java文件),库文件(jar文件) 输出:.class文件 工具:javac工具 工具位置:Java\jdk1.8.0_201\bin\javac.exe
  4. 转换所有class文件,生成classes.dex文件 输入:.class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件) 输出:.dex文件 工具:javac工具 工具位置:Java\jdk1.8.0_201\bin\javac.exe
  5. 打包生成apk文件 输入:打包后的资源文件,打包后类文件(.dex文件),libs文件(包括.so文件) 输出:未签名的.apk文件 工具:apkbuilder.bat工具已废弃,改为sdklib.jar工具 工具位置:E:\SDK\tools\lib\sdklib.jar
  6. 对apk文件进行签名 输入:未签名的.apk文件 输出:签名的.apk文件 工具: jarsigner工具 apksigner工具 工具位置: Java\jdk1.8.0_201\bin\jarsigner.exe SDK\build-tools\29.0.0\lib\apksigner.jar
  7. 对签名后的apk文件进行对齐处理 输入:签名后的.apk文件 输出:对齐后的.apk文件 工具:zipalign工具 工具位置:SDK\build-tools\29.0.0\zipalign.exe

注:工具位置基于win平台. 参考连接:

https://developer.android.com/studio/build/index.html?hl=zh-cn#build-processhttps://blog.csdn.net/jiangwei0910410003/article/details/50402000

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 飞总聊IT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 谈谈对命令模式的理解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档