一、List集合
List集合是Collection的子类
1、List集合的特点
- 元素存入顺序和底层存储的顺序一致
- 元素可重复
- 有索引
2、List集合常用方法
凡是可以操作角标的方法 都是该集合特有的方法
- add(index,element) 在指定的位置添加元素,角标从0开始
- addAll(index,Collection)
- remove(index) 删除的底层也是equals()方法
- set(int index, E element) 修改指定位置的元素,角标从0开始
- get(int index) 获取指定位置的元素
- subList(int fromIndex, int toIndex) 从老的集合中获取从fromIndex(包括)到toIndex(不包括)的元素,存入一个新的集合
扩展:创建List集合,存储Student对象,并对其进行排重处理
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class StudentDemo {
public static void main(String[] args) {
//名字和年龄相同,则为同一个人
List list=new ArrayList();
list.add(new Student("唐僧",23));
list.add(new Student("猪八戒",26));
list.add(new Student("唐僧",23));
Iterator it=list.iterator();
List s=new ArrayList();
while(it.hasNext()){
Object str=it.next();//将Object强制转成String
if(!s.contains(str)){
/*contains底层依托 的是equals()方法,
Object的equals(),比较的是地址值,故需要重写equals()方法*/
s.add(str);
}
}
System.out.println(s);
}
}
class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public boolean equals(Object obj){
if(obj instanceof Student){
Student s=(Student)obj;
return this.name .equals(s.name)&&this.age==s.age;
}
return false;
}
}
二、ArrayList集合(1.2版本)
1、ArrayList集合 底层是数组,长度可变的数组,
默认长度是10,超过后,就会创建一个新的数组,50%延长
将原来的数据拷贝过来,再加入新的元素
特点:查找和修改快,增删比较慢
注意事项:
Collection集合的
- remove方法 判断是否删除 底层依赖于equals方法
- contain方法 判断是否包含 底层依赖于equals方法
三、LinkedList集合
1、LinkedList集合,底层是双向链表
特点: 查找和修改慢,增删比较快
特有功能:(和头尾相关的方法)
- addFirst(Element) 将指定元素插入到此列表的开头
- addLast(Element) 将指定元素插入到此列表的结尾
- getFirst() 返回此列表的第一个元素
- getLast() 返回此列表的最后一个元素
- removeFirst() 删除并返回此列表的第一个元素
- removeLast() 删除并返回此列表的最后一个元素
版本升级1.6开始的
- getFirst() 变成了 peakFirst()
- removeFirst() 变成了 pollFirst()
******************************************************************************************************************************************
ArrayList和LinkedList的使用场景?
1、添加数据方面 LinkedList比ArrayList快
2、ArrayList是一个长度可变的数组,插入数据时,需要先将原始数据复制到新的数组中,然后再去插入新的数据
3、LinkedList 是双向链表,当数据插入到链表中的某个位置时,将链表中要插入位置前后的链表指向进行改变
**********************************************************************************************************************************************
四、Vector集合(1.0版本)
Vector集合底层数组
Vector 和ArrayList的使用方式一样
但是Vector的遍历方式和ArrayList不同
遍历方式
Enumeration<E> elements() 枚举遍历,只能是Vector 使用,高版本的ArrayList不能使用
import java.util.Enumeration;
import java.util.Vector;
public class Demo {
public static void main(String[] args) {
Vector v=new Vector();
v.addElement("K");
v.addElement("N");
v.addElement("C");
Enumeration vv=v.elements();
while(vv.hasMoreElements()){
System.out.println(vv.nextElement());
}
}
}
多线程并发访问的前提下
Vector 线程安全 效率低
ArrayList 线程不安全 效率高
五、List集合特有的迭代器:ListIterator迭代器
import java.util.*;
public class ListDemo {
public static void main(String[] args) {
List list=new ArrayList();
list.add("a");
list.add("d");
list.add("g");
list.add("c");
list.add("a");
ListIterator li=list.listIterator();
while(li.hasNext()){
System.out.print(li.next()+" "); // 从前往后遍历
}
System.out.println();
while(li.hasPrevious()){ //从后向前遍历,但必须先从前往后,否则指针获取不到数据
System.out.print(li.previous()+" ");
}
}
}
注意:指针 先向后移动 再移动回来 单独写previous 获取不到数据 必须 先将指针向后移动 才能向前移动