List接口的典型实现
ArrayList
可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。
Vector
Vector类实现了可扩展的对象数组 他是同步的
LinkedList
双链表实现 并允许所有元素(包括null ) 此实现不同步
数据结构:
指的是数据在计算机中存储的结构及存储的方式.
结构1 : 数组
在内存中是连续存储的 可以通过索引来访问到数组中的每一个元素
结构2 : 栈
栈的特点: 先进后出
结构3:队列
结构4:链表:单向链表 双向链表 循环链表
链表在计算机中的存储的地址是不连续
单向链表
双向链表
数组和链表的区别:
数组:查询效率高 插入 删除 都包含了移位操作 因此效率低
链表:查找效率低 插入 删除 效率高
二叉树
前序遍历:根左右
后序遍历:左右根
中序遍历:左根右
红黑树:
ArrayList的 实现
底层实现使用的是数组 数组的默认容量为10
添加的方式
扩容机制
public static void main(String[] args) {
// 在实际使用中 都是用的多态的形式
List list = new ArrayList();
Student st1 = new Student("张三",20);
Student st2 = new Student("李四",22);
list.add(st1);
list.add(st2);
//进行遍历
// for(int i = 0 ; i < list.size();i++){
// Object obj = list.get(i);
// System.out.println(obj);
// }
//增强for
// for (Object obj : list){
// System.out.println(obj);
// }
//使用迭代器
Iterator iter = list.iterator();
while(iter.hasNext()){
Object obj = iter.next();
System.out.println(obj);
}
}
Vector
Vector的默认容量也是10
LinkedList
LinkedList底层实现是双向链表
添加元素
头插法的实现
尾插法
默认采用尾插法
public static void main(String[] args) {
LinkedList list = new LinkedList();
Student st1 = new Student("张三",20);
Student st2 = new Student("李四",22);
Student st3 = new Student("王五",23);
Student st4 = new Student("赵四",22);
list.add(st1);
list.add(st2);
list.add(st3);
list.add(st4);
Iterator iter = list.iterator();
while(iter.hasNext()){
Object obj = iter.next();
System.out.println(obj);
}
System.out.println("------------------");
Object first = list.getFirst();//获取头节点
System.out.println(first);
Object last = list.getLast();//获取尾节点
System.out.println(last);
}
Vector和ArrayList的使用场景
在多线程的环境中使用Vector
在不需要保证数据同步的时候 优先使用ArrayList
因为Vector的效率较ArrayList低
在开发中 一般都 使用ArrayList
ArrayList 和LinkedList的使用场景.
如果数据查询的频率高 而删除和插入的频率低 则使用ArrayList
如果查询的频率低 而删除和插入的频率高 则使用LinkedList