You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java中List的toArray(new AnotherClass[0])方法里的0代表什么含义?

Java中List的toArray(new AnotherClass[0])方法里的0代表什么含义?

嘿,这个问题问得特别接地气!很多刚摸Java集合的同学都会在这儿卡壳,我给你唠得明明白白的~

首先得铺垫个小背景:为啥我们不能直接用无参的toArray()?因为它返回的是Object[],你要是硬转成AnotherClass[],十有八九会触发ClassCastException,太坑了。而带参数的toArray(T[] a)就是专门用来生成指定类型数组的救星。

那你传的new AnotherClass[0]里的0,本质上是在给JVM递个「类型模板+需求指令」:「我要的是AnotherClass类型的数组,但这个空数组只是给你看类型的,我没给它留元素空间,你直接帮我造一个和当前List元素数量一样多的同类型新数组就行!」

具体运行逻辑拆解下:

  • 当JVM拿到你传的这个长度为0的数组时,会先瞅一眼当前List有多少个元素。
  • 因为你传的数组长度(0)比List的大小小,JVM会直接忽略你传的这个空数组,重新创建一个长度等于List.size()的AnotherClass类型数组,然后把List里的元素挨个拷贝进去,最后把这个新数组返回给你。

可能有人会问:那我传new AnotherClass[list.size()]不行吗?其实在JDK 1.6及更早的版本,传指定长度的数组可能少一次数组创建操作,但现在的JDK(1.8及以后)已经对new T[0]这种写法做了极致优化——HotSpot虚拟机会直接复用这种空数组的类型信息,不会额外浪费内存,而且代码更简洁:你不用先调用list.size(),直接写0就行,省心又高效。

给你整个实际例子,一看就懂:

// 先整个有3个元素的List
List<String> strList = Arrays.asList("Java", "Python", "Go");
// 传一个长度为0的String数组
String[] strArr = strList.toArray(new String[0]);
// 这时候strArr的长度是3,里面就是["Java", "Python", "Go"]

另外补个小细节:如果你传的数组长度大于等于List的大小,那JVM就不会创建新数组了,直接用你传的这个数组,把List元素拷贝进去,剩下的空位会填null,然后返回你传的这个数组本身。但这种情况一般很少用,毕竟没必要提前分配多余的空间~

总结下,这个0就是在跟JVM说:「我只要类型参考,不要这个空数组的空间,你按List的实际大小给我造新数组!」是不是瞬间就通透了😉

火山引擎 最新活动