最近接触了一个在线测试系统,感觉这个评估系统还不错,对Java基础方面考察的较为全面,特地在做的过程中用截图软件记录下来,让大家也可以自测下,评估自己对Java基础的掌握程度。文末附上了个人测试的样例报告,从报告中可以看出测试题目所属考察内容及熟练度掌握程度概览。
测试内容均是英文展示,可能需要有些英文基础。
下面开始正文啦!(PS:由于时间仓促,同一题部分内容可能存在重复截取的现象,少部分题缺失,总题数约54题,180分钟内完成,不定向选择,每题最多三个答案。另由于本人水平有限,在进行解答时难免会有疏漏,恳请批评指正。)
Q1:
- 考察内容:集合(List,Collections)、Comparator。
- 解析:从已知的集合和给出的输出结果可以看出是根据firstName升序,lastName升序,并排除Mary,再根据排除法迅速找出答案。④虽然进行了firstName升序并排除了Mary,但并未指定lastName排序方式,按names原有顺序输出,不符合条件
- 参考答案:⑤
Q2:
- 考察内容:Jar包使用
- 解析:Jar可通过classpath、类加载器和manifest等方式加载,但是不能将其解压后使用。
- 参考答案:②③
Q3:
- 考察内容:Integer、逻辑运算符
- 解析:逻辑或、与操作具有逻辑短路特性
- 参考答案:⑤
Q4:
- 考察内容:Math类的使用
- 解析:Math无常量G
- 参考答案:②④⑤
Q5:
- 考察内容:多线程
- 解析:final class使类不可变,线程安全,如String;static变量为类实例共享,无法保证线程安全
- 参考答案:②③⑤
Q6:
- 考察内容:国际化
- 解析:ResourceBundle在读取资源配置文件时,文件名要遵从特定的命名规则
- 参考答案:③④
Q7:
- 考察内容:类的多态、静态方法
- 解析:由于方法为静态的(与具体实例无关),在使用类实例调用时不会存在多态的现象;类之间无法进行强转
- 参考答案:⑤
Q8:
- 考察内容:TreeSet
- 解析:TreeSet根据指定的排序规则判断key是否有重复,有则忽略,无则添加。这点注意和HashSet区分,HashSet是根据key的hashcode判重
- 参考答案:③
Q9:
- 考察内容:JDK1.8引入的新的日期类LocalDate
- 解析:阅读源码可以发现,y数量的不同有不同的展示结果,如题日期,y为1、3、4位时,按实际位数展示,2位展示年份后两位,大于4位时前面填充0;M为1位时按实际位数展示(即1-9月前面不填充0),2位不足部分填充0,3位为英文简写,4位为英文全称,5为首字母,大于5位运行时错误;d为1位时按实际位数展示,2位时不足部分填充0,大于2位运行时错误;E代表周几,1-3位英文简写,4位英文全称,5位首字母,大于5位运行时错误
- 参考答案:③
Q10:
- 考察内容:异常
- 解析:异常分为运行时异常和检查时异常(非运行时异常)
- 参考答案:③
Q11:
- 考察内容:类构造器、变量访问
- 解析:内部类可直接操作外部类变量
- 参考答案:②
Q12:
- 考察范围:IO流
- 解析:构造器的使用,②④⑤无相关的构造器
- 参考答案:①③
Q13:
- 考察内容:注解、类命名、package
- 解析:package必须声明在源文件的最前面;注解和类同名时不能在同一个package下
- 参考答案:①③
Q14:
- 考察内容:JDK1.8新增的Stream
- 解析:Stream.reduce三种重载方法的使用,编号①Character无此构造器,编译错误;编号③是筛选集合中长度最大的字符串
- 参考答案:②④⑤
Q15:
- 考察内容:Integer
- 解析:前两行代码可知,number1和number2指向同一对象,第三行时,number1进行了自增,由于Integer是final的,在修改时,原有的实例指向了新的对象。
- 参考答案:④
Q16:
- 考察内容:内部类
- 解析:内部类可以访问外部类所有变量和方法,外部类访问内部类时需要初始化内部类实例
- 参考答案:③⑤
Q17:
- 考察内容:this()和super()的使用
- 解析:this()&super()仅可在构造器中使用,且必须放在构造器中第一行,子类默认调用父类构造器
- 参考答案:③⑤
Q18:
- 考察内容:JVM内存管理
- 解析:编号①,执行finalize函数线程优先级较低,执行时间不确定,异常不会导致垃圾收集暂停;编号②,同样System.gc()优先级也较低,执行时间不确定;编号③,垃圾收集对系统性能影响较大,如吞吐量;编号④,垃圾收集并不能确保不会发生内存泄漏,如参数设置不当时,即使执行垃圾收集,依然有内存泄漏风险;编号⑤,进行垃圾收集前准备工作时,会先调用finalize(),在下一次垃圾回收时,会真正的回收对象内存
- 参考答案:⑤
Q19:
- 考察内容:异常
- 解析:②无CheckedException,④不属于异常
- 参考答案:①③
Q20:
- 考察内容:类的创建
- 解析:一个类文件中可以声明多个类,但最多有一个类声明为public,且该类名与文件名一致。此外,亦不可以使用private/protected声明其他类
- 参考答案:③
Q21:
- 考察内容:Stream、Collectors使用
- 解析:从输出结果中可以看出,是将姓名集合中名字字母数作为键,名字(转为小写)作为值的Map格式输出,并通过某些条件过滤掉部分数据。这里需要了解Collector类,查阅源码可知,其范型由三种类型(按顺序分别为T-输入元素类型,A-规约操作可变的累积类型,R-规约操作结果类型)构成。②④分别是TreeSet和String,不支持forEach遍历,编译时错误
- 参考答案:①③⑤
Q22:
- 考察内容:IO流
- 解析:ByteArrayOutputStream的write有两种重载方法,一个参数时其size增1,三个参数时size增加第三个参数指定长度
- 参考答案:①
Q23:
- 考察内容:国际化Locale
- 解析:Locale对象初始化方法,查看源码可知答案
- 参考答案:③④⑤
Q24:
- 考察内容:接口
- 解析:无
- 参考答案:①③
Q25:
- 考察内容:接口
- 解析:接口中的变量默认final,初始化后无法再次修改
- 参考答案:①
Q26:
- 考察内容:类初始化相关
- 解析:对于有父类的情况,class初始化顺序:static对象/代码块(先父后子)->成员变量/代码块-构造器(先父类成员变量/代码块,再父类构造器,子类同父类)
- 参考答案:⑤
Q27:(可能由于较为简单,忘了截了)
Q28:
- 考察内容:类成员变量初始化
- 解析:类成员变量在未指定值时,有默认值,布尔false,整型变量0,String为null,浮点型0.0
- 参考答案:③
- 考察内容:方法重载
- 解析:无
- 参考答案:③
Q29:
- 考察内容:函数式编程
- 解析:Lambda表达式是函数式编程常见的方式之一,接口是封装特性的表现形式之一,隐藏具体实现细节
- 参考答案:①②
Q30:
- 考察内容:多线程
- 解析:无
- 参考答案:②④⑤
Q31:
- 考察内容:Formatter使用
- 解析:查阅源码,Formatter内部维护一个Appendable对象,每进行一次format操作,将新的参数按对应规则加入到指定位置。请参考官方说明文档
- 参考答案:②
Q32:
- 考察内容:JVM
- 解析:原话意思是垃圾收集会导致性能下降,有人怀疑是和应用显示调用System.gc()有关。那么很简单,我们禁用显示调用gc()功能就可以验证是否是显示调用导致的性能问题。虚拟机参数由选项名称中即可看出正确结果
- 参考答案:⑤
Q33:(漏截)
Q34:
- 考察内容:java基础
- 解析:无
- 参考答案:③
Q35:
- 考察内容:ClassLoader
- 解析:实例属于同一类型的判定标准为同一类加载器加载,且完全限定名一致。限定名一致但属于不同类加载器,则属于不同对象
- 参考答案:②
Q36:
- 考察内容:Java面向对象基础
- 解析:基本数字类型或其包装类型在进行自增时,其指向的栈地址发生变化,可通过Objects.hashCode(Object o)观察
- 参考答案:③
Q37:
- 考察内容:国际化(Locale)
- 解析:参考源码
- 参考答案:⑤
Q38:
- 考察内容:自增运算符,HashMap
- 解析:HashMap的顺序是根据其key的hash值来处理的。自增在语句(自增)结束后,其值才真正改变。如int i=0;int j = i++ + ++i;变量j最后的值为2,进行++i前,读取的i为1,进行++i时,先自增,i为2。
- 参考答案:③
Q39:
- 考察内容:Supplier,Consumer接口
- 解析:主要考察Consumer中andThen(Consumer<? super T> after)用法,先执行第一个Consumer,然后再执行andThen中指定Consumer
- 参考答案:④
Q40:
- 考察内容:内存泄漏
- 解析:参考解释。静态集合类与程序生命周期一致,其引用的Object可能无法被回收;资源(网络、数据库等)未及时关闭,连接无法释放;
- 参考答案:①②⑤
Q41:
- 考察内容:Set
- 解析:LinkedHashSet保持原有输入顺序基础上,新增仍然保持Set不重复特性,即添加相同Object时,替换原有Object,底层实现参考HashMap的put(K key, V value)函数
- 参考答案:①
Q42:
- 考察内容:Java基础
- 解析:②字符串null无法转换为int类型,应为NumberFormatException;④不论外层加多少引号,最终处理后只带一对引号
- 参考答案:①③
Q43:
- 考察内容:并发集合
- 解析:无
- 参考答案:②④
Q44:
- 考察内容:多线程
- 解析:StringBuilder是线程不安全的;引起线程安全的主要原因是多个线程操作共享资源,如静态变量、全局变量,此外局部变量逃逸也会造成线程安全问题
- 参考答案:②③⑤
Q45:
- 考察内容:接口
- 解析:抽象方法无法在运行时返回相关信息,需要有具体实现
- 参考答案:④
Q46:
- 考察内容:成员变量初始化
- 解析:静态变量或代码块优先按顺序进行初始化,number2通过getValue()进行初始化,此函数又将number1返回,此时number1未进行初始化,返回默认值0
- 参考答案:①
Q47:
- 考察内容:抽象类
- 解析:接口声明的方法会被隐式指定为public abstract,子类覆写时,重写的方法访问范围要大于等于父类中的方法,如题中MyInterface的method1()为public,Parent中method1()必须声明为public的
- 参考答案:①③
Q48:
- 考察内容:类初始化顺序、IO流
- 解析:这里值得注意的是,Java中在构造一个对象时,首先会先构建父类对象,再构建子类对象。序列化时,如果父类未实现序列化接口,子类实现序列化接口,则仅有子类会被序列化,若父类也实现了序列化,则父类子类都会被序列化。反序列化子类对象时,如果父类未实现序列化,则会重新调用父类默认构造器创建父类对象,若父类实现序列化,则不需要再调用父类默认构造器。这里可以将父类也实现序列化接口进行验证
- 参考答案: ③
Q49:
- 考察内容:类初始化
- 解析:无
- 参考答案:①
Q50:
- 考查内容:Java基础
- 解析:jar包使用问题,②此种方式是临时的,关闭当前命令窗口后配置失效
- 参考答案:①②
Q51:
- 考察内容:Stream API
- 解析:无
- 参考答案:③
Q52:
- 考察内容:Java基础
- 解析:无
- 参考答案:①⑤
Q53:
- 考察内容:方法引用
- 解析:①Collection不支持函数式编程,无法使用方法引用,编译错误;②Supplier未指定泛型类型,方法第一行类型转换编译错误
- 参考答案:④
Q54:
- 考察内容:类加载器
- 解析:参考文档,①首先调用loadClass(),内部调用findLoadedClass(),若未加载,调用父加载器loadClass(),父类加载器无法加载该类的话,就调用
findClass()
方法来查找该类;⑤classLoaderDemo写法有问题,第一点类实例未定义,第二点类实例无法直接使用.class形式,第三点此类为自定义类,此类加载器的父加载器为扩展加载器,无法加载此类- 参考答案:③④
以上基本就是测试的所有内容,总的来说题目考察Java SE 8新特性偏多。做完之后会有类似如下的报告,从中可以看出个人各个知识点掌握熟练度。