1、Integer问题
以下代码输出结果是什么?
Integer b = 200;
Integer a= 200;
System.out.println(a==b);
答案:false
为什么?查看Integer源码,cache缓存值
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
正确的比较两个 Integer 对象是否相等应该使用 equals() 方法,示例如下:
Integer b = 200; Integer a = 200; System.out.println(a.equals(b));
不同数据类型 ==含义
- 数值型(基本类型); 值
- 引用类型: 两个引用指向同一个对象
2、类型
- 语言的类型是什么?
- 变量是什么?
常量的类型:
2L —long
3.14F —float
注意:
编译器默认对常量是有类型的!!!
3、ArrayList最大能够存储多少数据?
int[] a = new int[12345678910101L];
List<String> list = new ArrayList<>(12345678910101L);
在 Java 中,ArrayList 类是基于数组实现的动态数组,其容量是动态扩展的。初始时,ArrayList 容量默认为 10。随着元素的添加,当容量不足时,ArrayList 会自动进行扩容。
在 ArrayList 中,可以使用 ArrayList.size()
方法获取当前 ArrayList 中存储的元素个数。使用 ArrayList.ensureCapacity(int minCapacity)
方法可以指定 ArrayList 的最小容量。
具体来说,ArrayList 的最大容量取决于 JVM 可用的内存大小。一般来说,理论上 ArrayList 的最大容量可以达到 Integer.MAX_VALUE(2^31-1)个元素,但实际上由于 JVM 内存限制和其他资源限制,ArrayList 能够存储的数据量通常会受到限制。
查看源码:
/**
* The maximum size of array to allocate (unless necessary).
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
ArrayList容量上限是Integer.MAX_VALUE - 8
为什么要 - 8 ?
因为自己作为数组,除了存储数据本身以外,还需要32 bytes的大小来存储对象头(object header)信息。Java每个对象都包含了对象头,HotSpot虚拟机中对象头的大小不会超过32 bytes,所以最大容量减8才不会溢出。
我们知道,Java对象在堆内存中的存储布局可以分为三部分:对象头(object header),实例数据(Instance Data)和对齐填充(Padding)。
需要注意的是,当 ArrayList 超过一定量级时,对性能和内存消耗会有较大的影响。如果需要存储海量数据,可能需要考虑其他的数据结构或优化方式。
参考
https://blog.csdn.net/fisherish/article/details/117134717
https://www.cnblogs.com/silyvin/p/11721144.html
https://blog.csdn.net/yangshangwei/article/details/106958768