紧密结构
比如数组
优点:寻址快->查找元素快
缺点:删除和增加元素效率低
跳转结构
比如链表
单向链表,双向链表,循环链表(首尾相连)
优点:增加、删除快
缺点:查找慢
集合
存储是内存层面的存储,不是持久化存储
vs数组
数组特点和缺点:
- 长度指定即固定
- 数据类型单一
- 删除和增加元素效率低
- 实际元素数量不可获取
- 无序,不可重复的要求不能满足
集合底层数据结构不一样,特点不一样,可能紧密结构可能跳转结构
集合体系
集合方法
Collection col = new ArrayList();
col.add(22); // 集合元素只能是引用类型,基本类型有自动装箱
col.contains(22)
col.addAll(col2)
col.equals(cols)
col.isEmpty()
col.size()
col.remove(22)
col.clear()
集合遍历
不能for普通循环
// 增强for循环
for(Object o: col){
}
// 迭代器
Iterator itr = col.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
指针指向该集合首部,next返回元素并将指针下移
List接口,扩展方法都和index索引相关
List list = new ArrayList();
list.add(index, Object)
list.set(index, Object)
// remove
list.remove(index/Object)
list.get(index)
remove可以是Object也可以是index,所以是Integer类型数据的时候,优先调用index。
循环
普通for, 增强for,iterator
ArrayList实现类
源码类似StringBuilder
ArrayList接口失误,父类也实现了List接口,有重复
-
1.7jdk中源码:
底层数组初始化长度为10,size为有效元素个数不是底层数组长度
要判断是否超容:ensureCapacityInternal(size+1)
超容后进行扩容grow(minCapacity),扩容为原来的1.5倍,copy过去,然后elementData指向新数组内存 -
1.8
底层数组长度初始为空,只有调用add方法添加元素时,才判断扩容初始化为10长度,因此时懒汉式的占用空间,节省了空间
Vector
底层还是object数组和int 类型count
和ArrayList相比
- vector扩容两倍
- add方法用syncronized线程安全,但是效率低,被淘汰了