4.9 Collection、Iterator、List、Arraylist、Set、TreeSet、Comparator

4.9 Collection、Iterator、List、Arraylist、Set、TreeSet、Comparator

CollectionCollection and Map

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);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值