有坑点的面试题(关于运行栈和运行时常量池):2017.3.9

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("1");
        change(list);
        System.out.println(list.get(0));
    }
    public static void change(List list) {
        List<String> newList = new ArrayList<>();
        newList.add("2");
        list = newList;
    }

我被这段代码忽悠了(╥╯^╰╥)
毫不犹豫的说输出结果是2!
。。。。。。。。。。。。。
刚给面试官说过方法是怎么封装成栈帧的,结果就自己啪啪打自己脸。
事实上,那两个list全都是局部变量,每个栈帧之间是彼此隔离的,方法出栈之后,什么局部变量表、参数表就都消失了,跟他后面的栈帧(调用者)有鸡毛关系啊………..
结果应该是1 !

public void print(){
    .....
    一堆代码
    .....
    String s = new String("123");
    .....
    一堆代码
    .....
}

问String s = new String(“123”)这句话创建了几个string对象?
在这之前面试官啪啪啪给我讲了一堆关于运行时常量池的定义,凡是用引号引起来的字符串都属于字符串常量,会被放在运行时常量池里。这样一来,结果很明显应该是两个string对象,常量池一个,外面一个,当然这两个都在堆中。
可惜,答案应该是一个或两个,因为”123”这个字符串可能在前面那一堆未知代码中出现过…….

猜你喜欢

转载自blog.csdn.net/nvnnv/article/details/60967352