java源码分析之--ArrayList javaGC编程
程序员文章站
2024-03-19 10:47:10
...
有感于现在开发到了一个瓶颈,表现为对于一般的业务,能进行开发,但是只要业务稍微变化点,代码就需要进行大的改动,代码也写的比较烂,自己都不想去看自己写的代码了。于是现在准备分析下java的源码,试图提高自己的编程能力。
现在开始付诸行动。
首先是将src包解压,然后导入到IDE中。目前只分析了下ArrayList,到现在还没有看完,不过确实感觉代码写的不错,以前从没考虑的gc,里面居然全部提到了,例如:
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
}
这是从源码里面拷贝的一段代码,意思是移除指定位置上面的元素,特别是
elementData[--size] = null; // Let gc do its work
这行代码写的很精妙,实现了两个功能,一个是移除指定位置上面的元素,这个大家一眼就能看到的,貌似将该对象指向null,之后gc就会自动来回收该内存,这个代码还有一个功能,--size将该集合的长度减少1,刚看完的时候,我还以为这里有个bug呢,还兴奋了还一会儿呢,我还以为这个长度没有相应的减少,写了一个Test之后,又没法有问题,再次分析才发现这个了。不得不佩服那些开发人员。
modCount,如果分析ArrayList,一定会到处看到这个,仔细查找一番,你又会发现modCount又未在ArrayList里面定义,这个变量定义在AbstractList类中,ArrayList继承了AbstractList,modCount的作用,我没细细深究,我大概看了下,有点像hibernate乐观锁里面version,因为ArrayList是非线程安全的,为了防止别人修改了ArrayList对象而自己却不知道,特意加了个modCount,只要ArrayList修改,modCount就会执行modCount++。
分析源码还有一个感触,这个集合方法也是对数组的封装,主要实现的功能无外乎CRUD,虽然看起来有十几个二十多个方法,但都是对里面的几个私有的CRUD方法进行扩充的。虽然这些方法能满足我们大部分人的需要,如果有某些特殊的需要,可以很便捷的写些方法进行再次扩充。
现在开始付诸行动。
首先是将src包解压,然后导入到IDE中。目前只分析了下ArrayList,到现在还没有看完,不过确实感觉代码写的不错,以前从没考虑的gc,里面居然全部提到了,例如:
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
}
这是从源码里面拷贝的一段代码,意思是移除指定位置上面的元素,特别是
elementData[--size] = null; // Let gc do its work
这行代码写的很精妙,实现了两个功能,一个是移除指定位置上面的元素,这个大家一眼就能看到的,貌似将该对象指向null,之后gc就会自动来回收该内存,这个代码还有一个功能,--size将该集合的长度减少1,刚看完的时候,我还以为这里有个bug呢,还兴奋了还一会儿呢,我还以为这个长度没有相应的减少,写了一个Test之后,又没法有问题,再次分析才发现这个了。不得不佩服那些开发人员。
modCount,如果分析ArrayList,一定会到处看到这个,仔细查找一番,你又会发现modCount又未在ArrayList里面定义,这个变量定义在AbstractList类中,ArrayList继承了AbstractList,modCount的作用,我没细细深究,我大概看了下,有点像hibernate乐观锁里面version,因为ArrayList是非线程安全的,为了防止别人修改了ArrayList对象而自己却不知道,特意加了个modCount,只要ArrayList修改,modCount就会执行modCount++。
分析源码还有一个感触,这个集合方法也是对数组的封装,主要实现的功能无外乎CRUD,虽然看起来有十几个二十多个方法,但都是对里面的几个私有的CRUD方法进行扩充的。虽然这些方法能满足我们大部分人的需要,如果有某些特殊的需要,可以很便捷的写些方法进行再次扩充。