【每日一练】20231011

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最大能够存储多少数据?

  1. int[] a = new int[12345678910101L];
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值