【2019春招准备:0.什么是面试——前Google校招命题组成员解读】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33907408/article/details/85339106

技术之瞳——阿里笔试校招

非常重视基础(项目不会看中,因为都懂是怎么肥四)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

code.google.com/codejam/contest/

操作系统

进程线程:了解面试者的侧重点,可以进一步展开
逻辑内存(32,64位):32位每个进程都有自己的4G的内存寻址空间
进程之间相互独立,不可能更改一下指针,就能访问别人(另外一个进程的数据),界限很明确
但是文件和网络句柄是公用的,所有的进程都能打开相同的文件。。。

线程:调用栈,pc(program counter) 下一条指令执行的地址,指向内存
进程只是容器,线程才是真正运行的worker
TLS:Thread local storage(线程独立的内存)

相对而言,进程的通信会难一点,线程因为共享内存会简单很多

存储由快到慢,谷歌是基于内存的搜索引擎,花费巨大
在这里插入图片描述
寻址空间:和机器上面装了多少的物理内存没有关系,和此时有多少个进程也没有关系,每一个进程有自己独立的寻址空间
64JVM,可以使用更大的内存

int n=*p; -----> 汇编:MOV EAX, [EBX]将ebx寄存器中指向的空间内的数字,赋值给eax
指针p寻址的空间和机器的物理内存没有关系,只是和操作系统的位数有关系(这里就是逻辑内存了,逻辑内存是进程独立的),将逻辑内存和实际内存的地址建立映射关系就可以找到需要的数据了。
因为操作系统有可能是64位,因此不一定上一步能够完全对应起来,逻辑内存过大了,因此引申出一个新的概念:分页(虚拟内存)放在硬盘
虚拟内存只需要将p(是一个地址,还没有找到他并读取他的内容)所在的分页发送到物理内存上,发送之后并不是完全覆盖,而是通过置换算法,将长时间不用的数据置换出来
最后将找出来的p指向的数据放到寄存器中
运行良好的程序,基本大部分请求访问的数据都会在内存中,不然会发生频繁的分页,会严重影响性能

网络

如何在一个不可靠不安全的通道上进行安全可靠的通信:七层架构
在这里插入图片描述
为什么要这么设计呢?为什么一开始解决的试手就不能设计一个安全而可靠的数据传输通道呢,不然就不用7层协议来支撑了
往往这类问题不是这个考点,而是问基于历史发展,产生了什么问题,每一层又解决了什么问题

网络传输中的不可靠现象:

  • 丢包,重复包()
  • 出错(重传)
  • 乱序(TCP)

网络比电话更不安全,任何一个中间节点都能被监听,而电话交换机都是在统一的机房里面。

安全问题的解决手段之一:滑动窗口
tcp协议中使用
维持发送方和接收方的缓冲区
1.原型:发送包1,确认接收到包1,发送包2,确认接受到包2…但是这样网络吞吐量非常低
2.改进:发送12,确认12(那么每次发送多少的包呢?)
3.final:(滑动窗口)
在这里插入图片描述
11-16可能该没有读进内存,123可能已经移出了内存
ack会按照顺序,就算后面的包已经收到了,但是前面的没有ack不能ack后面的
在这里插入图片描述
在这里插入图片描述
5号包一直没有ack,超时重传时候,5678很快就划过去了,以为678等待太久了,很心急
在这里插入图片描述

wireshark网络抓包(hin重要,另外总结)

数据库

基于关系代数理论(5范式)
表结构不直观,实现复杂,速度慢;健壮性高(现在这方面需求不大,因为分布式结构流行)
事物:ACID i(ISOLATION)是事物的隔离级别
不需要写业务代码,直接写sql模拟真实的场景
在这里插入图片描述
如果不想被打断(就是操作的和读到的不同),可以加强隔离级别:
在这里插入图片描述

程序设计基础

c#(microsoft)社区不够,支持有限
编程范式:面向过程(c,visual basic)面上对象,函数式(haskell,erlang)
java数据类型
boolean byte char2字节(unicode), short int32 long64 float double
String Enum Array

java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。
java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。
UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。
UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。

64位double ±10^308
但是精度有限 不可以a==b,在运算的时候会自动修改精度,差的绝对值
在这里插入图片描述
valueOf是系统分配的箱子(boxing)
Integer.valueOf(1000)!=Integer.valueOf(1000)对小(-128到127)的可以 大的就new一个箱子

编码技巧

重点:递归控制,循环控制,边界控制,数据结构(树)
可能是记事本 word文档(要先思考再写,鼓励修改和重写)
一般5-10行,比较难的20行
在这里插入图片描述
层数太大会stack overflow

循环不变式 loop inviariant

类和对象

在这里插入图片描述
接口没有成员变量
java interface ==c++ 纯虚函数的类

比较接口(interface)和抽象类(abstract class):
接口的函数不能实现,但是class的函数必须实现。在abstract class中可以选择和普通class一样去实现它,也可以在函数前面加上abstract关键字,选择不实现。
抽象类可以有成员变量,可以有部分的实现。
抽象类不能多重继承(extends),接口可以多重实现(implements)
有了比较灵活的抽象类为什么还需要定义接口呢?因为从用户的角度来说并不清楚抽象类是定义一个合约,还是说已经有简单的实现了。接口用来强调合约性质。(编译器强制使用的时候格式不能犯错)

MyLinkedList implements Iterator接口

继承封装和多态
继承:is a 关系,子类增加或者修改基类

设计模式

高级知识点

猜你喜欢

转载自blog.csdn.net/qq_33907408/article/details/85339106
今日推荐