0
点赞
收藏
分享

微信扫一扫

写面试题中遇到的问题(7)

Sky飞羽 2022-01-28 阅读 88

本文写给正在努力的自己,努力的补基础知识,五道题一篇

ps:我把答案都放在解析下面了

  1. 以下代码输出为多少
public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("b");
        list.add("b");
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals("b")) {
                list.remove(i);
            }
        }
        for (String a : list) {
            System.out.println(a);
        }

    }

初识想法:当小编第一看到这道题的时候,有点蒙,这不就是把链表中的b全部去掉吗?这么简单的题怎么会错呢?但是运行之后才发现并不是
解析:这道题的考点在于for循环中的list.size()每次循环都会被重新计算,也就是第一次执行的时候,list.size()的值为5,。
当执行到第二次循环的时候,查询到第一个b的时候,将它清除掉,但是。
当执行到第三次循环的时候,会重新计算链表长度也就是list.size()的值变为4。
当执行到第四次循环的时候,检查到了第二个b,将它清除。这个时候,链表的长度为3,所以跳出for循环,不再执行第五次循环
我们来答应一下每次for循环时的list.size()就可以验证了
在这里插入图片描述
答案:最后输出的结果为acb,因为最后一个b没有被清除

  1. 以下代码输出为什么?
    class Super {
        int flag = 1;
        Super() {
            test();
        }
        void test() {
            System.out.println("Super.test中的方法" + flag);
        }
    }
    class Sub extends Super {
        Sub(int i) {
            flag = i;
            System.out.println("Sub中的方法" + flag);
        }
        void test() {
            System.out.println("Sub.test中的方法" + flag);
        }
    }
    public static void main(String[] args) {
        new Demo1().new Sub(0);
    }

初识想法:这道题将继承体现的淋漓尽致了,传参,方法的调用,都包含了
解析:1.首先调用父类构造方法,即super()
2.调用test()方法。
3.由于在子类sub()中重写了test()方法,所以 调用子类test()
4.输出Sub.test()flag=1
5.调用sub的有参构造方法
6.输出Sub.Sub() flag=5 重点在于要时刻记得子类重写父类方法, 调用时会 调用子类重写之后的方法
当然, 这一切的前提都是 实例化子类对象
通俗易懂的讲就是:先调用父类的方法,子类有就用子类的,子类没有就用父类的
答案:在这里插入图片描述

  1. 问题:java中是否有多继承?
    初识想法:记得老师说过,c里是有多继承的,但是java没有
    解析:java中接口是有多继承的,但是类没有
    在这里插入图片描述
    但是要注意的是继承对象以及继承者均为接口才能实现多继承,不能继承类
    答案:有

  2. 一个容器类数据结构,读写平均,使用锁机制保证线程安全,如果要综合提高该数据结构的访问性能,最好的办法是:
    A. 只对写操作加锁,不对读操作加锁
    B. 读操作不加锁,采用copyOnWrite的方式实现写操作
    C. 分区段加锁
    D. 无法做到
    解析:
    A 只对写操作加锁,不对读操作加锁,会造成读到脏数据
    B,CopyOnWrite的核心思想是利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用。这里读写平均,不适用
    C, 分段加锁,只在影响读写的地方加锁,锁可以 用读写锁,可以提高效率
    答案:c

  3. 以下代码输出为多少

    public static void main(String[] args) {
        Object o1 = true ? new Integer(1) : new Double(2);
        Object o2;
        if (true) {
            o2 = new Integer(1);
        } else {
            o2 = new Double(2.0);
        }
        System.out.println("o1的值为   " + o1);
        System.out.println("o2的值为   " + o2);
    }

初识想法:三元运算符前都写了true那么o1直接就是等于1了这个考什么呢?
解析:首先三元运算符的判断条件是 true,然后整表达式有Double,所以Object被隐式转换为 Double,否则有数据丢失,编译器不会这样做。最 终机器运行的表达式应该是这样的.因为三元运算符必须保证类型一致, 不一致得到话会自动进行类型提升
答案:
在这里插入图片描述

举报

相关推荐

0 条评论