Java 集合框架

  • 集合类的由来
    对象用于封装特有数据,面向对象的语言会产生很多对象,为了方便操作对象,所以
    首先对对象进行存储,而集合就是用于存储对象的容器.

  • 集合的特点:

    • 用于存储对象的容器
    • 集合的长度是可变的
    • 集合中不可以存储基本数据类型值, 集合是用于存储对象的
  • 集合框架
    集合容器因为内部的数据结构不同,有多种具体容器,不断的向上抽取, 就形成了集合框架.
    框架的顶层就是 Collection 接口, 即定义类集合体系中的共性方法

  • 集合框架的构成及分类

  • Collection 的常见方法
    1. 添加

boolean add(Object obj); // 添加成功, 返回值为真.否则,为假
boolean addAll(Collection coll);

    2. 删除,(只有两种表现形式: delete 或者 remove)

    ```
boolean remove(Object obj); //会改变集合的长度
boolean removeAll(Collection coll); // 将两个集合中的相同元素从调用 removeAll() 的集合中删除
void clear(); //清空, 将集合中的元素都删掉, 集合还存在
3. 判断

```

boolean contains(Object obj);
boolean containsAll(Collection coll);
boolean isEmpty(); // 判断集合是否有元素

    4. 获取

    ```
int size(); // 获取长度的方法,length 或者 size
Iterator iterator(); // 迭代器, 取出集合中元素的方式
5. 其他

```

boolean retainAll(Collection coll); // 取交集, 保留和指定的集合相同的元素, 删除不同的元素
// 和 removeAll 功能相反
Object[] toArray(); // 将集合转成数组


### 迭代器的使用及原理

public static void main(String[] args){
Collection coll = new ArrayList();

coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");

// 使用 Collection 中的 iterator() 方法. 调用集合中的迭代器方法,
// 是为了获取集合中的迭代器对象
Iterator it = coll.iterator();
while(it.hasNext()){
    System.out.println(it.next());

}

// for 循环结束后, it 从内存中消失, 节约内存
for(Iterator it = coll.iterator(); it.hasNext(); ){
    System.out.println(it.next());

}
}

Iterator 对象必须依赖与具体的容器, 因为每一个容器的数据结构不同, 所以该迭代器对象是在容器中进行
内部实现的.对于使用容器者而言, 具体的实现不重要,只要通过容器获取到该实现迭代器的对象即可, 也就是
iterator() 方法.

Iterator 接口就是对所有的 Collection 容器进行元素取出的公共接口.

![](http://images2017.cnblogs.com/blog/1222878/201709/1222878-20170907100335288-435046699.png)

- Collection 接口的子接口
    - List: 有序(存入和取出的顺序一致), 元素有索引(角标), 元素可以重复
    - Set: 元素不能重复, 无序.

- List 接口
    1. 常见方法

    ```
    // 1. 添加
        void add(index, element);
        void add(index, collection);

    // 2. 删除
        Object remove(index); // 返回被删除对象

    // 3. 修改
        Object set(index, element); // 使用指定元素替换列表中指定位置的元素, 返回被替换对象

    // 4. 获取
        Object get(index);
        int indexOf(object);
        int lastIndexOf(object);
        List subList(from, to); // 包含头, 不包含尾
2. List 集合元素取出方式:
        public static void main(String[] args){
            List list = new ArrayList();

            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            list.add("abc4");

            // 通用取出方式
            Iterator it = list.iterator();
            while(it.hasNext()){
                System.out.println("next:" + it.next());
        }
            // list 特有取出方式
            for(int i = 0; i<list.size(); i++){
                System.out.println("get:" + list.get(i));
        }

    }
3. 异常情况
        public static void main(String[] args){
            List list = new ArrayList();

            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            list.add("abc4");

            Iterator it = list.iterator();
            while(it.hasNext()){

                Object obj = it.next(); //出现异常, java.util.ConcurrentModificationException
                                        // 在遍历的过程中, 既有迭代器遍历元素, 又有集合添加元素.
                                        // 集合添加的元素, 迭代器并不知道, 因此出现异常
                if(obj.equals("abc2"))
                    list.add("abc9");
                else
                    System.out.println("next:" + obj);
            }
    }

        // 解决方案: 使用 Iterator 接口的子接口 ListIterator 来完成, 在迭代过程中, 对元素进行更多的操作

        public static void main(String[] args){
            List list = new ArrayList();

            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            list.add("abc4");

            ListIterator it = list.listIterator(); // 获取列表迭代器对象
                                                  // 它可以实现在迭代过程中对元素的增删改查
                                                  // 只有 list 集合具备该迭代功能
            while(it.hasNext()){
                Object obj = it.next();

                if(obj.equals("abc2")){
                    it.add("abc9");
            }
            System.out.println("list:" + list);
        }
    }


_参考资料_ - [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3113337/index_1.html#page=6) - [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)
原文地址:https://www.cnblogs.com/linkworld/p/7488275.html