讲集合先上图
collection
- 1.collection对上继承iterable类,
所以collection及其子类皆可以调用iterator()方法获得迭代器. - 2.collection由其子类实现
package top.tzk.collection_; import java.util.ArrayList; public class CollectionTest { public static void main(String[] args) { ArrayList<Object> list = new ArrayList<Object>(); /** * 集合中只能存放对象!!! * */ //集合的添加 list.add("sds"); list.add(21);//这里的21调用了封装 new Integer(21) list.add(false);//同理 //集合移除元素 list.remove(1); System.out.println(list); /* terminal: [sds, false]*/ list.remove("sds"); System.out.println(list); /* terminal: [sds, false] [false]*/ //以collection为单位添加 ArrayList<Object> list2 = new ArrayList<>(); list2.add(1231); list2.add("黄河"); list.addAll(list2); //以collection为单位删除 list.removeAll(list2); //以collection为单位,查找该集合是否包含collection里的元素 list.containsAll(list2); } }
list
list常用方法: - 指定位置添加
list.add(0,"大海");
list.add(1,"大海");
list.add(1,"是");
// terminal: 大海,是,大海
- 返回某元素第一次出现的下标
list.indexof("大海");
- 返回某元素最后一次出现的下表
list.lastindexof("大海");
- 元素替换
list.set(0,"大海无疆");
- 截取元素返回为子集合,左闭右开[ )
list.subList(0,1)
ArrayList
源码解析图
- 特点:
1.底层为数组Array
2.线程不安全
3.采用无参构造创建时:
不初始化,对象引用啥也不指向;只有当进行添加元素时,才会采取按照默认值初始化数组,然后返回给对象引用.
4.如果使用带参构造:
那么照设定值进行数组初始化(但是如果参数设定为0,那么走无参路线).
5.扩容方式:
按照oldCapacity + (oldCapacity >> 1)的方式扩容.即:按照一点五倍扩容.
Vector
源码解析图
- 特点:
1.底层为数组Array
2.线程安全
3.采用无参构造创建时:
那么照默认值进行数组初始化
4.如果使用带参构造:
那么照设定值进行数组初始化,除此之外,还可以设定增量.
5.扩容方式:
按照oldCapacity + (capacityIncrement > 0? capacityIncrement:oldCapacity)的方式扩容.即:有增量,按增量,否者按照2倍扩容
###LinkedList
源码解析图(看下结构就行,没什么好看的.就和模拟(面向过程类的语言的写法,C)去写的)
其实LinkedList就是个双向链表,符合双向链表的所有特点.没啥好讲的.
特点:
1.从当前节点向前向后检索都特方便.
2. 插入方便,只要动动指针指向的东西就行(java里面就是对象引用指向的Node)
3. 删除方便,把当前Node的前一个Node的last指向当前Node的后一个Node的地址即可.
4. 查找麻烦,必须从头或者从尾部依次检索.