做完了一套京东的笔试,感觉复习的太不到位了,做真题才是查漏补缺的神器啊

京东2019面试题错题知识点:

各种设备分别工作的层

物理层:中继器、集线器
数据链路层:网桥、交换器
网络层:路由器
网络层以上:网关

小顶堆相关

待复习

排序方法和各种特点

待复习

哈夫曼树构造及求带路径长

例题:
假如给定如下5个权值:

求哈夫曼编码和最小带权路径和

我们根据上面图可以得到各叶子节点的赫夫曼编码如下:
权值为5的节点的赫夫曼编码为:11
权值为4的节点的赫夫曼编码为:10
权值为3的节点的赫夫曼编码为:00
权值为2的节点的赫夫曼编码为:011
权值为1的节点的赫夫曼编码为:010

最小带权路径长度(左图):WPL=23+31+32+24+2*5=33

交换方式

打电话使用的数据传输方式是电路交换,手机上网使用的数据传输方式是分组交换

  • 电路交换有预留,且分配一定空间,提供专用的网络资源,提供有保证的服务,应用于电话网;
  • 分组交换无预留,且不分配空间,存在网络资源争用,提供有无保证的服务。分组交换可用于数据报网络和虚电路网络。我们常用的Internet就是数据报网络,单位是Bit。

滑动窗口协议

滑动窗口协议有

  1. 停止等待协议,发送窗口=1,接受窗口=1;
  2. 退后N帧协议,发送>1,接收=1;
  3. 选择重传协议,发送>1,接收>1;

TCP/IP的四次挥手

TCP拥塞控制的方法

  • 慢开始:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小
  • 拥塞避免:防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载
  • 快重传:当发送方连续收到了3个重复的确认响应的时候,就判断为传输失败,报文丢失,这个时候就利用快重传算法立即进行信息的重传。
  • 快恢复 :与快重传配合使用,当发送方接收到连续三个重复确认请求,为了避免网络拥塞,执行拥塞避免算法

TCP如何保证可靠传输的

  • 校验和
  • 流量控制
  • 拥塞控制

软连接特性

  • 软链接有自己的文件属性及权限等;
  • 可对不存在的文件或目录创建软链接;
  • 软链接可交叉文件系统;
  • 软链接可对文件或目录创建;
  • 创建软链接时,链接计数 i_nlink 不会增加;
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling
    link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

Ext3文件系统的特点

  • 高可用性:系统使用了ext3文件系统后,即使在非正常关机后,系统也不需要检查文件系统。
  • 数据的完整性:避免了意外宕机对文件系统的破坏。
  • 文件系统的速度:因为ext3的日志功能对磁盘的驱动器读写头进行了优化。所以,文件系统的读写性能较之Ext2文件系统并来说,性能并没有降低。
  • 数据转换 :“由ext2文件系统转换成ext3文件系统非常容易。
  • 多种日志模式

环境变量相关的命令

  • export 用于修改环境变量
  • cat 命令用于连接文件并打印到标准输出设备上。
  • echo命令:显示文字并给文字添加颜色
  • env 用于创建环境变量

数据库的范式

  1. 第一范式(1NF)

指数据库表的每一列(即每个属性)都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。简而言之,第一范式就是无重复的列。

  1. 第二范式(2NF)

第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。
第二范式(2NF)要求实体的属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
简而言之,第二范式就是非主属性依赖于主关键字。

3 . 第三范式(3NF)

在满足第二范式的基础上,切不存在传递函数依赖,那么就是第三范式。
简而言之,第三范式就是属性不依赖于其它非主属性。

Mysql的MyIsam引擎的特性

MyISAM特性:

  1. 不支持事务、不具备AICD特性(原子性、一致性、分离性、永久性);
  2. 表级别锁定形式(更新数据时锁定整个表、这样虽然可以让锁定的实现成本很小但是同时大大降低了其并发的性能);
  3. 读写相互阻塞(不仅会在写入的时候阻塞读取、还会在读取的时候阻塞写入、但是读取不会阻塞读取);
  4. 只会缓存索引(myisam通过key_buffer_size来设置缓存索引,提高访问性能较少磁盘IO的压力、但是只缓存索引、不缓存数据);
  5. 读取速度快、占用资源比较少;
  6. 不支持外键约束、只支持全文检索;
  7. 是MySQL5.5.5版本之前的默认存储引擎

Mysql索引最左匹配原则

最左边开始匹配。

KEY idx_com1 on user(name, age, address);

联合索引 idx_com1 实际建立了(name)、(name, age)、(name, age, address)三个索引,只要包含三个中任意一个都算是使用了索引 idx_com1

truncate table和delete的区别

  • 同:
    • truncate table与delete都是删除表数据,保留表结构
    • truncate table 在功能上与不带 WHERE 子句的 delete语句相同:二者均删除表中的全部行。
  • 不同:
    • truncate 比 delete(一行一行的删)速度快,且使用的系统和事务日志资源少。
    • truncate 操作后的表比Delete操作后的表要快得多。如果有ROLLBACK命令Delete将被撤销,而 truncate
      则不会被撤销。
    • truncate当表被清空后表和表的索引重新设置成初始大小,而delete则不能。

如果删除表结构及其数据,用 drop table 语句。
执行速度,一般来说: drop> truncate > delete。

几种易于混淆的设计模式

  • 备忘录模式:适用于恢复某个类的先前状态,有点类似于快照这类型功能。
  • 原型模式:通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。
  • 状态模式:当一个对象,它具有很多种状态的,需要进行繁琐复杂的逻辑处理时,我们可以利用状态模式,将对象的各种状态进行类的封装,用于避免if
    else过于繁琐的情况。
  • 命令模式:是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
  • 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 适配器模式:将一个类的接口转换成另外一个客户希望的接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  • 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  • ***模式:为其他对象提供一种***,以控制对这个对象的访问。

ClassLoader和Clazz.ForName加载类区别

  • ClassLoader加载类只加载不进行初始化
  • Clazz.ForName加载类的同时会执行类的初始化方法

ArrayList的扩容规则

初始化为10,每次扩容增量为之前的50%

10->15->22->33->49->73->109

Object类由哪些方法

Object是所有类的父类,任何类都默认继承Object。Object类到底实现了哪些方法?

  1. clone方法
    保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

  2. getClass方法
    final方法,获得运行时类型。

  3. toString方法
    该方法用得比较多,一般子类都有覆盖。

  4. finalize方法
    该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

  5. equals方法
    该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。

6.hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

  1. wait方法
    wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

(1)其他线程调用了该对象的notify方法。

(2)其他线程调用了该对象的notifyAll方法。

(3)其他线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

  1. notify方法
    该方法唤醒在该对象上等待的某个线程。

  2. notifyAll方法
    该方法唤醒在该对象上等待的所有线程

线程池初始化参数

求线程池executor在空闲状态下的线程个数:

public class Main {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 15, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy());
    }
}

前三个参数:核心线程有5个,最大线程数是10个,keepAliveTime是15s,如果线程池中的线程大于5,那么超15s的空闲线程就会被结束,也就是说,一定会保持5个线程不会被结束。当所有任务完成后,会保持5个空闲的线程

Bash编程中的运算法

  • EQ 就是 EQUAL等于
  • NE就是 NOT EQUAL不等于
  • GT 就是 GREATER THAN大于
  • LT 就是 LESS THAN小于
  • GE 就是 GREATER THAN OR EQUAL 大于等于
  • LE 就是 LESS THAN OR EQUAL 小于等于

Bash命令

  • $0
    Shell本身的文件名
  • $!
    Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
  • $?
    最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
  • $#
    添加到Shell的参数个数