个人简介:
📦个人主页:赵四司机
🏆学习方向:JAVA后端开发
📣种一棵树最好的时间是十年前,其次是现在!
🔔博主推荐网站:牛客网 刷题|面试|找工作神器
💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。
前言
由于很快到了金九银十的秋招季节,博主最近也在找一些面经资源,但是发现很多都不全,后来我发现了牛客网这个网站,发现里面不仅可以看面经,还能刷题模拟面试,要是你要找各种招聘信息也可以在上面找到,我愿称之为程序员必备网站,下面把它推荐给你们!
链接地址:牛客网
静态变量可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量,通常情况下静态变量会被final修饰成为常量。
为什么说是几乎所有对象实例呢? 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存。
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。
通过new创建对象实例,对象实例存放在堆中,而对象引用指向对象实例,对象引用存放在栈内存中,一个对象引用可以指向0个或1个对象实例,而一个对象实例能被多个对象引用指向。
温馨提示:上面只是我总结的面经知识,如果你想要更全面的可以到网站自行查看喔。
友情链接:牛客网