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

    xiaoxiao2021-03-25  91

    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”这个字符串可能在前面那一堆未知代码中出现过…….

    转载请注明原文地址: https://ju.6miu.com/read-15794.html

    最新回复(0)