转载自:https://baijiahao.baidu.com/s?id=1688631517911751367&wfr=spider&for=pc
此文作用于自己刷题使用,答案在每道题的题干后面的括号中,选中即可显示。

题目1-10

1.【多选】如何处理单元测试产生的数据,下列哪些说法是正确的?(ABC   )

A .测试数据入库时加特殊前缀标识。

B .测试数据使用独立的测试库。

C .自动回滚单元测试产生的脏数据。

D .无须区别,统一在业务代码中进行判断和识别。

简单解析:P29
推荐】:和数据库相关的单元测试,可以设定自动回滚机制,不给数据库造成脏数据。或者对单元测试产生的数据有明确的前后缀标识。
正例:在企业智能事业部的内部单元测试中,使用 ENTERPRISE_INTELLIGENCE _UNIT_TEST_的前缀来标识单元测试相关代码。

2.【多选】关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》(ABC   )

A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步调用应该考虑到性能损耗。

C .创建线程或线程池时,推荐给线程指定一个有意义的名称,方便出错时回溯。

D .推荐使用Executors.newFixedThreadPool(int x)生成指定大小的线程池。(线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式)

简单解析:
P15强制】:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool:允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2) CachedThreadPool:允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

强制】:线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。

强制】:高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁。
说明:尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用 RPC 方法。

P14强制】:创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。
正例:自定义线程工厂,并且根据外部特征进行分组,比如机房信息。

3.【多选】下列哪些说法符合《阿里巴巴Java开发手册》(ACD   )

A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序中清理出去,避免造成过多垃圾。

B .永久弃用的代码段注释掉即可,即不用加任何注释。

C .对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三 个斜杠(///)来说明注释掉代码的理由。

D .不要在视图模板中加入任何复杂的逻辑。

简单解析:
P21参考】:谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除。
说明:代码被注释掉有两种可能性:1)后续会恢复此段代码逻辑。2)永久不用。前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉(代码仓库已然保存了历史代码)

P23推荐】:不要在视图模板中加入任何复杂的逻辑。
说明:根据 MVC 理论,视图的职责是展示,不要抢模型和控制器的活。

P23推荐】:及时清理不再使用的代码段或配置信息。
说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余。
正例:对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。

4.【多选】关于分页查询,下列哪些说法符合《阿里巴巴Java开发手册》(ABC   )

A .分页查询,当统计的count为0时,应该直接返回,不要再执行分页查询语句。

B .iBATIS自带的queryForList(String statementName,int start,int size)分页接口有性能隐患,不允许使用。

C .定义明确的sql查询语句,通过传入参数start和size来实现分页逻辑。

D .可使用存储过程写分页逻辑,提高效率。

简单解析:
P34强制】:禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

强制】代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句

P35强制】:iBATIS 自带的 queryForList(String statementName,int start,int size)不推荐使用。
说明:其实现方式是在数据库取到 statementName 对应的 SQL 语句的所有记录,再通过 subList 取start,size 的子集合。
正例:

Map<String, Object> map = new HashMap<>();
map.put("start", start);
map.put("size", size);

5.【多选】根据《阿里巴巴Java开发手册》,以下功能必须进行水平权限控制校验的有(ABCD)

A .订单详情页面。

B .类目管理后台。

C .店铺装修后台。

D .订单付款页面。

简单解析:P30
强制】隶属于用户个人的页面或者功能必须进行权限控制校验。
说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容、修改他人的订单。

6.【多选】关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》(BD     )

A .NULL=NULL的返回结果为true。

B .NULL与任何值的比较结果都为NULL。

C .NULL<>1的返回结果为true。

D .当某一列的值全是NULL时,sum(col)的返回结果为NULL。

简单解析:P34
强制】使用 ISNULL()来判断是否为 NULL 值。
说明:NULL 与任何值的直接比较都为 NULL。
1) NULL<>NULL 的返回结果是 NULL,而不是 false。
2) NULL=NULL 的返回结果是 NULL,而不是 true。
3) NULL<>1 的返回结果是 NULL,而不是 true。

强制】当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为 NULL,因此使用 sum()时需注意 NPE 问题。
正例:使用如下方式来避免 sum 的 NPE 问题:SELECT IFNULL(SUM(column), 0) FROM table;

7.【多选】关于接口使用抛异常还是返回错误码,下列哪些说法符合《阿里巴巴Java开发手册》(ABCD)

A .向公司外部提供的http/api接口,推荐使用“错误码”方式返回异常或者错误信息。

B .对于应用内部的方法调用,推荐使用“抛出异常”的方式处理异常或者错误信息。

