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

发布于:2022-12-22 ⋅ 阅读:(459) ⋅ 点赞:(0)

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

📦个人主页:赵四司机
🏆学习方向: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;
    }
}

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);
    }

}

Boolean源码

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

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

例题:

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);

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

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

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

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

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