一、概述

  • 集合本身是一个容器,是一个对象
  • 集合不可以直接存储基本数据类型(自动装箱),也不能直接存储Java对象,而是存储Java对象的内存地址;换句话说就是:集合中在任何时候存储的都是“引用”
  • Java中每一个不同的集合在底层都会对应不同的数据结构,向不同的集合中存储元素,等于将数据放到了不同的数据结构中
  • 所有集合类和集合接口都在 java.util 包下
  • Java中集合分为两大类

    1. 单个方式存储元素(超级父接口 java.util.Collection)
    2. 键值对方式存储元素(超级父接口 java.util.Map)

      二、继承结构

      2021-07-15_204159.png
      image.png
      2021-07-15_220836.png
      image.png

      三、迭代器

      1. public class CollectionTest {
      2. public static void main(String[] args) {
      3. Collection collection = new ArrayList();
      4. collection.add("abc");
      5. collection.add(123);
      6. collection.add(new Object());
      7. collection.add(2.3);
      8. collection.add("abc");
      9. /*
      10. 1、获取迭代器对象
      11. 迭代器初始并不指向第一个元素,迭代器是所有Collection通用的,Map不能用
      12. 只要集合结构发生改变,迭代器必须重新获取
      13. */
      14. Iterator iterator = collection.iterator();
      15. // 2、迭代集合中的元素
      16. while (iterator.hasNext()){ // 如果还有元素可迭代,则返回true
      17. Object o = iterator.next(); // 返回迭代的下一个元素
      18. /*
      19. 此时删除元素后,集合结构发生改变,
      20. 循环下一次的时候没有获取新的迭代器,就会发生异常
      21. java.util.ConcurrentModificationException
      22. 此时应该使用迭代器中的remove()方法
      23. */
      24. //collection.remove(o);
      25. iterator.remove(); // 迭代器中的remove()方法
      26. System.out.println(next);
      27. }
      28. }
      29. }

      四、深入contains和remove方法

      contains()方法底层调用了 equals() 方法进行比对!!!如果没有重写equals()方法的话,就会调用Object中的equals()方法,而Object中的equals()方法对于引用数据类型来说,比较的是内存地址;remove()方法的底层也是调用了equals()方法!!!

      1. public class ContainsTest {
      2. public static void main(String[] args) {
      3. Collection c = new ArrayList();
      4. String s1 = new String("abc");
      5. String s2 = new String("abc");
      6. c.add(s1);
      7. System.out.println(c.contains(s2)); // true
      8. /*
      9. 因为String重写了equals()方法
      10. 会将s2和集合中的元素一个一个进行比较
      11. 所以该段代码底层其实是这样比较的:s2.equals(s1)
      12. 此时会认为s2和s1是一样的,所以返回true
      13. */
      14. c.remove(s2);
      15. System.out.println(c.size()); // 0
      16. /*
      17. 这里因为remove底层也是调用了equals方法,所以认为s1和s2是一样的
      18. 即使s2没有加入集合中,依然可以删除s1
      19. */
      20. }
      21. }

      无标题.png