C .跨应用的RPC调用,推荐使用将“错误码”和“错误简短信息”封装成Result的方式进行返回。

D .对外提供的接口,一定要保证逻辑健壮性:尽量避免空指针等技术类异常;对于业务类异常要做好错误码或者异常信息的封装。

简单解析:
P25参考】对于公司外的 http/api 开放接口必须使用“错误码”;而应用内部推荐异常抛出;跨应用间 RPC 调用优先考虑使用 Result 方式,封装 isSuccess()方法、“错误码”、“错误简短信息”。
说明:关于 RPC 方法返回方式使用 Result 方式的理由:
1)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。
2)如果不加栈信息,只是 new 自定义异常,加入自己的理解的 error message,对于调用端解决问题
的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。

P25推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景:
1) 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
反例:public int f() { return Integer 对象}, 如果为 null,自动解箱抛 NPE。
2) 数据库的查询结果可能为 null。
3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5) 对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针。
6) 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。
正例:使用 JDK8 的 Optional 类来防止 NPE 问题。

8.【单选】关于类的序列化,下列说法哪些是正确的(D        )

A .类的序列化与serialVersionUID毫无关系。

B .如果完全不兼容升级,不需要修改serialVersionUID值。

C .POJO类的serialVersionUID不一致会编译出错。

D .POJO类的serialVersionUID不一致会抛出序列化运行时异常。

简单解析:P8
强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
说明:注意 serialVersionUID 不一致会抛出序列化运行时异常。

9.【多选】关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》(BCD   )

A .在接口类中的方法和属性使用public修饰符。

B .对于Service类,内部的实现类加Impl的后缀与接口区别。例如:ProductServiceImpl实现ProductService接口。

C .对于Service类,基于SOA的理念,是以接口方式暴露服务。

D .尽量不在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,而且是整个应用的基础常量。

简单解析:
P3推荐】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。
正例:接口方法签名 void commit();
接口基础常量 String COMPANY = “alibaba”;
反例:接口方法定义 public abstract void f();
说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。

P3 接口和实现类的命名有两套规则:
1)【强制】对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用Impl 的后缀与接口区别。
正例:CacheServiceImpl 实现 CacheService 接口。
2) 【推荐】如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able 的形容词)。
正例:AbstractTranslator 实现 Translatable 接口

10.【单选】集合在遍历过程中,有时需要对符合一定条件的元素进行删除,下列哪些说法是正确的(B)

A .在 foreach 循环里进行元素的 remove操作。

B .使用Iterator方式,如果有并发,需要对Iterator对象加锁。

C .Iterator进行元素的删除操作,绝对是线程安全的。

D .Java无法实现在遍历时,进行删除元素操作。

简单解析:P12
强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
正例:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String item = iterator.next();if (删除元素的条件) {iterator.remove();}
}

反例:

for (String item : list) {if ("1".equals(item)) {list.remove(item);}
}

说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的结果吗?

题目11-20

11.【多选】关于基本数据类型与包装数据类型的使用标准,下列哪些说法符合《阿里巴巴Java开发手册》(ABD   )

A .所有的POJO类属性必须使用包装数据类型。

B .RPC方法的返回值和参数必须使用包装数据类型。

C .因为JAVA的自动装箱与拆箱机制,不需要根据场景来区分数据类型。

D .所有的局部变量推荐使用基本数据类型。

简单解析:P9
关于基本数据类型与包装数据类型的使用标准如下:
1) 【强制】所有的 POJO 类属性必须使用包装数据类型。
2) 【强制】RPC 方法的返回值和参数必须使用包装数据类型。
3) 【推荐】所有的局部变量使用基本数据类型。
说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或者入库检查,都由使用者来保证。

正例:数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
反例:比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。

12.【多选】关于索引的设计,下列哪些说法符合《阿里巴巴Java开发手册》(ACD   )

A .对varchar类型的字段建立索引,必须指定索引长度。

B .对varchar类型的字段建立索引,不需要指定索引长度,这样索引区分度最好。

C .业务上具有唯一特性的字段(含组合字段),必须指定唯一索引。

D .建复合索引时,一般选择区分度高的字段放在最左列。

简单解析:
P33强制】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
说明:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。

P33推荐】建组合索引的时候,区分度最高的在最左边。
正例:如果 where a=? and b=? ,如果 a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即可。
说明:存在非等号和等号混合时,在建索引时,请把等号条件的列前置。如:where c>? and d=? 那么 即使 c 的区分度更高,也必须把 d 放在索引的最前列,即索引 idx_d_c。

