一、概述
- 集合本身是一个容器,是一个对象
- 集合不可以直接存储基本数据类型(自动装箱),也不能直接存储Java对象,而是存储Java对象的内存地址;换句话说就是:集合中在任何时候存储的都是“引用”
- Java中每一个不同的集合在底层都会对应不同的数据结构,向不同的集合中存储元素,等于将数据放到了不同的数据结构中
- 所有集合类和集合接口都在 java.util 包下
Java中集合分为两大类
- 单个方式存储元素(超级父接口 java.util.Collection)
键值对方式存储元素(超级父接口 java.util.Map)
二、继承结构
三、迭代器
public class CollectionTest {public static void main(String[] args) {Collection collection = new ArrayList();collection.add("abc");collection.add(123);collection.add(new Object());collection.add(2.3);collection.add("abc");/*1、获取迭代器对象迭代器初始并不指向第一个元素,迭代器是所有Collection通用的,Map不能用只要集合结构发生改变,迭代器必须重新获取*/Iterator iterator = collection.iterator();// 2、迭代集合中的元素while (iterator.hasNext()){ // 如果还有元素可迭代,则返回trueObject o = iterator.next(); // 返回迭代的下一个元素/*此时删除元素后,集合结构发生改变,循环下一次的时候没有获取新的迭代器,就会发生异常java.util.ConcurrentModificationException此时应该使用迭代器中的remove()方法*///collection.remove(o);iterator.remove(); // 迭代器中的remove()方法System.out.println(next);}}}
四、深入contains和remove方法
contains()方法底层调用了 equals() 方法进行比对!!!如果没有重写equals()方法的话,就会调用Object中的equals()方法,而Object中的equals()方法对于引用数据类型来说,比较的是内存地址;remove()方法的底层也是调用了equals()方法!!!
public class ContainsTest {public static void main(String[] args) {Collection c = new ArrayList();String s1 = new String("abc");String s2 = new String("abc");c.add(s1);System.out.println(c.contains(s2)); // true/*因为String重写了equals()方法会将s2和集合中的元素一个一个进行比较所以该段代码底层其实是这样比较的:s2.equals(s1)此时会认为s2和s1是一样的,所以返回true*/c.remove(s2);System.out.println(c.size()); // 0/*这里因为remove底层也是调用了equals方法,所以认为s1和s2是一样的即使s2没有加入集合中,依然可以删除s1*/}}




