exam1-java

双重检查锁的单例模式

public class Singleton {
        private static volatile Singleton singleton;

        private Singleton() {
        }

        public static Singleton getInstance() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }

    }

HashMap 取值 一个value有三个abc字符串

public class CountABC {
    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(1, "abcdabcabc");
        map.put(2, "abcdabc2abc");
        map.put(3, "abcdabc3232abc");
        map.put(4, "123abcdabcabc213123");
        map.put(5, "asdsfasdf");
        map.put(6, "asdabc,dfasabcabcasds");
        System.out.println(countABC(map));
    }

    private static int countABC(HashMap<Integer, String> map) {
        int i = 0;
        // HashMap 遍历方式
        // Iterator iterator = map.keySet().iterator();
        // while (iterator.hasNext()) {
        //     Integer key = (Integer) iterator.next();
        //     String value = map.get(key);
        //
        // }
        // // 遍历方式2  
        Iterator<Map.Entry<Integer, String>> iterator1 = map.entrySet().iterator();
        while (iterator1.hasNext()) {
            Map.Entry<Integer, String> entry = iterator1.next();
            String value1 = entry.getValue();
            int j;
            //  我想的一个方法是每遇到一个abc就把字符串截取一下。
            for (j=0; j < 3; j++) {
                int result = value1.indexOf("abc");
                if (result != -1) {
                    value1 = value1.substring(result + 3);
                } else {
                    break;
                }
            }
            if (j == 3) {
                i++;
            }
        }
        // 遍历方式3  jdk1.8
        // map.forEach((key,value)->{
        //     Integer key3 = key;
        //     System.out.println(key);
        //     String value3 = value;
        //     System.out.println(value3);
        //
        //
        // });
        return i;
    }
}

编译错误与运行时错误

编译错误 一般指逻辑错误,比如缺少括号,缺分号等,还有一类如局部变量没赋初始值、调用不存在的方法等
一般编译器如Eclipse、idea会帮我们识别这类错误。
运行时错误 一般指我们出现的exception,如NullPointerException,ArrayIndexBoundOutOfRangeException

选择题

  • 子类调用从父类继承过来的方法

    这里要区分继承多态的概念, 多态分为运行时多态编译时多态方法重载都是编译时多态。根据实际参数的数据类型、个数和次序, Java在编译时能够确定执行重载方法中的哪一个。方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态运行时多态是多指父类指向子类的引用,并且子类重写父类的方法 ,当父类指向子类的引用调用子类独有的方法时会报编译时错误

  • 不管构造方式是什么修饰符,当我们初始化这个类的实例时,都会调用他的构造方法

    单例模式的构造方法就是使用private修饰符修饰, Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。 单例模式又分为懒汉式饿汉式懒汉式是延时加载,只有使用的时候才会加载;并且有线程安全的考量。饿汉式是立即加载,论是否会用到这个对象,都会加载

  • 初始化顺序

    父类静态变量-父类静态初始化块-子类静态变量-子类静态初始化块 父类初始化快,构造方法-子类初始化快,构造方法

    静态代码块只会初始化一次,初始化子类时也会调用父类的非静态代码块构造方法

    静态变量是所有对象共享

  • i++;++i;return i++; return ++i; i=i++;i=++i;

    i++: 先赋值后运算

    ++i: 先运算后赋值

      TODO 待办

Last updated