13.【多选】关于二方库版本号的命名方式,下列哪些说法符合《阿里巴巴Java开发手册》(ABCD)

A .版本号命名格式:主版本号.次版本号.修订号。

B .主版本号:产品方向改变,或者大规模API不兼容,或者架构不兼容升级。

C .次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的API不兼容修改。

D .修订号:保持完全兼容性,修复BUG、新增次要功能特性等。

简单解析:P38
强制】二方库版本号命名方式:主版本号.次版本号.修订号
1)主版本号:产品方向改变,或者大规模 API 不兼容,或者架构不兼容升级。
2) 次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的 API 不兼容修改。
3) 修订号:保持完全兼容性,修复 BUG、新增次要功能特性等。
说明:注意起始版本号必须为:1.0.0,而不是 0.0.1,正式发布的类库必须先去中央仓库进行查证,使版 本号有延续性,正式版本号不允许覆盖升级。如当前版本:1.3.3,那么下一个合理的版本号:1.3.4 或 1.4.0 或 2.0.0

14.【多选】关于索引的使用,下列哪些说法是正确的(BCD   )

A .查询语句 WHERE a+1 = 5 可以利用a索引。

B .查询语句WHERE date_format(gmt_create, ‘%Y-%m-%d’) = '2016-11-11’无法利用gmt_create索引。

C .当 c 列类型为 char 时,查询语句 WHERE c = 5 无法利用c索引。

D .索引字段使用时不能进行函数运算。

简单解析:P33
推荐】防止因字段类型不同造成的隐式转换,导致索引失效。索引列上有函数运算,导致不走索引

15.【多选】关于生产环境的日志文件,下列哪些说法符合《阿里巴巴Java开发手册》(ABCD)

A .异常信息应该包括两类信息:案发现场信息和异常堆栈信息。

B .日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特点。

C .避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false。

D .错误日志和业务日志尽量分开存放。

简单解析:
P26强制】所有日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。网络运行状态、安全相关信息、系统监测、管理后台操作、用户敏感操作需要留存相关的网络日志不少于 6 个月。

强制】避免重复打印日志,浪费磁盘空间,务必在 log4j.xml 中设置 additivity=false。
正例:

强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字 throws 往上抛出。
正例:logger.error(各类参数或者对象 toString() + “_” + e.getMessage(), e);

16.【多选】关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》(ABD   )

A .特殊注释标记,请注明标记人与标记时间。

B .待办事宜(TODO):( [标记人,标记时间,[预计处理时间])

C .在注释中用FIXME标记某代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进

D .在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况

简单解析:

P22参考】特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描,经常清理此类标记。线上故障有时候就是来源于这些标记处的代码。
1) 待办事宜(TODO):(标记人,标记时间,[预计处理时间])
表示需要实现,但目前还未实现的功能。这实际上是一个 Javadoc 的标签,目前的 Javadoc 还没有实现,但已经被广泛使用。只能应用于类,接口和方法(因为它是一个 Javadoc 标签)。
2) 错误,不能工作(FIXME):(标记人,标记时间,[预计处理时间])
在注释中用 FIXME 标记某代码是错误的,而且不能工作,需要及时纠正的情况。

17.【多选】关于MySQL性能优化的描述,下列哪些说法是正确的(ABCD)

A .主键查询优先于二级索引查询。

B .表连接有一定的代价,故表连接数量越少越好。

C .一般情况下,二级索引扫描优先于全表扫描。

D .可以使用通过索引避免排序代价。

简单解析:
P33推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合 索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。

正例:where a=? and b=? order by c; 索引:a_b_c
反例:索引如果存在范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 无 法排序

推荐】SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。
说明:
1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
2) ref 指的是使用普通的索引(normal index)。
3) range 对索引进行范围检索。
反例:explain 表的结果,type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range还低,与全表扫描是小巫见大巫。

18.【多选】关于索引的设计和使用,下列哪些说法是正确的(AD     )

A .若查询条件中不包含索引的最左列,则无法使用索引。

B .对于范围查询,只能利用索引的最左列。

C .对于order by A或group by A语句,在A上建立索引,可以避免排序。?

D .对于多列排序,需要所有所有列排序方向一致,才能利用索引。?

简单解析:
P33 同上

19.【多选】关于类命名,下列哪些说法符合《阿里巴巴Java开发手册》(ABCD)

A .抽象类命名使用Abstract或Base开头。

B .异常类命名使用Exception结尾。

C .测试类命名以它要测试的类的名称开始,以Test结尾。

