【List接口】
-
List 接口的方法
void add(int index,E element) | 添加元素到指定的位置index |
boolean addAll(int index,Collection<? extends E> c) | 把c所有元素添加到指定index中 |
E remove(int index) | 删除并返回index索引处的元素 |
E get(int index) | 返回集合index处的元素 |
int indexOf(Object o) | 返回o第一次出现的位置 |
int lastIndexOf(Object o) | 返回o最后一次出现的位置 |
E set(int index,E element) | 将index处的元素替换成e,返回旧元素 |
List subList(int from,int to) | 截取从from到to的列表,左包含右不包含 |
-
ArrayList
1.基于数组实现
2.长度可变的
3.分配连续内存空间
特点:
1.线程异步 2.线程不安全 3.效率高
-
Vector(向量)
1.动态数组
2.长度可以增加
特点:
1.线程同步的 2.多线程安全的 3.效率低
Vector 和 ArrayList 实现了同一接口 List,但Vector 的方法都具有 synchronized 关键修饰。但对于复合操作,Vector 仍然需要进行同步处理。
-
迭代器接口(Iterator)
是一种使用迭代法遍历集合的对象。
boolean hasNext() | 判断是否还有其他元素 |
Object next() | 获取下一个元素 |
void remove() | 删除最后一次调用next返回的元素 |
例如:
ArrayList list = new ArrayList<String>();
Iterator<String> it=list.iterator();
while(it.hasNext()){
if(it.next()=="AA"){
it.remove();
}else
System.out.println(it.next());
}
另外:List允许双向遍历列表,即还可以实现前向遍历
hasprevious();
previous();
-
Stack
先进后出
-
Queue
只允许在表的前端进行删除操作,而在表的后端进行插入操作的线性表
ArrayList是基于数组结构的集合,遍历和随机访问元素的效率比较高
LinkedList采用链表存储方式,插入、删除元素效率比较高
-
LinkedList
是基于链表的、实现了List接口和Queue接口的集合
addFirst() | 从集合列表开头插入元素 |
addLast() | 从集合列表结尾插入元素(add) |
getFirst() | 拿到第一个元素并返回 |
getLast() | 拿到最后一个元素并返回 |
removeFirst() | 移除第一个元素并返回 |
removeLast() | 移除最后一个元素并返回 |
-
List 集合使用技巧
要求快速访问元素,则使用ArrayList 集合。
要求快速插入和删除元素,则使用LinkedList集合。
当对多线程元素操作时,则使用Vector集合。
要求数据先进后出时,则使用Stack集合类。
---------------------------------------------------------------------------------------------------------------------------------------
【Set 接口】
是用于存储无序的、不重复的数据,且不能通过索引访问元素
boolean add(E e) | 如果此set集合尚未存在指定的元素,则添加此元素 |
boolean addAll(Collection<? extends E> c) | 将参数集合中所有元素添加到此set集合的尾部 |
boolean remove(Object obj) | 将指定参数对象移出集合 |
void clear() | 移出set集合中所有元素 |
Iterator iterator() | 返回此set中的元素上进行迭代的迭代器 |
int size() | 返回此set集合中所有的元素数 |
boolean isEmpty() | 如果set不包含元素,则返回set |
-
HashSet
是基于哈希表的Set集合
-
LinkedHashSet
是基于双向链表和哈希表、继承自HashSet的Set集合
-
TreeSet
是基于红黑树、实现了Set接口,具有排序功能的Set集合。
-
Comparable接口
使实现类自身具备某种比较规则以便对其对象进行 自然排序的接口。
是要求自定义类实现Comparable接口并实现其compareTo(Object obj)方法,在此方法中指定排序规则的算法。
例如:
public class Student implements Comparable {
public int compareTo(Student o) {
return this.age - o.age;
}
}
-
Comparator比较器
是要求自定义类实现Compartor接口并重写其compare(Object arg0, Object arg1)方法,在此方法中依据 XX 属性进行排序的算法。也称比较器排序。
例如:
public class MyComparator implements Comparator{
public int compare(Object arg0, Object arg1) {
Student o1=(Student)arg0;
Student o2=(Student)arg1;
if(o1.getAge() == o2.getAge())
return o1.getName().compareTo(o2.getName());
return o1.getAge() - o2.getAge();
}
}
区别:
Comparable接口: 实现该接口的类具有排序功能 需要实现compareTo方法,使用当前对象和参数对象进行比较 Comparator接口: 不会对集合中存储元素的类进行修改 需要自定义比较器类实现该接口,实现compare方法,比较两个参数对象 需要将比较器对象以参数的形式传入集合的构造器中
---------------------------------------------------------------------------------------------------------------------------------------
-
addAll 、shuffle
ArrayList<int> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Collections.addAll(list,4,5,6);
Collections.shuffle(list);
-
sort
sort()默认是升序排序,如果是 obj 对象的集合,则要自己在obj类中重写compareTo()
public int compareTo(obj o){
return this.getNum() > o.getNum() ;
}
或者,用第二个sort()
Collections.sort(list,new comparator<obj>(){
@Override
public int compare(obj o1,obj o2){
return o1.getNum() > o2.getNum();
}
});
注意:集合(容器)的类型不会因为负载类型具有父子关系,而变得具有父子关系。
例如:ArrayList是Object的子类,但下面的语句不会被编译
List<Object> list = new ArrayList<String>;