1700443290
1700443291
Balloon@b2fd8f[编号=0,颜色=Red]
1700443292
1700443293
Balloon@a20892[编号=1,颜色=Orange]
1700443294
1700443295
Balloon@158b649[编号=2,颜色=Yellow]
1700443296
1700443297
Balloon@1037c71[编号=3,颜色=Green]
1700443298
1700443299
Balloon@1546e25[编号=4,颜色=Indigo]
1700443300
1700443301
Balloon@8a0d5d[编号=5,颜色=Blue]
1700443302
1700443303
Balloon@a470b8[编号=6,颜色=Blue]
1700443304
1700443305
最后一个气球颜色竟然也被修改了,我们只是希望修改第二个箱子的气球啊,这是为何?这是很典型的浅拷贝(Shallow Clone)问题,前面第1章的序列化中也介绍过,但是这里与之有一点不同:数组中的元素没有实现Serializable接口。
1700443306
1700443307
确实如此,通过copyOf方法产生的数组是一个浅拷贝,这与序列化的浅拷贝完全相同:基本类型是直接拷贝值,其他都是拷贝引用地址。需要说明的是,数组的clone方法也是与此相同的,同样是浅拷贝,而且集合的clone方法也都是浅拷贝,这就需要大家在拷贝时多留心了。
1700443308
1700443309
问题找到了,解决方案也很简单,遍历box1的每个元素,重新生成一个气球(Ballon)对象,并放置到box2数组中,代码较简单,不再赘述。
1700443310
1700443311
该方法用得最多的地方是在使用集合(如List)进行业务处理时,比如发觉需要拷贝集合中的元素,可集合没有提供拷贝方法,如果自己写会很麻烦,所以干脆使用List.toArray方法转换成数组,然后通过Arrays.copyOf拷贝,再转换回集合,简单便捷!但是,非常遗憾的是,这里我们又撞到浅拷贝的枪口上了,虽然很多时候浅拷贝可以解决业务问题,但更多时候会留下隐患,需要我们提防又提防。
1700443312
1700443313
1700443314
1700443315
1700443317
编写高质量代码:改善Java程序的151个建议 建议63:在明确的场景下,为集合指定初始容量
1700443318
1700443319
我们经常使用ArrayList、Vector、HashMap等集合,一般都是直接用new跟上类名声明出一个集合来,然后使用add、remove等方法进行操作,而且因为它是自动管理长度的,所以不用我们特别费心超长的问题,这确实是一个非常好的优点,但也有我们必须要注意的事项。
1700443320
1700443321
下面以ArrayList为例深入了解一下Java是如何实现长度的动态管理的,先从add方法的阅读开始,代码如下。
1700443322
1700443323
public boolean add(E e){
1700443324
1700443325
//扩展长度
1700443326
1700443327
ensureCapacity(size+1);
1700443328
1700443329
//追加元素
1700443330
1700443331
elementData[size++]=e;
1700443332
1700443333
return true;
1700443334
1700443335
}
1700443336
1700443337
我们知道ArrayList是一个大小可变的数组,但它在底层使用的是数组存储(也就是elementData变量),而且数组是定长的,要实现动态长度必然要进行长度的扩展,ensureCapacity方法提供了此功能,代码如下:
1700443338
1700443339
public void ensureCapacity(int minCapacity){
[
上一页 ]
[ :1.70044329e+09 ]
[
下一页 ]