List实现类
ArrayList
数组结构实现,查询快,增删慢。
运行效率快,但是线程不安全。
Vector
数组结构实现,查询快,增删慢。
运行效率慢,线程安全。
LinkedList
链表结构实现 ,增删快,查询慢。
ArrayList
使用
这样进行删除是行不通的,因为他是进行equals进行比较,equals比较的是地址,一比较发现地址不一样。如果非要进行这样删除,那就重写equals的方法就可以了。(前面的tostring已经重写了)
这个时候进行重写后重新运行,发现已经进行删除了。
进行迭代代码如下
使用迭代器:
使用列表迭代器
indexof里面也调用了equals方法的。
源码分析
默认容量大小 DEFAULT_CAPACITY = 10
存放元素的数组 elementData
实际的元素个数 size
也就是说,默认的情况下,没有向集合添加任何元素的时候,是0,容量和size都是0。(只有开始添加了才认为是10)
ensureeCapacityInternal 增长修改个数。这个时候 最开始size是0.
如果if里面成立的,那么就去一个比较大的,即size+1等1,肯定是小于10的,于是让其mincapacity等于10,即改为默认容量10了。
然后跳转到下一步ensureExplicitCapacity中,接着看这个源代码
10-0>0成立,然后进入到grow,然后就是数组进行扩容的代码了。
grow代码是核心。
oldcapacity是0,然后右移一位,还是0.(右移一位相当于除以2)
然后0-10小于0,然后赋值给newcapacity为10了。
然后就给elementdata赋值了10.所以添加第一个元素的时候,就是容量变成10了。
如果第11个加进来,一切按照刚刚的流程进来,然后在grow进行第二次变化。
于是elementdata就变成了15.
扩容总结
每次扩容为原来的1.5倍。
Vector使用
jdk1.0已经使用了。
也是list的一个接口。
重要的:elements(枚举器)
remove(int index)删除
clear()清除
vector遍历
使用枚举器
判断:vector.contains("")
判断:vector.isEmpty()
LinkedList
链表结构,双向链表,增删快,查询慢。
使用
删除 remove() 清除 clear()
遍历
for遍历、增强for
list的迭代器要更强一点,有前后方向可以选择的。
判断是否存在:contains(s)
获取位置 indexOf (x)
源码分析
first指向第一个元素 size是大小 last指向最后一个元素
进入到linklast的代码。
创建 了一个l局部变量,l等于last,l其实也是空null。
然后创建了newnode。