D .如果使用到了设计模式,建议在类名中体现出具体模式。例如代理模式的类命名:LoginProxy;观察者模式命名:ResourceObserver。

简单解析:
P1强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。

推荐】如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。

20.【多选】关于数据库模糊检索的描述,下列哪些说法符合《阿里巴巴Java开发手册》(ABD   )

A .绝对禁止左模糊。

B .绝对禁止全模糊。

C .绝对禁止右模糊。

D .全模糊或左模糊查询需求,优先使用搜索引擎。

简单解析:
P33强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
说明:索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。

题目21-30

21.【多选】关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》(ACD   )

A .所有的抽象方法(包括接口中的方法)必须要用javadoc注释。

B .所有的方法,包括私有方法,最好都增加注释,有总比没有强。

C .过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。

D .我的命名和代码结构非常好,可以减少注释的内容。

简单解析:
P21参考】好的命名、代码结构是自解释的,注释力求精简准确、表达到位。避免出现注释的一个极端:过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。

22.【多选】关于checked/unchecked exception,下列哪些说法是正确的(BCD   )

A .继承java.lang.Error的类属于checked exception。

B .checked异常继承java.lang.Exception类。

C .unchecked异常继承java.lang.RuntimeException类。

D .NullPointerException , IllegalArgumentException属于unchecked exception。

简单解析:
P21推荐】定义时区分 unchecked / checked 异常,避免直接抛出 new RuntimeException(), 更不允许抛出 Exception 或者 Throwable,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如:DAOException / ServiceException 等

23.【单选】关于Map类型集合的遍历方式,下列哪些说法是正确的(D)

A .Map类型的实现类都同时实现了Iterator接口。

B .使用foreach进行遍历。

C .推荐使用keySet进行遍历。

D .推荐使用entrySet进行遍历。

简单解析:
P13推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。
说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应 的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.forEach 方法。

24.【多选】关于变量、方法名、包的命名,下列哪些说法符合《阿里巴巴Java开发手册》(ABCD)

A .POJO类中的任何布尔类型的变量,都不要加is,因为部分框架解析时有可能会出现序列化错误。

B .包名统一使用单数形式,如:com.alibaba.mpp.util。

C .中括号是数组类型的一部分,数组定义如下:String[] args; 不要误写为String args[];

D .Service/DAO层方法命名可以参考规约,例如:删除的方法推荐使用remove或delete做前缀。

简单解析:
P1-2强制】类型与中括号紧挨相连来表示数组。

正例:定义整形数组 int[] arrayDemo;
反例:在 main 参数中,使用 String args[]来定义。

强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例:应用工具类包名为 com.alibaba.ai.util、类名为 MessageUtils(此规则参考 spring 的框架结构)

25.【多选】关于常量定义,下列哪些说法符合《阿里巴巴Java开发手册》(AC     )

A .不允许出现任何魔法值(即未经预先定义的常量)直接出现在代码中。

B .魔法值是指程序中随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码中写if(status == 3) return error;符合规范。

C .如果变量值仅在一个范围内变化推荐用Enum类。

D .在程序中,一律禁止使用枚举类型。

简单解析:
P4强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

推荐】如果变量值仅在一个固定范围内变化用 enum 类型来定义。
说明:如果存在名称之外的延伸属性应使用 enum 类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。

26.【多选】关于maven依赖、仲裁、规则,下列哪些说法是正确的(ACD   )

A .(dependencies)的依赖会默认传递给子项目。

B .(dependencies)的依赖绝对不会传递给子项目。

C .在(dependencyManagement)中指定版本号。

D .避免在不同的子项目,声明同一个二方库的不同版本号。

简单解析:
P39推荐】所有 pom 文件中的依赖声明放在(dependencies)语句块中,所有版本仲裁放在 (dependencyManagement)语句块中。

说明:(dependencyManagement)里只是声明版本,并不实现引入,因此子项目需要显式的声明依赖,version 和 scope 都读取自父 pom。而(dependencies)所有声明在主 pom 的(dependencies)里 的依赖都会自动引入,并默认被所有的子项目继承。

27.【单选】关于二方库升级,下列哪些说法是正确的(B)

A .升级二方库只是改个版本号,不需要关联功能的回归。

B .升级二方库需要比对仲裁结果的差异,谨慎评估。

C .升级二方库,绝对不会影响到其它二方库的版本号。

D .只要此二方库负责人保证说不会有任何影响,即可大胆升级,直接发布上线。

