最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
字节码:
L0
LINENUMBER 5 L0
ICONST_3
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
ASTORE 1
L1
LINENUMBER 6 L1
NEW java/lang/Integer
DUP
BIPUSH 100
INVOKESPECIAL java/lang/Integer. (I)V
INVOKEVIRTUAL java/lang/Integer.intValue ()I
ISTORE 2
L2
2、为什么会存在原始类型、包装类型以及自动拆装箱机制呢?
原始数据类型和 Java 泛型并不能配合使用,之前没有自动拆装箱机制的时候,开发者就必须每次手动显示转换,才有了Java5中引入自动拆装箱机制。
List // 这个是编译不过的
List
原始类型在内存中存的是值,所以找到内存位置,就可以获得值;
包装类型存的是引用地址,找到对象的引用内存位置,还要根据引用内存位置找下一个内存空间,要产生更多的IO,所以计算性能比原始类型差,但是包装类型具备泛化的能力,更抽象,解决业务问题编程效率高。
如果开发者要做计算,就应该使用原始类型,如果开发者要处理业务问题,就应该使用object,采用Generic机制;反正JAVA有auto-boxing/unboxing机制,对开发者来讲也不需要注意什么。然后为了弥补object性能的不足,还设计了static valueOf()
方法提供缓存机制,算是一个弥补。
3、静态工厂使用的缓存机制到底是个啥?
在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。
这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。
- 在自动装箱(autoboxing)的时候,调用
valueOf()
方法。
这里是使用了享元模式实现的范围缓存支持
public static Integer valueOf(int i) {
// low -128 , high 127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
- 这个类是用来实现缓存支持,并支持
-128
到127
之间的自动装箱过程。最大值 127 可以通过 JVM 的启动参数 -XX:AutoBoxCacheMax=size
修改.
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty(“java.lang.Integer.IntegerCache.high”);
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
基础知识
对于对象引用类型:== 比较的是对象的内存地址。
对于基本数据类型:== 比较的是值。
== 比较题目
如果整型字面量的值在 -128 到 127 之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 return new Integer(i);
Integer a = new Integer(3);
Integer b = 3; // 将3自动装箱成Integer类型
int c = 3;
System.out.println(a == b); // false 两个引用没有引用同一对象
System.out.println(a == c); // true a自动拆箱成int类型再和c比较
System.out.println(b == c); // true
Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1 == b1); // false
Integer a2 = 127;
Integer b2 = 127;
System.out.println(a2 == b2); // true
int和Integer有什么区别?
Integer相关设计模式?
最后
分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。
《Java高级面试》
《Java高级架构知识》
《算法知识》
(img-5ggBIAdU-1715658237546)]
《算法知识》
[外链图片转存中…(img-kGcUZFm5-1715658237546)]