本周真是充满了面试的艰难啊。。。。不过也攒下不少面试经验
Arraylist与hashmap相关
- 数组lsit的遍历,迭代器效率最低,使用索引效率最高
- arraylist底层就是一个Object数组,默认容量为10
- 数组一般都是要有初始化容量的。比如new int【】不给数组容量会报错,想要实现可变容量需要实现arraylist。
- 下面这行代码指出,length是数组独有的,表示容量
int[] aa = new int[4]; System.out.printf(String.valueOf(aa.length));
结果为4 - 数组中元素的个数通常无法直接确定,需要通过for循环判断
- arraylist的线程不安全问题就是其底层源码没有加锁
- concurrenthashmap能够实现线程安全,早期版本是分段锁,最新的版本主要是通过cas操作实现的
- 此外hashtable是线程安全的,但是不推荐使用,因为底层使用的是synchronized加锁,性能过低
lock锁
- 特点是更加直观
- 知道lock是一个接口,常见的实现类是reentrantLock。
- 建议讲释放锁unlock放入try catch finally 的finally块当中
网络编程
- 知道网络编程的三要素:ip,端口,协议
- ip+端口号组成套接字,一般使用socket对象实现客户端与服务端的链接
- 客户端通过套接字实现 printwriter向缓冲区写入数据,而服务端使用while循环等待i接受信息
反射机制
- 反射机制实际上就是获取运行时的类信息
- java文件经过类加载实现了,所以我们称Class类是任何运行类的镜子,获取这个类对应的Class类就是反射
- 反射提供了非常多的方法来实现类的运行时修改操作
- 可以获取一个类的method并调用invoke执行
原子类与unsafe
- 原子类提供了cas操作实现自增自减
- 原子类atomic 实现一些子类针对不同的数据类型
- 所有cas的操作都是在unsafe底层实现的,native修饰,系统方法,实际上是一个cpu指令不可打断
- 仍建议通过反射拿到unsafe内部已经创建好的unsafe实例
- lockSupport的park,unpark实际上也是调用了unsafe的park 方法 unpark方法
- unsafe可以实现位级别的内存管理
不可变对象,final原理
- String 的不可变是由于final修饰了byte数组,而且实现了保护性拷贝
- final 实际上加了一个写屏障,这个写屏障和volatile的写屏障一样,保证上面的指令不会跑到下面,同时和volatile一样保证之前的操作刷新到主存实现可见性。
- 被final修饰的变量必须显示的指示默认值,否则报错
- 被final修饰的变量会在类初始化之前就完成。
- 享元模式就是创建过的类不着急销毁,看它是否可重复利用(例如线程池的实现)
面试编程题
1.记得等价类划分,找边界值
软件测试初步了解
- 质量控制,质量保证概念与实施
- 配置管理相关概念
- 什么是优秀的测试人员
- 了解什么是软件度量,指的是软件在某个阶段的缺陷发生密度
- 了解软件质量度量的基本方法:目标问题度量法(问题,度量项),风险度量法
- 了解pdca理念
- 了解软件质量保证是如何实施的(1.需求分析?如何做?保证需求可行性,保证用户了解自己的需求,确保开发人员没有过多的错误。2.评审)
- 了解软件生命周期:需求分析,规格确定(配置管理,这个过程每个角色都要发挥自己的作用,例如PM项目经理需要制定计划,这一阶段涉及需求分析),
- 了解配置管理全过程:角色有:项目经理,配置管理委员会,配置管理员(执行版本控制与变更控制方案),系统集成员,开发人员。首先是计划阶段:完成需求分析,项目计划,配置计划,之后是开发与维护,这个阶段会有技术审计,代码审查
- 了解基本的软件测试理论例如:黑盒测试的测试用例设计(等价类划分,边界值),白盒测试(控制流测试,基本路径测试),集成测试(下面的是桩模块,上面是驱动模块):分为自上而下和非渐增式测试。