简单解析:
P38强制】二方库的新增或升级,保持除功能点之外的其它 jar 包仲裁结果不变。如果有改变,必须明确评估和验证。
说明:在升级时,进行 dependency:resolve 前后信息比对,如果仲裁结果完全不一致,那么通过 dependency:tree 命令,找出差异点,进行排除 jar 包。

28.【多选】关于表字段和索引,下列哪些说法符合《阿里巴巴Java开发手册》(ABD   )

A .表字段注释,如果修改字段含义或对字段表示的状态追加时,需要及时更新。

B .合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。

C .针对表的每个字段都增加索引,加快查询速度。

D .字段的区分度越高,索引的查找速度越快。

简单解析:
P32参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度

推荐】如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。

29.【单选】关于测试代码的覆盖率,下列哪些说法是正确的?(B)

A .路径覆盖是最强覆盖,符合路径覆盖且测试全部通过,程序绝对没有问题。

B .语句覆盖度是最弱的覆盖度量方式。

C .分支覆盖与条件覆盖其实是一回事。

D .判定条件覆盖与路径覆盖其实是一回事。

简单解析:
语句覆盖常常被人指责为“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。假如你的上司只要求你达到语句覆盖,那么你可以省下很多功夫,但是,换来的确实测试效果的不明显,很难更多地发现代码中的问题。

判定覆盖(DecisionCoverage)又称分支覆盖(BranchCoverage),所有边界覆盖(All-EdgesCoverage),基本路径覆盖(BasicPathCoverage),判定路径覆盖(Decision-Decision-Path)。它度量程序中每一个判定的分支是否都被测试到了。

条件覆盖(ConditionCoverage)它度量判定中的每个子表达式结果true和false是否被测试到了。

路径覆盖(PathCoverage)又称断言覆盖(PredicateCoverage)。它度量了是否函数的每一个分支都被执行了。 这句话也非常好理解,就是所有可能的分支都执行一遍,有多个分支嵌套时,需要对多个分支进行排列组合,可想而知,测试路径随着分支的数量指数级别增加。

30.【多选】Hashtable,HashMap, ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的(ABD   )

A .Hashtable的KV都不可以为null。

B .HashMap的KV都可以为null。

C .HashMap的K不可以为null,V可以为null。

D .ConcurrentHashMap的KV都不可以为null。

简单解析:P14

题目31-40

31.【多选】关于数据库命名规则,下列哪些说法符合《阿里巴巴Java开发手册》(BCD   )

A .数据库库名和表名没有规定,可任意取名,只要方便记忆即可。

B .库名应该尽量与应用名称保持一致,表的命名最好是业务名称_表名的方式。

C .无论是库名还是表名都禁用保留字,如desc、match、range等。

D .表名、字段名必须使用小写字母或数字。

简单解析:P31-32
强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。

强制】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。

推荐】表的命名最好是遵循“业务名称_表的作用”。

推荐】库名与应用名称尽量一致。

32.【多选】关于异常的处理方式,下列哪些说法是正确的(BD     )

A .为防止obj对象本身空指针异常,书写代码时应该注意加异常捕获处理,例如:try { obj.method() } catch(NullPointerException e){……} 。

B .方法签名中,抛给调用者的关键字为throws

C .方法内部,抛出异常实例对象为throws

D .自定义异常要做到“认知对等”,即:抛出者和接收者要保持对自定义异常的认知统一,接收方需要知道这种异常的含义和对应的处理方案。

简单解析:

33.【多选】数组使用Arrays.asList转化为集合,下列说法哪些正确的(ACD   )

A .数组元素的修改,会影响到转化过来的集合。

B .数组元素的修改,不会影响到转化过来的集合。

C.对于转换过来的集合,它的 add/remove/clear 方法会抛出: UnsupportedOperationException。

D .Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

简单解析:
P12强制】使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

String[] str = new String[] { "yang", "hao" };
List list = Arrays.asList(str);

第一种情况:list.add(“yangguanbao”); 运行时异常。
第二种情况:str[0] = “changed”; 也会随之修改,反之亦然。

34.【多选】关于文件编码和格式的设定,下列哪些说法符合《阿里巴巴Java开发手册》(BC     )

A .IDE的text file encoding设置为GBK格式。

B .IDE的text file encoding设置为UTF-8格式。

C .IDE中文件的换行符使用unix格式。

D .IDE中文件的换行符使用windows格式。

简单解析:P6
强制】IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 格式。

35.【多选】关于数据库是与否概念的列的命名方式,下列哪些说法符合《阿里巴巴Java开发手册》(BD     )

A .对于是与否概念的列名,必须使用can_abc 来表示。

B .对于是与否概念的列名,必须使用is_abc 来表示。

