前言:
这段算是比较痛苦的回忆了。那时候学java真的是意气风发了,盘里存了10个G视频java基础视频,居然都看完了。同时花费大量的时间在看视频,视频总的来说是入门,教你怎么使用却缺少原理(这些是稳扎稳打的基础呀,视频没教的)。可笑当时还很自信,直到参加了那个考试,100份的选择填空,仅仅只拿了11.67份(选择题5分一题)。
下面是整理出的之前做的题目。
附:个人理解解析
第一题:
package com.wen.demo.test.MyClass;
class Study {
static String s = "";
protected Study() {
s += "study";
}
}
class GoodStudy extends Study {
private GoodStudy(){
s += "good";
}
}
public class GoodGoodStudy extends Study{
private GoodGoodStudy() {
s+="goodgood";
}
public static void main(String[] args) {
new GoodGoodStudy();
//试问输出结果是什么
System.out.println(s);
}
}
答案: study goodgood
解析:这一题考的东西不多,但是考的却很细,主要考类的加载,也有虚拟机的双亲委派模型,还考了一些主动使用,总体来说很考验基础。这题不多说,如果不懂的请看之前写的两篇博客类的加载(一)和类的加载(二)。
第二题:
package com.wen.demo.test.MyClass;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String > list = new ArrayList<>();
list.add("zZzZ");
list.add("ZzZ");
list.add("zZz");
list.add("ZZzz");
// /排序
Collections.sort(list);
for (String s :list){
System.out.print(s+" ");
}
}
}
答案:ZZzz ZzZ zZz zZzZ
解析:这一题就是考排序了,怎么排序呢?可以看看Collections.sort(str)的源码。里面是将集合转成Object[]后,使用数组的排序,也就是Array.sort()这个排序。这里的排序,主要是字符串的排序,而字符串中是将该字符串的首字母转换成ASCII码后进行比较。例如:ZZzz字符串,获取首字母Z,对应的ASCII码十进制是90,小z的ASCII码十进制是122,如果相同则第二个字母进行大小对比。直至排出顺序。
第三题:
package com.wen.demo.test.MyClass;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
String a= null;
//这个方法我真的没用过,原谅我基础太弱
a.concat("abc");
a.concat("def");
System.out.println(a);
/**
* 例如:
* String a=null
* a.concat(null);
* 上述两个都不允许,会报异常
*/
}
}
答案是:空指针异常
解析:concat()方法是用于拼接字符串。在在字符串的末尾拼接。他合+号类似的拼接,主要区别如下:
(1)+和cancat()都可以用作拼接,cancat()只能接收字符串进行拼接,+也可以接收其他类型
(2)+左右都可以为空,但是cancat()会报异常,如上例子
(3)如果拼接空字符串,concat会稍快,在速度上两者可以忽略不计,如果拼接更多字符串建议用StringBuilder。
(4)从字节码来看+号编译后就是使用了StringBuiler来拼接,所以一行+++的语句就会创建一个StringBuilder,多条+++语句就会创建多个,所以为什么建议用StringBuilder的原因。
第四题:这题很好玩,请看清楚
package com.wen.demo.test.MyClass;
public class Test {
public static void main(String[] args) {
int i=2;
if(3=++i){
System.out.println("cool");
}else{
System.out.println("cool java");
}
}
}
下面给4个答案:
-
A 编译失败
-
B cool
-
C java
-
D cool java
答案是A,为什么请仔细看题,别问我为什么?因为这是个坑,半年前我就死在不细心上。
第五题:
下面哪些语句会产生编译错误?
A Object[] scores = {new Integer(3), 5.5, "7" + 6};
B int[][] scores = {2, 7, 6}, {9, 3, 45};
C String cats[] = {"Fluffy", "Spot", "Zeus"};
D boolean results[] = new boolean[3] {true, false, true};
E Integer results[] = {new Integer(3), new Integer(5), 8};
F String[] dogs = new String[] {new String("Fido"), new String("Spike"), "Aiko"};
答案:BD
这个就是语法问题了,唉,这个编译器用多了,拿到卷子上。。。分分钟出事,手写代码也是一门基本功呀,即考了单词,还考语法。服气。
第六题:
public class JavaFX {
public static void main(String[] args) {
String s1 =new String("a")+"bc";
String s2 ="ab"+ new String("c");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1=="abc");
System.out.println(s1.intern()=="abc");
System.out.println(s1.intern()==s2.intern());
}
}
答案:false true false true true
解析:new String()是在堆区创建的内存区域,地址是不同的。所以s1是不等于s2的。
equals()方法比较的是字符串的内容,内容是一致的
“abc”是常量了,在常量池中,s1是在堆中的。
intern()方法设计出来就是为了重复利用,其实,就是将我们new出来在堆区域中的字符串在调用Intern()后放到常量池中。
如果常量池中有了这个字符串,那么会返回这个常量的引用。所以,返回true
最后一个,和上面一样理解。
总结:
唉,对于基础薄弱是太多的无奈,其实综合很多面试题,很大一部分都是基础,只是基础到不能在基础,也就是太基础了,我们往往会忽略,最终导致面试的失败。过度依赖编译器也是一个痛点,终于明白为什么以前老师不让我们用编译器了,用记事本来写,这 都是基础呀。很遗憾错过了,现在只能一点点的啃,补充自己的基本功。上面的题,是我之前参加一个java基础竞赛的赛前题目,深刻的了解到不足,但是我却在半年后才开始补自己的基础,也是一个很遗憾的事。希望大家掌握基础,然后走的更远。祝大家学习进步,事业有成。