√ JavaSE - 20.怎么使用Collection(卷1 P365 P373 P375)

  1. 集合的基本接口之一是Collection接口。
  2. Collection接口的 contains() 调用对象的equals()进行比较,因此加入集合的对象所在类应重写equals()。
  3. Iterator接口是一个迭代器,用于遍历集合中的元素,通过循环调用hasNext()和next()依次访问集合中的元素。
  4. 每次调用集合对象的iterator()都会得到一个全新的迭代器,指向集合第一个元素的前一个位置。
  5. foreach循环可以遍历任何实现了Iterable接口的对象,等价于迭代器。
  6. 一般情况下,考虑Collection接口的两个重要子接口:List接口、Set接口。
  7. List接口用于存储有序的、可重复的数据。
  8. Set接口用于存储无序的、不可重复的数据。无序性不等于随机性,即存储数据时是根据其哈希值进行排序的,而不是根据添加的顺序进行排序的。不可重复性是指先根据hashCode()计算元素应该存放在数组的哪个位置,若该位置上已经有其他元素,则再根据hashCode()判断两个元素的哈希值是否相同,若不同则直接添加,若相同则再根据equals()判断是否为重复元素,若不是重复元素则以链表形式链接在该位置上的元素后面。
  9. 一般情况下,考虑List接口的三个重要实现类:Vector类、ArrayList类、LinkedList类。
  10. Vector类底层使用 Object[] 存储数据,是线程安全的,但是效率低。
  11. ArrayList类底层使用 Object[] 存储数据,是线程不安全的,但是效率高。
  12. LinkedList类底层使用Node内部类存储数据,是一个双向链表,尾进头出。
  13. 一般情况下,考虑Set接口的三个重要实现类:HashSet类、TreeSet类、LinkedHashSet类。
  14. HashSet类底层使用数组+链表存储数据,适合快速查找元素。
  15. TreeSet类底层使用红黑树存储数据,添加的数据必须是同一个类的对象,且必须实现了Camparable接口,被campareTo()判断为相等的对象只能添加一个,可以指定添加对象的属性进行比较,数据会自动排序。
  16. LinkedHashSet类底层使用数组+链表存储数据,是HashSet类的子类,添加数据的同时维护了两个引用,分别记录前一个数据和后一个数据,适合频繁遍历。
  17. Set接口的实现类存储的对象必须重写equals()与hashCode()。
  18. 利用接口指向实现类时,虽然具备了多态的优点,但是不能调用实现类的特有方法,因此需要权衡使用。
import java.util.*;

public class CollectionTest {
    public static void main(String[] args) {
        System.out.println("---Collection---");
        Collection<Integer> collection = new ArrayList<>();
        collection.add(1);
        collection.add(2);
        collection.add(3);
        System.out.println(collection.contains(1));

        System.out.println("---迭代器---");
        Iterator<Integer> iterator = collection.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println("---foreach循环---");
        for (Integer integer : collection) {
            System.out.println(integer);
        }

        System.out.println("---Vector---");
        List<Double> list1 = new Vector<>();
        list1.add(1.0);
        list1.add(2.0);
        list1.add(3.0);
        System.out.println(list1.size());

        System.out.println("---ArrayList---");
        List<Double> list2 = new ArrayList<>();
        list2.add(1.0);
        list2.add(2.0);
        list2.add(3.0);
        System.out.println(list2.get(2));

        System.out.println("---LinkedList---");
        LinkedList<Double> list3 = new LinkedList<>();
        list3.addFirst(1.0);
        list3.addFirst(2.0);
        list3.addFirst(3.0);
        System.out.println(list3.pop());

        System.out.println("---HashSet---");
        Set<String> set1 = new HashSet<>();
        set1.add("Java");
        System.out.println(set1.add("Java"));

        System.out.println("---TreeSet---");
        Set<String> set2 = new TreeSet<>();
        set2.add("a");
        set2.add("c");
        set2.add("b");
        System.out.println(set2);

        System.out.println("---LinkedHashSet---");
        LinkedHashSet<String> set3 = new LinkedHashSet<>();
        set3.add("123");
        System.out.println(set3.add("123"));
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值