C .数据类型是varchar(1)( Y表示是,N表示否)。

D .数据类型是unsigned tiny int.( 1表示是,0表示否)。

简单解析:P31
强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned
tinyint(1 表示是,0 表示否)。
说明:任何字段如果为非负数,必须是 unsigned。

注意:POJO 类中的任何布尔类型的变量,都不要加 is 前缀,所以,需要在设置从 is_xxx 到 Xxx 的映射关系。数据库表示是与否的值,使用 tinyint 类型,坚持 is_xxx 的命名方式是为了明确其取 值含义与取值范围。

正例:表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。

36.【多选】以下关于格式规约的说法,正确的有哪些(AD     )

A .代码块缩进4个空格,如果使用tab缩进,请设置成1个tab为4个空格;

B .代码块缩进5个空格,如果使用tab缩进,请设置成1个tab为5个空格。

C .为了保持代码美观,《手册》强烈推荐增加若干空格,使某一行的变量与相邻对应位置的变量对齐。

D .方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间推荐插入一个空行;相同业务逻辑和语义之间不需要插入空行。

简单解析:P6-7
强制】采用 4 个空格缩进,禁止使用 tab 字符。
说明:如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。IDEA 设置 tab 为 4 个空格时,请勿勾选 Use tab character;而在 eclipse 中,必须勾选 insert spaces for tabs。

推荐】不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。
说明:任何情形,没有必要插入多个空行进行隔开

37.【多选】通过集合A.subList()获取子集合B,下列说法哪些是正确的(ABD   )

A .返回的集合B没有实现Serializable接口,不能被序列化,所以不能应用于RPC场景。

B .在B集合中添加某个元素,那么A集合也会添加进去此元素。

C .集合A中元素的修改不会影响到集合B的任何操作。

D .对A元素个数的修改,会导致集合B的遍历产生ConcurrentModificationException 异常。

简单解析:P11
强制】ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。
说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对 于 SubList 子列表的所有操作最终会反映到原列表上。

强制】在 subList 场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生 ConcurrentModificationException 异常。

38.【多选】关于捕获异常和抛异常,下列哪些说法符合《阿里巴巴Java开发手册》(BCD   )

A .如果需要捕获不同类型异常,为了方便处理,可以使用catch(Exception e){…}。

B .不要捕获异常后不处理,丢弃异常信息。

C .捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。

D .异常定义时区分unchecked / checked 异常,避免直接使用RuntimeException抛出。

简单解析:P24-25
强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。

强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。
说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。

39.【多选】关于线程安全,下列哪些说法是正确的(ACD   )

A .SimpleDateFormat 是线程不安全的类。

B .SimpleDateFormat 是线程安全的类。

C .一般不要定义SimpleDateFormat的static变量,如果定义为static,必须保证线程安全。

D .推荐使用Apache封装好的DateUtils和DateFormatUtils工具类,来处理时间日期转换问题。

简单解析:15
强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类。

正例:注意线程安全,使用 DateUtils。亦推荐如下处理:

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {@Overrideprotected DateFormat initialValue() {return new SimpleDateFormat("yyyy-MM-dd");}
};

说明:如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable thread-safe。

40.【多选】为了更方便地进行单元测试,被测试的业务代码应避免以下哪些情况?(ABCD)

A .构造方法中做的事情过多。

B .存在过多的全局变量和静态方法。

C .存在过多的外部依赖。

D .存在过多的条件语句。

简单解析:P29
参考】为了更方便地进行单元测试,业务代码应避免以下情况:
构造方法中做的事情过多。
存在过多的全局变量和静态方法。
存在过多的外部依赖。
存在过多的条件语句。
说明:多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。

题目41-50

41.【多选】关于控制语句,下列哪些说法符合《阿里巴巴Java开发手册》(ABD   )

A .推荐 if-else的方式可以改写成卫语句的形式。

B .尽量减少try-catch 块内的逻辑,定义对象、变量、获取数据库连接等操作可以移到try-catch块外处理

C .if ( condition) statements; 单行语句不需要使用大括号。

D .在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。

简单解析: P17-19
强制】在 if/else/for/while/do 语句中必须使用大括号。
说明:即使只有一行代码,避免采用单行的编码方式:if (condition) statements;

强制】在一个 switch 块内,每个 case 要么通过 continue/break/return 等来终止,要么 注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有。
说明:注意 break 是退出 switch 语句块,而 return 是退出方法体。

推荐】循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、获取数据库连接,进行不必要的 try-catch 操作(这个 try-catch 是否可以移至循环体 外)

