为了账号安全,请及时绑定邮箱和手机立即绑定

google面试官还会告诉你这些。

标签:
Java 面试
  • 以老师的十年任职经历来看(MorganStanley,google):
    • 摩根士丹利
      • 填空题
      • 问答题
      • 选项题
      • 编程题
    • Google
      • 在线编程系统
    • 校招特点
      • 候选者基数大
        • 感觉社招更大
      • 缺乏足够履历
        • 自己做项目,跟导师做,但是
        • 在代码复杂性和质量上,差很多
    • 录取倾向
      • 基础知识
      • 编程能力
      • 交流能力(低)
    • Google全球录取率
      • 0.2~0.4%(有一小部分是由于参选门槛低导致的)
      • 哈佛大学:4~5%

  • 以阿里校招为例:
    • 来自计算机、软件、电子信息等专业,学习成绩优异
    • 熟练掌握流行的编程语言及工具,对数据结构、算法、数据库、操作系统基本原理、计算机体系结构、计算机网络、离散数学等基础学科掌握扎实;(这点占比很大
    • 技术热情狂热,强烈好奇心,有实际动手经验(编程能力)
    • 技术成果丰富:(技术运用到实际场景并解决问题),或有重要学术论文发表在国家顶级会议或期刊上,或有相关计算机领域专利,如果获得国家级ACM决赛的名次,当然是极好的。

操作系统

进程vs线程?

64 位系统和 32 位系统的区别:
64位CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍。
64位处理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数,因此一个ALU(算术逻辑运算器)和寄存器可以处理更大的整数,也就是更大的地址。比如,Windows Vista x64 Edition支持多达128 GB的内存和多达16 TB的虚拟内存,而32位CPU和操作系统最大只可支持4G内存。

图片描述

网络

网络主要要解决的一个问题就是安全,可靠。如何实现呢?OSI七层模型
一层一层的进化而来,为了解决特定的问题,相反的,反而并不是从理论上来进行解决的。比如Java泛型,也是逐渐建立起来的东西 (工程性解决)

  • 不可靠
  • 丢包,重复包
  • 出错
  • 乱序
  • 不安全(每层路由器都有可能有黑客窃听数据)
  • 中间人攻击
  • 窃取
  • 篡改
  • 抓包是个好东西。

图片描述

图片描述

关系型数据库

  • 基于关系代数理论(和网络的建立就不一样了)
  • 缺点:表结构不直观,实现复杂,速度慢
  • 优点:健壮性高,社区庞大

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
JOIN和GROUP BY
select for update(死锁技巧)
乐观锁(比for update性能损耗小):读取数据,记录Timestamp;修改数据;检查和提交数据

图片描述

事务的隔离级别:

  • 1.脏读
    • 允许读取到未提交的脏数据。
  • 2.不可重复读
    • 如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。
  • 3.幻读
    • 解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

由ANSI/ISO定义的SQL-92标准定义的四种隔离级别:

  • 1.Read Uncommitted

  • 2.Read Committed

  • 3.Repeatable Read

  • 4.Serializable
    图片描述

  • READ UNCOMMITTED(未提交读),事务中的修改,即使没有提交,在其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。

  • READ COMMITTED(提交读),一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读,因为两次执行相同的查询,可能会得到不一样的结果。因为在这2次读之间可能有其他事务更改这个数据,每次读到的数据都是已经提交的。

  • REPEATABLE READ(可重复读),解决了脏读,也保证了在同一个事务中多次读取同样记录的结果是一致的。但是理论上,可重读读隔离级别还是无法解决另外一个幻读的问题,指的是当某个事务在读取某个范围内的记录时,另外一个事务也在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。

  • SERIALIZABLE(可串行化),它通过强制事务串行执行,避免了前面说的幻读的问题。

编程语言基础

  • 类型检查
    • 编译时:C,C++,Java,Go.…
    • 运行时:Python,Perl,JavaScript,Ruby……
  • 运行/编译
    • 编译为机器代码运行:C,C++.…
    • 编译为中间代码,在虚拟机运行:Java,C#…
    • 解释执行:Python,Perl,JavaScript……
  • 编程范式(Programming Paradigm)
    • 面向过程:C,Visual Basic…
    • 面向对象:Java,C#,C++,Scala.…
    • 函数式:Haskell,Erlang…
      图片描述
      图片描述
      解释:3个1是2的23-1 -23取反加一,0加31个1 加 1

计算机中的正数用源码表示,负数用补码表示,而负数的补码是其反码+1 所以出现了-128。简单的说为了避免-0,负数的算法结果是每位都加了1
采用补码表示负数.
1 1111111 表示-1
1 0000000 表示-128

浮点数与定点数

  • 浮点数(+/-)1.xxx * 2^y
    • 符号位|指数部分|基数部分
    • 64位double范围:+/-10^308
    • 64位double 精度:10^15
  • 浮点数比较
    • a==b?
    • Math.abs(a-b)<eps ?
    • 使用BigDecimal 算钱

装箱与拆箱

Java 数据类型

  • primitive type vs Object
    • primitive type:int,long,float……
    • Object:Integer,Long,Float,String.…
  • primitive type
    • 值类型
    • 用a==b判断相等
  • object
    • 引用类型
    • 用a.equals(b),或Objects.equals(a,b)判断是否相等
    • 用a==b判断是否为同一个Object
      图片描述

编码技巧

  • 在白板上写程序
    • 程序写在:白板,纸笔,Word文档,记事本。。。
    • 修改不便;缩进不便;对齐困难
    • 心里不抵触;先思考后写;不要惧怕修改/重写
  • 数学归纳法公理
    • 用于证明断言对所有自然数成立
    • 证明对于N=1成立
    • 证明N>1时:如果对于N-1成立,那么对于N成立
      图片描述

递归控制

  • 递归书写方法
    • 严格定义递归函数作用,包括参数,返回值,Side-effect
    • 先一般,后特殊
    • 每次调用必须缩小问题规模
    • 每次问题规模缩小程度必须为1

链表创建

图片描述

链表翻转

图片描述

  • Stack
    • 函数调用开销
    • Stack Overflow!
    • 问题规模:n million 栈大小?
  • 不要尝试递归,使用非递归
    • 一般化的方法仍需使用栈
    • 代码复杂
    • 不根本解决问题

列出所有组合

图片描述

  • 循环书写方法
    • 定义循环不变式,并在循环体每次结束后保持循环不变式
    • 一般,后特殊
    • 每次必须向前推进循环不变式中涉及的变量值
    • 每次推进的规模必须为1

微知识点

并行计算

  • 将数据拆分到每个节点上 如何拆分
  • 每个节点并行的计算出结果 什么结果
  • 将结果汇总 如何汇总

  • 如何排序10G个元素?
    • 切分成多个段,每个段分配一个节点,所有节点进行归并,直到剩下一个节点
    • 扩展的归并排序
      图片描述

图片描述

多线程

  • 保证线程安全性 加锁 当我们把锁的粒度放的过细,就会出现死锁的情况
  • 确保同一个对象在同一时间只能有一个人

图片描述

线程池

  • 可以使用Future检查任务结果
  • 创建线程开销大
  • 线程池:预先建立好线程,等待任务派发

图片描述

  • 线程池的参数
    • corePoolSize:线程池中初始线程数量,可能处于等待状态
    • maximumPoglSize:线程池中最大允许线程数量
    • keepAlive Time:超出corePoolSize部分线程如果等待这些时间将被回收

资源管理

  • Java 垃圾回收
    • 不被引用的对象会被回收
    • 垃圾回收包括Minor GC和Full GC
    • 垃圾回收时所有运行暂停
  • Java资源管理
    • 内存会被回收,资源不会被释放
    • databaseConnection需要databaseConnection.close)来释放
try{
	Database databaseConnection =connect(..);
	databaseConnection.begin Transaction();
	//do work
}catch(Exception e){
	databaseConnection.rollBack);
}finally{
	databaseConnection.close();/∥不要抛异常,最好加try/catch
}
  • C++资源管理
    • C++没有finally,没有try with resource
    • C++有析构函数
void doWork){
	Database databaseConnection(.…);
	try{
		databaseConnection.begin Transaction);
		//do work
	}catch(Exception&e){
			databaseConnection.rollBack();
		}
	}
Database:~Database){
	// close database connection
}

Beautiful Number

  • 1,11,111…是beautiful的
  • 3>2进制>11
  • 13>3进制>111√
  • 13>12进制>11x

  • 13->3进制->111
    • 133+1*3+1=13
    • 13%3=1,13/3=4
    • 4%3=1,4/3=1
    • 1%3=1,1/-3=0

图片描述

面试流程和技巧分享

  • 自我介绍
    • 破除陌生人紧张气氛
    • 目的:破冰
    • 结构化表达
      图片描述
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
1.6万
获赞与收藏
1807

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消