有坑点的面试题(关于运行栈和运行时常量池):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”这个字符串可能在前面那一堆未知代码中出现过…….

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值