42.【多选】关于参数有效性验证,下列哪些说法符合《阿里巴巴Java开发手册》(ABCD)

A .防止page size过大导致内存溢出。

B .防止正则输入源串拒绝服务ReDOS。

C .防止任意重定向。

D .预防 SQL 注入。

简单解析:P28
强制】用户请求传入的任何参数必须做有效性验证。
说明:忽略参数校验可能导致:
page size 过大导致内存溢出
恶意 order by 导致数据库慢查询
任意重定向
SQL 注入
反序列化注入
正则输入源串拒绝服务 ReDoS

说明:Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,但是如果攻 击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。

43.【多选】关于变量和常量定义,下列哪些符合《阿里巴巴Java开发手册》(AD     )

A .Long a=2L;//大写的L

B .Long a=2l; //小写的l

C .常量只定义一次,不再赋值,所以不需要命名规范。

D .不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。

简单解析:P4
强制】在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数 字 1 混淆,造成误解。
说明:Long a = 2l; 写的是数字的 21,还是 Long 型的 2。

推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。
说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。
正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 ConfigConsts 下。

44.【单选】在定义DO/DTO/VO/等POJO类时,对属性默认值的设定,下列哪些说法符合《阿里巴巴Java开发手册》(D)

A .String类型的默认值设定为空字符串。

B .Date类型的默认值设定为new Date()。

C .集合类型的默认值设定为Collections.EMPTY_LIST。

D .不要设定任何属性默认值。

简单解析:P9
强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
反例:POJO 类的 createTime 默认值为 new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

45.【多选】关于二方库依赖的解析命令,下列哪些说法是正确的(ABC   )

A .mvn dependency:resolve 打印出已仲裁依赖的列表。

B .mvn dependency:tree 打印工程整个的依赖树结构。

C .mvn dependency:tree -Dverbose -Dincludes=commons-lang 打印出与commons-lang相关的详细依赖。

D .mvn clean install 打印工程整个的依赖树结构,并部署到本地仓库中。

简单解析:P38
强制】二方库的新增或升级,保持除功能点之外的其它 jar 包仲裁结果不变。如果有改变, 必须明确评估和验证。
说明:在升级时,进行 dependency:resolve 前后信息比对,如果仲裁结果完全不一致,那么通过,dependency:tree 命令,找出差异点,进行排除 jar 包。

46.【单选】KV结构的集合,在处理null值的存储上有细微的区别,下列哪些说法是正确的(A)

A .TreeMap的key不可以为null

B .TreeMap的key可以为null

C .ConcurrentHashMap的key可以为null

D .ConcurrentHashMap的value可以为null

简单解析:P14

47.【多选】关于数据库中表相关的命名,下列哪些说法符合《阿里巴巴Java开发手册》(ABD   )

A .表名、字段名禁止出现数字开头,禁止两个下划线中间只出现数字。

B .表名不使用复数名词。

C .表必备三字段命名:id, gmt_create, gmt_modify。

D .表必备三字段命名:id, gmt_create, gmt_modified。

简单解析:P31
强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑

强制】表名不使用复数名词。

强制】表必备三字段:id, create_time, update_time。
说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime 类型

48.【多选】关于多线程并行处理定时任务的情况,下列哪些说法符合《阿里巴巴Java开发手册》(BCD   )

A .推荐使用Timer方式处理。

B .推荐使用ScheduledExecutorService方式处理。

C .Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行。

D .ScheduledExecutorService并发运行多个定时任务时,其中某线程抛出异常,不会影响到其它线程的继续运行。

简单解析:P17
强制】多线程并行处理定时任务时,Timer 运行多个 TimeTask 时,只要其中之一没有捕获 抛出的异常,其它任务便会自动终止运行,如果在处理定时任务时使用 ScheduledExecutorService 则没有这个问题。

49.【多选】关于Java代码的设计和开发注意事项,下列哪些说法符合《集合开发规约》(ABCD)

A .禁止将URL、文件名、系统参数、数据库连接地址、业务规则的可变参数,硬编码在工程中。

B .long或者Long初始赋值时,必须是大写的L,不能小写。

C .当一个类有多个构造方法,或是多个同名方法,这些方法应该按顺序放置在一起,便于阅读。

D .相同参数类型,同等业务含义,才可以使用Java的可变参数,参数的类型尽量避免使用Object。

简单分析:P4\P9\P7
强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

强制】在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数 字 1 混淆,造成误解

推荐】当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条。

强制】相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object。
说明:可变参数必须放置在参数列表的最后。(提倡同学们尽量不用可变参数编程)
正例:public List listUsers(String type, Long… ids) {…}

