Java 需要注意的地方
程序员文章站
2024-03-17 13:48:04
...
1.ArrayList源码分析
线程非安全性
对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。
transient关键字解析
Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化。
transient Object[] elementData;
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
// Write out size as capacity for behavioural compatibility with clone()
s.writeInt(size);
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
elementData = EMPTY_ELEMENTDATA;
// Read in size, and any hidden stuff
s.defaultReadObject();
// Read in capacity
s.readInt(); // ignored
if (size > 0) {
// be like clone(), allocate array based upon size not capacity
ensureCapacityInternal(size);
Object[] a = elementData;
// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
a[i] = s.readObject();
}
}
}
//克隆数据低层调用
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
ArrayList
在序列化的时候会调用writeObject()
方法,将size
和element
写入ObjectOutputStream
;反序列化时调用readObject()
,从ObjectInputStream
获取size
和element
,再恢复到elementData
。
原因在于
elementData
是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,那么有些空间可能就没有实际存储元素,采用上诉的方式来实现序列化时,就可以保证只序列化实际存储的那些元素,而不是整个数组,从而节省空间和时间。
ArrayList优缺点
优点:
-
因为其底层是数组,所以修改和查询效率高。
-
可自动扩容(1.5倍)。
缺点:
-
插入和删除效率不高。
-
线程不安全。
下一篇: Python zip()函数的一次踩坑记