4.9 Collection、Iterator、List、Arraylist、Set、TreeSet、Comparator
Collection![Collection and Map](https://i-blog.csdnimg.cn/blog_migrate/5c59758cd811218dbb812179cba7a885.png)
Iterator
迭代器:专门用来迭代容器,每个容器都有各自独立的迭代器
public class CollectionDemo01 {
public static void main(String[] args) {
//集合对象
//接口多态: 引用col只能调用Collection中存在的功能
Collection col = new ArrayList();
Collection col2 = new ArrayList();
Collection col3 = new ArrayList();
//常用方法
//boolean add(E e) 确保此集合包含指定的元素(可选操作)。
//boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合中(可选操作)。
col.add("abc");
col.add(false);
col.add(123);
System.out.println(col);
col2.add('a');
col2.add('b');
col2.add('c');
col.addAll(col2);
//void clear() 从此集合中删除所有元素(可选操作)。
//col.clear();
//boolean isEmpty() 如果此集合不包含任何元素,则返回 true 。
System.out.println(col.isEmpty());
System.out.println(col);
//boolean contains(Object o) 如果此collection包含指定的元素,则返回 true 。
//boolean containsAll(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回 true 。
System.out.println(col.contains("abc"));
col2.add('d');
System.out.println(col.containsAll(col2));
//boolean equals(Object o) 将指定对象与此集合进行比较以获得相等性。
col3.addAll(col2);
System.out.println(col2.equals(col3)); //true
//boolean remove(Object o) 从此集合中移除指定元素的单个实例(如果存在)(可选操作)。
System.out.println(col.remove('a'));
System.out.println(col);
System.out.println(col2);
//boolean removeAll(Collection<?> c) 删除此集合的所有元素,这些元素也包含在指定的集合中(可选操作)。
//System.out.println(col.removeAll(col2));
System.out.println(col);
System.out.println(col2);
//boolean retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。
System.out.println(col.retainAll(col2));
System.out.println(col);
System.out.println(col2);
//Object[] toArray() 返回包含此集合中所有元素的数组。
Object[] arr = col.toArray();
System.out.println(Arrays.toString(arr));
//遍历方式
//1.增强for
for(Object obj:col){
System.out.println(obj);
}
//2.迭代器
//Iterator<E> iterator() 返回此集合中元素的迭代器。
//1) 获取迭代器对象(获取遍历当前集合的迭代器对象)
Iterator it = col.iterator();
//2) 判断是否存在下一个元素
while(it.hasNext()){
//3) 获取下一个元素
System.out.println(it.next());
}
}
}
List
List的特点是有序可重复 新增一些可以根据索引操作的方法
1.Collection col = new Collection();
其中<>中的元素类型成为泛型,可以限制容器中的数据类型,可以提高安全性,规范性,达到检查的作用
2.方法中传入的int,例如list.remove(3); 以索引为先
3.并发修改异常:当一个引用同时执行两个操作时会引发异常
例如用增强for循环遍历list同时修改其中的数据
for(String s:list){
if("灭霸".equals(s)){
list.add("惊奇队长");
}
}
为了解决这个问题可以使用列表迭代器,列表迭代器为list接口下独有的迭代器
//ListIterator<E> listIterator() 返回此列表中元素的列表迭代器(按适当顺序)。
//1.获取列表迭代器对象
ListIterator<String> it2 = list.listIterator();
//2.循环判断是否存在下一个元素
while(it2.hasNext()){
if("灭霸".equals(it2.next())){
//3.获取
it2.add("惊奇队长");
}
}
ArrayList和Vector
ArrayList的底层结构为可变的数组
优点:根据索引查询,修改效率高
缺点:做增加,删除的效率低
应用场景:大量做查询,少量做增删的时候
扩容机制:每次扩容为原容量的1.5倍,空构造的容器初始容量为10且只有在放数据时,才会开辟空间
Vector的内部也是通过数组存储数据,与ArrayList的特点相同
不同之处在于:1.线程是安全的|同步的
2.Vector每次扩容为原来的2倍,相比之下ArrayList更加节省空间
如果不需要线程安全实现,一般使用ArrayList代替Vector
Set
Set是无序且不可重复的,这里的无序指的是存储数据的顺序与添加的顺序不同,没有新增方法
TreeSet
TreeSet的底层结构为红黑树(平衡二叉树)
特点是:有序(存储数据时会默认升序存放),条件是对象一定要实现comparable接口i
内部数据排序时会首先判断是否存在外部比较器,如果存在则使用外部比较器,如果不存在,继续向下判断存储的数据 类型上是否邨彩默认的内部比较原则,如果存在则使用内部比较规则比较这两个数据的大小,若都不存在则抛出异常ClassCastException
Comparator
比较器分为内部比较器和外部比较器
内部比较器|自然排序:每次修改都要修改源代码,耦合度高,不便后期维护但比较方便
实现Comparable接口,重写compareTO()方法
外部比较器|定制排序:比较灵活,便于后期维护
实现Comparator接口,重写compare()方法
//自定义比较规则实现类
class Demo implements Comparator<Emp>{
@Override
public int compare(Emp o1, Emp o2) {
return o2.getEmpno()-o1.getEmpno();
}
//
public class TreeSet03 {
public static void main(String[] args) {
//new TreeSet();使用默认比较规则-》内部比较器
//TreeSet<Emp> tree = new TreeSet<Emp>();
//TreeSet(Comparator<? super E> comparator) 构造一个新的空树集,根据指定的比较器进行排序。
TreeSet<Emp> tree = new TreeSet<Emp>(new Demo());
//Comparator comparator = new Demo();
tree.add(new Emp(1003,"赵丽颖",3000,10, State.BUSY));
tree.add(new Emp(1002,"迪丽热巴",1000,10, State.BUSY));
tree.add(new Emp(1001,"古力娜扎",30000,30, State.FREE));
tree.add(new Emp(1004,"郑爽",4000,30, State.NORMAL));
tree.add(new Emp(1004,"郑爽2",4000,30, State.NORMAL));
System.out.println(tree);
}
}