Collection接口
Collection接口常用方法如下:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.junit.Test;
public class CollectionTest {
@Test
public void test1(){
Collection coll = new ArrayList();
// add(object e):将参数e添加到集合coll中
coll.add("AA");
coll.add("BB");
coll.add(123);
coll.add(new Date());
// size():获取集合长度
System.out.println(coll.size());
// addAll(Collection coll1):将集合coll1的所有元素添加到当前集合中
Collection coll1 = new ArrayList();
coll1.add(456);
coll1.add("CC");
coll.addAll(coll1);
System.out.println(coll);
// clear():清空集合
coll1.clear();
System.out.println(coll1);
// isEmpty():判断size是否为0
System.out.println(coll1.isEmpty());
// contains(object obj):当前集合中是否包含obj
System.out.println(coll.contains(123));
// containsAll(Collection coll1):当前集合是否包含coll1集合内所有元素
System.out.println(coll.containsAll(coll1));
// remove(object obj):
System.out.println(coll.remove(456));
// removeAll(Collection coll1):删除当前集合中coll1集合内所有元素
System.out.println(coll.removeAll(coll1));
// retainAll(Collection coll1):删除当前集合中不属于coll1集合的元素
System.out.println(coll.retainAll(coll1));
// equals(object obj):比较两个集合是否一致(字面值)
Collection coll2 = coll;
System.out.println(coll.equals(coll2));
// hashCode():取hash值
System.out.println(coll.hashCode());
// toArray():将集合转换为数组
Object[] arr = coll.toArray();
for(int i = 0;i< arr.length;i ++){
System.out.println(arr[i]);
}
}
}
如果想要直接遍历集合,需要Iterator迭代器。
Iterator迭代器
- Iterator对象被称为迭代器,主要用于遍历Collection集合中的元素。
- GOF给迭代器模式的定义为:提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。迭代器模式,就是为容器而生。
- Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Iterator接口的对象。
- Iterator仅用于遍历集合,Iterator本身并不提供承载对象的能力。
- 集合对象每次调用Iterator()方法都得到一个全新的迭代器对象。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import org.junit.Test;
public class CollectionTest {
@Test
public void test1(){
Collection coll = new ArrayList();
// add(object e):将参数e添加到集合coll中
coll.add("AA");
coll.add("BB");
coll.add(123);
coll.add(new Date());
// iterator():返回Itertor接口的实例,用于遍历集合元素
Iterator iterator = coll.iterator();
// 方式一:
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
// 方式二:不推荐
for(int i = 0;i < coll.size();i ++){
System.out.println(iterator.next());
}
// 方式三:推荐 hasNext()判断是否还有下一个元素
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
常用方法
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.junit.Test;
public class CollectionTest {
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add("AA");
coll.add("BB");
coll.add(123);
coll.add(new Date());
// remove():移除
while(iterator.hasNext()){
Object obj = iterator.next();
if("AA".equals(obj)){
iterator.remove();
}
}
// foreach:增强for循环
// 可以迭代访问Collection和数组
// 遍历操作不需要获得Collection或数组的长度,无需使用索引访问元素
// 底层是Iterator操作
// foreach还可以用来遍历数组
for(Object obj:coll){
System.out.println(obj);
}
}
}
List接口
List接口是Collection接口的子接口。
鉴于数组的局限性,我们经常使用List替代数组。
List集合类中元素有序且可重复,集合中每个元素都有其对应的顺序索引。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
接口下有三个实现类:ArrayList(主要实现类)、LinkedList、Vector
问题:ArrayList、LinkedList、Vector的异同
相同点:三个类都是实现了List接口,存储数据的特点相同:存储都是有序的、可重复的数据
不同点:ArrayList类是线程不安全的,效率高,本质是对数组的封装,底层是Object[];LinkedList类是线程不安全的,效率高,本质是对数组的封装,底层是双向链表,适合频繁的插入,删除操作;Vector类是线程安全的,效率低,底层同ArrayList类。
- List接口常用方法
import java.util.ArrayList;
public class ListTest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// add(int index,Object ele) 在index位置插入元素
list.add(123);
list.add(456);
list.add("AA");
list.add(1,789);
// addAll(int index,Collection eles) 在index位置插入一个集合对象
ArrayList list1 = new ArrayList();
list1.add(1);
list1.add(2);
list1.add(3);
list.addAll(0, list1);
// get(int index) 获取指定index位置的元素
list.get(1);
// indexOf(Object obj) 返回obj在当前集合中首次出现的位置
list.indexOf("AA");
// lastIndexOf(Object obj) 返回obj在当前集合中末次出现的位置
list.lastIndexOf(456);
// set(int index,Object ele) 设置index位置的元素为ele
list.set(2,"BB");
// subList(int fromIndex,int toIndex) 返回从fromIndex到toIndex位置的子集合
System.out.println(list.subList(3, 5));
System.out.println(list);
}
}
Set接口
TreeSet是SortSet接口的实现类,TreeSet可以确保集合元素处于排序状态
TreeSet底层使用红黑树结构存储数据
TreeSet两种排序方法:自然排序和定制排序。默认情况下使用自然排序
Set接口有三个实现类:HashSet,LinkedHashSet,TreeSet
他们的关系和List接口的实现类差不多:
问题:HashSet,LinkedHashSet,TreeSet的异同
相同点:三个类都是实现了Set接口,存储数据的特点相同:存储都是无序的,不可重复的数据
不同点:HashSet类是线程不安全的,效率高,底层是二叉树;LinkedHashSet类是HashSet类的子类,可以按照添加的顺序遍历,线程不安全的;TreeSet类是线程安全的,效率低,底层是红黑树。
注意点1:无序性不等于随机性,无序性表示存储的无序,不代表打印时的顺序无序。在打印时set也会按照一定的顺序打印,这是为了节约资源。在初始化创建set对象后会在堆中创建一个16位的空间,然后插入元素后,插入的元素会随机写入一个位置。也就是set的写入是随机的,但是会以特定的顺序保存元素。
注意点2:不可重复性的不可重复针对的是对象不可重复。
hashset添加元素的过程