50.【多选】关于数据库索引的命名,下列哪些说法符合《阿里巴巴Java开发手册》(ACD   )

A .主键索引(primary key),字段类型为unsigned bigint、单表时推荐自增、步长为1。

B .主键索引(primary key),字段类型为unsigned bigint、单表时推荐自增、步长为2。

C .唯一索引(unique key),命名规则为uk_字段名(如果多个字段继续下划线)。

D .普通索引(normal index),标记成idx_字段名(如果多个继续下划线)。

简单解析:
强制】表必备三字段:id, create_time, update_time。
说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime 类型。

强制】主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。

阿里巴巴Java开发手册认证考试题库相关推荐

  1. 关于接口使用抛异常还是返回错误码,下列哪些说法符合《阿里巴巴Java开发手册》

    关于接口使用抛异常还是返回错误码,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 向公司外部提供的http/api接口,推荐使用"错误码"方式返回异常或 ...

  2. 关于数据库中NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》

    关于数据库中NULL的描述,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. NULL=NULL的返回结果为true. B. NULL与任何值的比较结果都为NULL. C. ...

  3. 下列哪些说法符合《阿里巴巴Java开发手册》

    下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 对于"明确停止使用的代码和配置",如方法.变量.类.配置文件.动态配置属性等要坚决从程序中清理出去,避免 ...

  4. 关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》

    关于并发处理,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程. B. 同步处理时,能锁部分代码区块的情况下不要锁 ...

  5. 阿里巴巴 Java 开发手册之编程规约(一)-------我的经验

    阿里巴巴 Java 开发手册 一.编程规约 (一) 命名规约 1.[强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.(代码规范,易读) 反例: _name / __na ...

  6. 白话阿里巴巴Java开发手册(编程规约)

    本文欢迎转载,转载请注明原文链接,并附作者个人信息李艳鹏. 研发流程管理 最近,阿里巴巴发布了<阿里巴巴Java开发手册>,总结了阿里人多年一线实战中积累的研发流程规范,这些流程规范在一定 ...

  7. [转]白话阿里巴巴Java开发手册高级篇

    不久前,阿里巴巴发布了<阿里巴巴Java开发手册>,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结 ...

  8. 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用枚举?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下: 在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内 ...

  9. 《阿里巴巴Java开发手册》2018年完整资料下载!

    无规矩不成方圆,无规范不能协作. <阿里巴巴Java开发手册>(以下简称<手册>)是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.异常日志.单元测试.安全规约.MySQ ...

最新文章

  1. 【OpenCV 4开发详解】图像与视频的保存
  2. 6月第1周回顾:华为再现猝死 中国成全球最大宽带市场
  3. 广义线性模型、Logistic、sigmoid、softmax、多分类、与大数据、优缺点
  4. 2022年:机器人技术的重大革命
  5. pyqt stop停止线程_面试官:如何终止线程?有几种方式?
  6. 光流 | 高精度变分光流、LK-HS多项式展开的帧间估计、局部全局光流(论文翻译)及光流场与光流算法研究
  7. RTSP/RTMP播放端录像不可忽视的几个设计要点
  8. 解决宿主机Ping不通虚拟机的问题
  9. iOS企业证书申请介绍
  10. Java是块级作用域吗_javascirpt如何模仿块级作用域(js高程笔记)
  11. mysql碎片data free_浅析MySQL数据碎片的产生(data free)
  12. 瑞典驻华参赞:智慧城市建设提升为国家战略
  13. Anaconda 下载与安装详细教程
  14. RFC2544背靠背测试——信而泰Renix测试软件实操
  15. 神经网络如何识别图像,神经网络图像识别技术
  16. 新世纪大学英语(第二版)综合教程第一册 Unit 3 (中英翻译和重点单词)
  17. 程序员转行可以做什么?
  18. 基于CAD等高线的流域边界绘制
  19. 融资规模似雪球越滚越厚,谁能抢占工业互联网的制高点?
  20. 【2021版】想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(二)

热门文章

  1. surface装双系统后在移动硬盘上装ubuntu系统
  2. icon小图标的使用
  3. centos彻底删除文件夹、文件命令
  4. mac zoc ssh工具
  5. 各种复杂网络处理工具
  6. 使用UDP实现群聊聊天室
  7. 几行Python代码画皮卡丘
  8. 从微信提示用户浏览器打开
  9. 探秘苏宁金融升级版秒杀系统
  10. 秋招手撕代码:4bit转换为1bit,且是慢时钟域到快时钟域