【方向盘】JavaSE/EE基础面试题、基础知识记录---大杂烩(下)

简介: 【方向盘】JavaSE/EE基础面试题、基础知识记录---大杂烩(下)

implements后面可以写多个吗?extends后面可以写多个吗?


现在我有一个长度为1 的Map,怎么最快速,最简便的代码把里面的Entry拿出来(key和value)


答案:

Map.Entry<String, String> next = map.entrySet().iterator().next();


这里面主要考的是JavaEE的基本功眨不扎实,能不能运用自如


请写出数组初始化的四种方式:


1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;


2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;


3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化;


4.看代码吧:利用Array.newInstance

Integer[] integers = (Integer[]) Array.newInstance(Integer.class, 10);
System.out.println(integers.length); // 10


hashCode()与equals()的相关规定如下例子什么结果?


如下例子什么结果?


    public static void main(String[] args) {
        // 备注:若Child类没有重写equals方法,结果是怎样的?
        Child child1 = new Child();
        Child child2 = new Child();
        System.out.println(child1 == child2); // false
        System.out.println(child1.equals(child2)); // false
    }
//由此可以看出,假若你没有重写hashCode()方法,equals比较也会是false的


1.如果两个对象相等,则hashcode一定也是相同的


2.两个对象相等,对两个对象分别调用equals方法都返回true


3.两个对象有相同的hashcode值,它们也不一定是相等的


4.因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖(这算是一个规定)


5.hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)



finally块什么时候不会被执行?try里的return和finally的return返回值问题你理解吗?

在finally语句块第一行发生了异常

在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行

程序所在的线程死亡。

关闭CPU。


关于try finally返回值问题:


如果try语句里有return,返回的是try语句块中变量值。 详细执行过程如下:

5. 如果有返回值,就把返回值保存到局部变量中;

6. 执行jsr指令跳到finally语句里执行;

7. 执行完finally语句后,返回之前保存在局部变量表里的值。

8. 如果try,finally语句里均有return,忽略try的return,而使用finally的return.


所以如下返回结果,一目了然吧:


    public static void main(String[] args) {
        System.out.println(fun()); //2  最终返回的是finally里的值,这点需要注意   try里面是不会被返回的
    }
    private static String fun() {
        try {
            return "1";
        } finally {
            return "2";
        }
    }

子类继承父类,构造方法问题

class Parent {
    // 不给无参构造
    public Parent(String a) {
    }
}
class Son extends Parent {
    public Son() {
    }
    public Son(String s) {
    }
}
报错吗?
答案:编译报错


Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,

因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法,,所以上面可以两种方法解决编译报错:


1、给Parent一个空构造


2、显示调用父类无参构造


class Son extends Parent {
    public Son() {
        super("a");
    }
    public Son(String s) {
        super(s);
    }
}


字符型(char)常量和字符串常量(String)的区别


1 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符

2 含义上: 字符常量相当于一个**整形值( ASCII 值),**可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)

3 占内存大小 字符常量只占2个字节 字符串常量占若干个字节(至少一个字符结束标志) (注意: char在Java中占两个字节)


    public static void main(String[] args) {
        char a = 'a';
        System.out.println(a); //a
        System.out.println((int) a); //97
        System.out.println(a + 10); //107   可以直接做加法运算
        String b = "b";
        System.out.println(b); //b
        System.out.println(b + "10"); //b10  进行了拼接
    }


image.png


请举几个例子,你认为是JDK的bug的问题

例子一:三目运算法的bug

public static void main(String[] args) throws Exception {
        int i = true ? null : 0;
        System.out.println(i);
    }

这样编译不为null,感觉i可议赋值为null一样。但是运行时报错:


Exception in thread "main" java.lang.NullPointerException


例子二:java泛型的bug


比如常见的从MyBatis查出来的数据,类型匹配出错~~


SQL


1、MySQL聚合函数count(1) sum(1)结果返回0还是NULL?


count(1)或者count(*)


   返回为0:如果所查询的表或者where条件筛选后得到的结果集为空,则 count(1)返回为 0。如:


       select count(id) from test;


       select count(id) from test where id < 0;


    返回为NULL


       如果所查询的表或者where条件筛选后得到的结果集为空且当前层查询中使用了           group by ,则 count(1)返回为 NULL 如:


           select count(id) from test where id < 0 group by id;


      那那种情况,怎么让它返回0呢??? 使用函数:

           SELECT COUNT(*) FROM ( 原来的SQL )


sum(1)


   返回为NULL


       如果所查询的表或者where条件筛选后得到的结果集为空 ,则 sum(1)返回为 NULL 如

            select sum(id) from test where id < 0;


       那怎么解决呢?可以使用IFNULL函数(注意:上面count用IFNULL函数无效) 如:

            select IFNULL(sum(id),0) from lp_student where id < 0;


常见异常信息如下:org.apache.ibatis.binding.BindingException: Mapper method 'com.xx.xx.xx.xx.xx.getCount attempted to return null from a method with a primitive return type (int).


2、count(1)和count(*)和count(列)有什么区别呢?


往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。


解释:

Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)


对于Count(列)来说,同样适用于上面规则



相关文章
|
6月前
|
存储 安全 Java
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day03】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day03】——JavaSE
67 0
|
6月前
|
安全 Java 大数据
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day01】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day01】——JavaSE
74 0
|
开发框架 分布式计算 Java
【面试题精讲】JavaSe和JavaEE的区别
【面试题精讲】JavaSe和JavaEE的区别
|
6月前
|
缓存 NoSQL Java
JavaSE面试题(一)
JavaSE面试题(一)
JavaSE面试题(一)
|
6月前
|
存储 前端开发 算法
毕业季--JavaSE高级面试题
毕业季--JavaSE高级面试题
|
6月前
|
Java 大数据
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day04】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day04】——JavaSE
64 0
|
6月前
|
存储 安全 Java
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day02】——JavaSE
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day02】——JavaSE
56 0
|
6月前
|
安全 JavaScript Java
JavaSE面试题(二)
JavaSE面试题(二)
|
XML 安全 Java
JavaSE基础面试题(精简版)
把CPU处理器与操作系统的整体叫平台
42 0
|
Java 大数据
Java大数据面试复习30天冲刺 - 日积月累,每日五题【Day04】——JavaSE
线程的生命周期:线程要经历新建、就绪、运行(活动)、阻塞和死亡五种不同的状态。这五种状态都可以通过Thread类中的方法进行控制。
104 0