美文网首页
Java面试宝典 1.13~1.12【2020.5 Beta版】

Java面试宝典 1.13~1.12【2020.5 Beta版】

作者: Java_Pro | 来源:发表于2020-05-28 23:23 被阅读0次

    1.Java基础

    1.1 Java基础部分的顺序

    Java基础顺序

    1.2 Java中有没有goto?

    有,但是现在并没有使用,和const一样都是保留字。

    1.3 谈谈 & 与 && 的区别

    相同点是都可以做逻辑与的关系,表示and

    不同的是 && 带有短路功能,从左往右,如果碰到一个为false,就不会往后判断执行

    例如

    
    // A true B false C true
    
    if(A && B && C){}
    
    // 那么 执行到B后就停了,不会再去执行C
    
    

    来看一个面试题

    
    Stirng s = null;
    
    if((s!=null) & (s.length == 0)){}
    
    if((s!=null) && (s.length == 0)){}
    
    

    第一个会抛出异常,所以日常判断null时,看情况大概率要使用 &&

    1.4 Java 中如何跳出多重循环?

    1. 使用带有标号的break语句
    
    public class TestFor {
    
        public static void main(String[] args) {
    
            break_status:
    
            for (int i = 0; i < 10; i++) {
    
                for (int j = 0; j < 10; j++) {
    
                    System.out.println(String.format("i--%d,j--%d", i, j));
    
                    if (j == 1) {
    
                        break break_status;
    
                    }
    
                }
    
            }
    
        }
    
    }
    
    
    1. 外层循环受到内层循环的条件控制
    
    public class TestArray {
    
        public static void main(String[] args) {
    
            int[][] ary = {{1, 2}, {3, 4}, {5, 6}};
    
            boolean flag = false;
    
            for (int i = 0; i < ary.length && !flag; i++) {
    
                for (int j = 0; j < ary[i].length; j++) {
    
                    System.out.println("ary[i][j]:" + ary[i][j]);
    
                    if (ary[i][j] == 3) {
    
                        flag = true;
    
                        break;
    
                    }
    
                }
    
            }
    
        }
    
    }
    
    

    1.5 switch 可以作用在哪些数据类型上?

    (1) char, Character

    (2) byte, Byte

    (3) short, Short

    (4) int, Integer

    (5) String enum(枚举)

    1.6 下述switch 的输出是什么?

    
    public class TestSwitch {
    
        public static void main(String[] args) {
    
            int i = 2;
    
            switch (i){
    
                case 1:
    
                    System.out.print(1);
    
                case 2:
    
                    System.out.print(2);
    
                case 3:
    
                    System.out.print(3);
    
                default:
    
                    System.out.print(4);
    
            }
    
        }
    
    }
    
    

    输出 234 ,匹配到了2,没有break,所以继续运行,第一次匹配到了case之后,后面的case就和goto标号一样了,没什么用继续输出

    1.7 short s1=1;s1 =s1+1,有什么错误?short s1=1;s1+=1;有什么错?

    在这里插入图片描述

    1.8 char类型中可以存储一个中文汉字吗?

    char是按照字符存储的,不管英文还是中文,固定占用占用2个字节,用来储存Unicode字符

    unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字

    在这里插入图片描述

    1.9 用最有效的方法算出2*8=?

    2 << 3

    因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可

    1.10 百亿计算器的实现

    
    public class CalculationUtils {
    
        // 除法保留小数位
    
        private final static int ROUND_SCALE = 6;
    
        @SafeVarargs
    
        public static <T extends Number> BigDecimal add(T... arg) {
    
            if (null != arg) {
    
                BigDecimal res = BigDecimal.ZERO;
    
                for (T num : arg) {
    
                    if (null != num) {
    
                        BigDecimal argTranser = getBigDecimal(num);
    
                        res = res.add(argTranser);
    
                    }
    
                }
    
                return res;       
    
            } else {
    
                return BigDecimal.ZERO;
    
            }
    
        }
    
        @SafeVarargs
    
        public static <T extends Number> BigDecimal div(T... arg) {
    
            if (null != arg) {
    
                BigDecimal res = BigDecimal.ZERO;
    
                for (int i = 0; i < arg.length; i++) {
    
                    BigDecimal argTranser = getBigDecimal(arg[i]);
    
                    if (i == 0) {
    
                        res = argTranser;
    
                    } else {
    
                        res = res.divide(argTranser, ROUND_SCALE, RoundingMode.HALF_UP);
    
                    }
    
                }
    
                return res;
    
            } else {
    
                return BigDecimal.ZERO;
    
            }
    
        }
    
        public static <T extends Number> BigDecimal getBigDecimal(T num) {
    
            BigDecimal argTranser;
    
            if (num instanceof Float) {
    
                argTranser = new BigDecimal(String.valueOf(num));
    
            } else {
    
                argTranser = BigDecimal.valueOf(num.doubleValue());
    
            }
    
            return argTranser;
    
        }
    
        @SafeVarargs
    
        public static <T extends Number> BigDecimal mul(T... arg) {
    
            if (null != arg) {
    
                BigDecimal res = BigDecimal.ZERO;
    
                for (T num : arg) {
    
                    if (null != num) {
    
                        BigDecimal argTranser = getBigDecimal(num);
    
                        res = res.multiply(argTranser);
    
                    }
    
                }
    
                return res;
    
            } else {
    
                return BigDecimal.ZERO;
    
            }
    
        }
    
        @SafeVarargs
    
        public static <T extends Number> BigDecimal sub(T... arg) {
    
            if (null != arg) {
    
                BigDecimal res = BigDecimal.ZERO;
    
                for (T num : arg) {
    
                    if (null != num) {
    
                        BigDecimal argTranser = getBigDecimal(num);
    
                        res = res.subtract(argTranser);
    
                    }
    
                }
    
                return res;
    
            } else {
    
                return BigDecimal.ZERO;
    
            }
    
        }
    
    }
    
    

    1.11 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    在这里插入图片描述

    得出

    • 引用不能变

    • 引用变量所指向的对象的内容是可以改变

    1.12 Java中==和.equals()方法之间的区别

    在这里插入图片描述

    
    public class TestEquals {
    
        public static void main(String[] args) {
    
            Integer a = 1;
    
            Integer b = new Integer(1);
    
            Integer c = new Integer(1);
    
            Integer d = 1;
    
            Integer f = 129;
    
            Integer g = 129;
    
            System.out.println(a == d);
    
            System.out.println(b.equals(c));
    
            System.out.println(f == g);
    
        }
    
    }
    
    

    输出

    
    true
    
    true
    
    false
    
    

    jvm在运行时创建了一个缓存区域存储了-128至127的值的数组,如果integer的值在-128至127之间,则是去缓存里面获取。因此上面的 a 和 d 指向的是同一个内存地址。

    因为 129 超过了这个缓存区域,所以赋值的时候是新建了两个内存地址

    相关文章

      网友评论

          本文标题:Java面试宝典 1.13~1.12【2020.5 Beta版】

          本文链接:https://www.haomeiwen.com/subject/czctzhtx.html