Java 笔试选择题知识点记录【elm-0821】

中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

举一个用户在聊天室聊天的简单例子。

原始版本
public class Main{
  public static void main(String[] args) {
	User lucy = new User();
	User lily = new User();

	lucy.send("hello, I am Lucy", lily);
	lily.send("hello, I am Lily", lucy);
  }
}

当群聊的人数增多,上面第 6 行和第 7 行需要指定对象的实现方式会变得非常麻烦,每次都需要确定全部消息发送对象。

中介者模式版本

新建 ChatRoom 类,在 User 类中调用 ChatRoom。

public class ChatRoom {
   public static void showMessage(User user, String message){
      System.out.println(new Date().toString() + " [" + user.getName() +"] : " + message);
   }
}

public class User {
  public void send(String message){
      ChatRoom.showMessage(this,message);
   }
}

public class Main{
  public static void main(String[] args) {
	User lucy = new User();
	User lily = new User();

	lucy.send("hello, I am Lucy");
	lily.send("hello, I am Lily");
  }
}

度数为3的树

结点拥有的子树个数称为结点的度,比如结点①的度为4,结点②的度为0,结点③的度为3。

对于树而言,树的度为树内各结点最大的度,从图中可知,结点①的度是最大的,为4,所以这棵树的度为4。

进程:计算时间与IO时间决定优先级

举个例子:

正确答案是 P3>P2>p1。

原因是同一时刻,只能执行一个 I/O 操作,如果已经有 I/O 了,那新进程的 I/O 将要延时。计算进程会占用大量的cpu时间,而i/o大的会占用较少的cpu资源,相当于短作业,所以应该优先权更高。

abcde出现的次数分别是25 22 15 7 16,根据哈夫曼编码,求 WPL

首先构造哈夫曼树。将出现次数由小到大依次排序,

d c e b a

7 15 16 22 25

选择出现次数最小的两个节点 d 和 c 构成一颗子树,出现次数加起来是 22。因为 b 和 dc 出现的次数都是 22,所以接下来有两种方式,第一种是选择 e 和 b 构成子树,第二种是选择 e 和 dc 构成子树。这里以 e b 作为子树来举例

e b dc a

16 22 22 25

接下来就是

dc a eb

22 25 38

接下来就是

eb dca

38 47

最终变成根节点

ebdca

85

所以,根据上面这个图,哈夫曼编码可以是:

上图我是根据“左分支为0,右分支为1”的策略定的,其它策略也是可以的,比如“某个节点的左分支为1,右分支为0”都是可以的。

如何计算 WPL?

树的路径长度是从树根到每一结点的路径长度之和。

在本例中:

树的路径长度
= sum(每个编码的长度 * 出现次数) 
= e 编码的长度 * 出现次数 + b 编码的长度 * 出现次数 + d 编码的长度 * 出现次数 + c 编码的长度 * 出现次数 + a 编码的长度 * 出现次数
= 2 * 16 + 2 * 22 + 3 * 7 + 3 * 15 + 2 * 25
= 192

Linux 命令输出文件的第 5 行

cat:cat 文件名 | sed -n '5p' 【5 表示匹配第五行,p 表示打印】

awk:awk 'NR == 5' 文件名 【在 awk 中,NR 是一个内置变量,表示当前处理的行号(行数)。awk 'NR == 5' 的含义是匹配行号为 5 的行。】

tail:tail -n +5 文件名 | head -n 1 【tail -n +5 文件名表示从第五行开始打印,head -n 1 表示从第一行开始打印】

Cookie 和 Session 的区别

  • 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
  • 存取方式的不同,Cookie只能保存 ASCII,Session可以存任意数据类型,比如UserId等。
  • 有效期不同,Cookie可设置为长时间保持,比如默认登录功能功能,Session一般有效时间较短,客户端关闭或者Session超时都会失效。
  • 隐私策略不同,Cookie存储在客户端,信息容易被窃取;Session存储在服务端,相对安全一些。
  • 存储大小不同, 单个Cookie 保存的数据不能超过 4K,Session可存储数据远高于Cookie。

数据库主键多对多的关系可以拆分成两个一对多的表吗?

可以的。将多对多的关系拆分成两个一对多的表是一种常见的数据库设计方法,通常使用一个中间表来实现。

假设有两个实体A和B之间存在多对多的关系,那么可以创建以下三个表:

  1. 表A:包含实体A的信息和主键。
  2. 表B:包含实体B的信息和主键。
  3. 中间表AB关联表:该表包含两个外键,分别指向表A和表B,同时也可以包含其他与这两个实体相关的信息。

中间表的作用是将多对多的关系拆分成两个一对多的关系。

Java 后端笔经 文章被收录于专栏

Java 后端笔试经验

全部评论

相关推荐

点赞 3 评论
分享
牛客网
牛客企业服务