蚂蚁金服秋招提前批面试

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

  • young GC:只收集young gen的GC。当young gen中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。
  • full GC:Full GC:收集整个堆,包括young gen、old gen。当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带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.csdn.net/u013905744/article/details/73650557

不能直接使用Junit:若使用junit的@Test方式,@Test方法里的语句执行结束,就立即结束,线程不再继续跑。

  1. 启动Junit程序
  2. 启动过程中会将你要测试的“目标类”及“方法”传递给junit程序。
  3. junit根据信息解析出目标类class文件路径。
  4. 动态加载class文件,加载成内存中的一个java对象。利用反射(具体可以百度下)调用目标方法。

开放性问题

a.两个超大文件中有一些url和值,如何判断第二个文件中的在第一个文件里不存在

分块,分块的过程用hash,然后在在小的里面进行比较,形成很多个文件对,再用hashmap进行遍历

https://blog.csdn.net/tiankong_/article/details/77234726

编程

字符串模式匹配,比较简单,但需要仔细,一紧张把题目读掉了一行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值