概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能。
数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型
进行集合接口的学习时候,多看JDK的API。里面有很多方法,可以自己研究。
iterator()是collection的元素上进行迭代的迭代器。
1、添加元素 2、删除元素 3、遍历元素 4、判断
通过上面的三个方法实现集合的遍历迭代。
迭代过程当中,是不允许使用collection的删除方法的。
迭代器要求在迭代过程中,不可以使用集合的其他方法来并发修改。 如果想删除的话,那么就可以用迭代器自己的方法,改成it.remove()就可以了。
注意这里判断是否包含中(new。。)是行不通的。
特点:有序的、有下标、元素可以重复。
数组结构实现,查询快,增删慢。 运行效率快,但是线程不安全。
数组结构实现,查询快,增删慢。 运行效率慢,线程安全。
链表结构实现 ,增删快,查询慢。
这样进行删除是行不通的,因为他是进行equals进行比较,equals比较的是地址,一比较发现地址不一样。如果非要进行这样删除,那就重写equals的方法就可以了。(前面的tostring已经重写了)
这个时候进行重写后重新运行,发现已经进行删除了。
indexof里面也调用了equals方法的。
也就是说,默认的情况下,没有向集合添加任何元素的时候,是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倍。
jdk1.0已经使用了。
也是list的一个接口。
链表结构,双向链表,增删快,查询慢。
first指向第一个元素 size是大小 last指向最后一个元素
进入到linklast的代码。
创建 了一个l局部变量,l等于last,l其实也是空null。 然后创建了newnode。