这些坑你一定填过!

前言

金九银十招聘季,正是求职面试的时候。俗话说机会都是留给有准备的人的,所以无论是有过开发经验还是刚刚走出校门的应届生,面对机会也是要提前准备的。HR的面试我们就不说了,专业面试一般分为笔试和上机。但是大部分是笔试,要求比较高的可能会让你上机。当然这也是要看公司的。

欲善其事,先利其器

  1. 请问下面输出的结果是什么?
public class demo01 {
     public static void main(String[] args) {
          String strBerPath = "demo.wx.";
          String strRearPath = "demo01.class";
          String classFile = strBerPath. replaceAll(".", "/") + strRearPath;
          System.out.println(classFile);
      }
}

结果:

A. demo.wx
B. demo/wx/demo01.class
C. ////////demo01.class
D. demo.wx.demo01

看到这里你有答案了吗?正确答案是C

replaceAll()方法使用给定的参数替换字符串所有匹配给定的正则表达式的子字符串。第一个参数表示,匹配此字符串的正则表达式。第二个参数表示,用来替换每个匹配项的字符串。而".“在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成”/"。如果想替换的只是".",那么就要写成"\."

从新写一遍,试试看

public static void main(String[] args) {
	String strBerPath = "demo.wx.";
	String strRearPath = "demo01.class";
	String classFile = strBerPath. replaceAll("\\.", "/") + strRearPath;
	System.out.println(classFile);
}

运行结果:
在这里插入图片描述
是不是感觉第一题很简单?别着急这只是热热身,坑还在后面。

  1. 请给出下面的结果
public class demo02 {

    public static void main(String[] args) {
        switch (num) {
            case 01:
                System.out.println("星期一");

            case 02:
                System.out.println("星期二");

            case 03:
                System.out.println("星期三");

            case 04:
                System.out.println("星期四");

            case 05:
                System.out.println("星期五");

            default:
                System.out.println("休息");
        }
    }
}

当num=01的时候输出什么结果?正确答案是:星期一 星期二 星期三 星期四 星期五 休息

jdk7之前switch表达式只接收int的兼容类型(byte 、char 、short 、 int )。之后多加了一个String类型。switch函数的工作原理是,找到第一个满足条件的结果后,输出后续全部结果。若想找到匹配的结果后不再执行后续,可以加入break;跳出函数代码块。

  1. 包装类,给出下面结果:
public class demo03 {
    public static void main(String[] args) {
       Integer i = 127;
       Integer j = 127;
        System.out.println(i == j);
    }
}

正确答案true

这题应该没什么问题,那么请看这一题:

public static void main(String[] args) {
       Integer i = 128;
       Integer j = 128;
        System.out.println(i == j);
    }

正确答案false

仔细看看这两道题到底哪里不一样?为什么一个是true,一个是false呢?原因在于Integer存在一个范围(-128-127),如果超出了范围,会从堆区new一个Integer对象来存放值,所以结果为false。Integer是直接赋值,且在范围内,所以是在常量池中开辟出同一个空间来存放127,i、j都指向127。

  1. 数组转换为List
public class demo04 {
    public static void main(String[] args) {
       String[] str = new String[]{"星期一","星期二","星期三","星期四","星期五"};
       List<String> list = Arrays.asList(str);
       list.add("休息");
        System.out.println(list.size());
    }
}

运行结果报错
在这里插入图片描述
第十行对应的代码是list.add(),是不是有点蒙了?这个怎么会报错呢?是因为调用Arrays的asList()方法将数组转换成List时返回的是Arrays的静态内部类ArrayList,它自身并没有重写add()方法,而其父类AbstractList实现的add()方法只会抛出UnsupportedOperationException,所以我们调用的是只会抛出UnsupportedOperationException的AbstractList的add()方法,这就是异常出现的原因了

  1. String类型
public class demo06 {

    String str = new String("good");
    char[] ch = {'a','b','c'};
    public static void main(String[] args) {
        demo06 ex = new demo06();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str +"and");
        System.out.print(ex.ch);
    }

    public void change(String str, char ch[]){
        str= "test ok";
        ch[0]= 'g';
    }

}

结果:
A. test okandabc
B. test okandgbc
C. goodandabc
D. goodandgbc

正确答案:D

因为String是一个final修饰的不可变类。str指向"good",在change方法中作为参数会复制一个副本引用对象传入,str指向"testok",但是原来的“good”依然存在字符串常量池中。所以str依然指向"good"。char[]数组作为参数传入时传入的是引用传递(会改变原来的值)。而String传递的是引用的副本(不会改变原来的值)。

原创文章 9 获赞 19 访问量 3317

猜你喜欢

转载自blog.csdn.net/qq_29335705/article/details/100926690