1面,时长1.5h,电话面试后完成一道编程题
项目中待解答的问题
a.二维码中是否全部信息都是必要的
1.QR码分为40个版本,版本1由21x21个方块组成,每个版本增加4个方块,版本40由177x177个方块组成。每增加一个版本,QR码可储存的信息数量也随之增多。 2.版本1的二维码最多可以储存25个字符或41个数字,而版本40的二维码最多可以储存4296个字符或7089个数字 3.二维码分为功能图形(位置探测图形,定位图形(角度,避免扭曲),矫正图形)和编码区域(格式信息3,版本信息2,数据和纠错码(使二维码数据出现允许的错误时也可以正确解码,4个纠错等级)) |
b.二维码角落的3个点的作用
位置探测图形:确定二维码的大小和位置 |
测试相关问题
a.转账功能如何设计测试
1.功能测试 从账户(余额,余额宝,银行账户),转账金额,被转账户,密码验证(指纹,口令),转账结果(付款方和被转账户),限额和限次数,接口兼容。 从正常的流程进行考虑。 从非正常流程进行考虑。 2.性能测试 从转账到生效的时间。同时使用的人数较多的情况。 3.安全性测试 输入框的安全性;异常ip提交请求(确认转账人为本人);消息提交加密 |
Java相关问题
a.可达性分析,如何判断可达
通过一系列gcRoot的对象向下进行搜索,发现一个对象到gcRoot不存在任何引用链则说明对象不可达。 1.虚拟机栈中引用的对象(栈帧中的引用变量表) 2.方法区中类静态属性引用的对象 3.方法区中常量引用的对象 4.本地方法栈中Native方法(JNI)引用的对象 枚举根节点也就是查找GC Roots,在查找时要进行gc停顿 |
b.young GC 和 full GC
|
c.hashmap的底层
数组加链表,链地址法来解决hash冲突问题; 添加、删除、获取元素时都是先计算hash,根据hash和table.length计算index也就是table数组的下标,然后进行相应操作 |
c1.hashmap在哪些情况下效率会降低
当hashmap中的元素越来越多的时候,碰撞的几率也就越来越高(因为数组的长度是固定的),所以为了提高查询的效率,就要对hashmap的数组进行 扩容,数组扩容这个操作也会出现在ArrayList中,所以这是一个通用的操作,很多人对它的性能表示过怀疑,不过想想我们的“均摊”原理,就释然了, 而在hashmap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize |
d.StringBuilder的底层
String类型具有不可变性,对string字符串的操作(如拼接、Trim()等)都会在内存中产生一个新的字符串对象。 String是immutable的变量,一旦被创建,它的值就不能被改变。当string "+"的时候,是新建了一个String空间然后将原来变量的指向这个空间。原来的String被废弃只能等待着被垃圾回收。 StringBuilder底层是数组,直接在数组上进行修改; |
f.如何理解线程安全和线程非安全
对结构来说,不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据问题 更大定义上,线程非安全是指多个线程在操作共享数据时会由于推进顺序的不同产生非预料的结果 |
g.如何测试线程是否安全
分析:是否使用到共享数据并进行修改,是否使用了正确同步方式进行控制 直接测试:模拟并发,Junit多线程测试的开源的第三方的工具包GroboUtilshttps://blog.youkuaiyun.com/u013905744/article/details/73650557 不能直接使用Junit:若使用junit的@Test方式,@Test方法里的语句执行结束,就立即结束,线程不再继续跑。
|
开放性问题
a.两个超大文件中有一些url和值,如何判断第二个文件中的在第一个文件里不存在
分块,分块的过程用hash,然后在在小的里面进行比较,形成很多个文件对,再用hashmap进行遍历
https://blog.youkuaiyun.com/tiankong_/article/details/77234726
编程
字符串模式匹配,比较简单,但需要仔细,一紧张把题目读掉了一行。