• 【面试系列】Java面试知识篇(三)


    在这里插入图片描述
    个人简介:

    📦个人主页:赵四司机
    🏆学习方向:JAVA后端开发
    📣种一棵树最好的时间是十年前,其次是现在!
    🔔博主推荐网站:牛客网 刷题|面试|找工作神器
    💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

    前言

    由于很快到了金九银十的秋招季节,博主最近也在找一些面经资源,但是发现很多都不全,后来我发现了牛客网这个网站,发现里面不仅可以看面经,还能刷题模拟面试,要是你要找各种招聘信息也可以在上面找到,我愿称之为程序员必备网站,下面把它推荐给你们!
    链接地址:牛客网

    在这里插入图片描述

    31.静态变量有什么作用

    静态变量可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量,通常情况下静态变量会被final修饰成为常量。

    32.字符常量和字符串常量区别

    • 字符常量一般是用单引号引起的一个字符,而字符串常量则是被双引号引起的0个或多个字符
    • 字符常量其实是一个ASCII值,可以直接参与运算
    • 在Java中,字符常量占2个字节,字符串常量占若干个字节

    33.基本数据类型与包装类型的区别

    • 包装类型不赋值就是Null,而基本数据类型有默认值而不是Bull
    • 包装类型可用于泛型,而基本类型不行
    • 基本数据类型的局部变量存放在Java虚拟机栈的局部变量表中,而基本数据类型的成员变量(未被static修饰)存放在Java虚拟机的堆中。包装类型属于对象类型,而我们知道几乎所有对象都存放在堆中。
    • 相比于包装类型,基本数据类型占用的空间更小。

    为什么说是几乎所有对象实例呢? 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存。

    34.包装类型的缓存机制

    Byte、Short、Integer、Long这四种包装类型默认创建了[-128,127]的相应类型缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean直接返回true或者false。

    Integer源码:

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static {
            // high value may be configured by property
            int h = 127;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Character源码

    public static Character valueOf(char c) {
        if (c <= 127) { // must cache
          return CharacterCache.cache[(int)c];
        }
        return new Character(c);
    }
    
    private static class CharacterCache {
        private CharacterCache(){}
        static final Character cache[] = new Character[127 + 1];
        static {
            for (int i = 0; i < cache.length; i++)
                cache[i] = new Character((char)i);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Boolean源码

    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
    
    • 1
    • 2
    • 3

    如果超出范围会创建新的对象,缓存范围只是在性能和资源之间的权衡,两种浮点数类型Float、Double没有缓存机制。

    例题:

    Integer i1 = 40;
    Integer i2 = new Integer(40);
    System.out.println(i1==i2);
    
    • 1
    • 2
    • 3

    输出是false,因为Integer i1 = 40表示的其实是Integer i1 = Integer.valueOf(40),此时使用的是缓存中的对象,而i2则是新创建的对象。

    注意:包装类对象之间值的比较须用equals来比较,假如数据范围在缓存范围内,可以使用==,但是一旦超出这个范围,这时候就会创建新的对象,这时候即使两个数值相等其==结果也是false。
    在这里插入图片描述

    35.对象实体与对象引用有什么不同

    通过new创建对象实例,对象实例存放在堆中,而对象引用指向对象实例,对象引用存放在栈内存中,一个对象引用可以指向0个或1个对象实例,而一个对象实例能被多个对象引用指向。

    温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
    友情链接:牛客网
    在这里插入图片描述

  • 相关阅读:
    axios登录,登出接口的简单封装步骤详解!
    京东大佬整理的亿级流量架构核心技术,助力智能时代,成就非凡
    全产业链核心升级 集聚创新大展宏图——慕尼黑华南电子展回顾
    spring6-资源操作:Resources
    三维模型体积计算及其注意事项
    【AI视野·今日Sound 声学论文速览 第七期】Tue, 19 Sep 2023
    12.Vue2和Vue3中的全局属性
    strings.xml补充知识
    leetcode算法之分治-快排
    基于SSM的田径运动会成绩管理系统的设计与实现
  • 原文地址:https://blog.csdn.net/weixin_45750572/article/details/126796696