Java中集合

1.集合

1.1 集合的由来及集合继承体系图

*A:集合的由来

* 数组长度是固定的,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,Java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少

*B:数组和集合的区别

  * 区别1:

    * 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值。

    * 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象 Integer int Double double

  * 区别2:

    * 数组长度是固定的,不能自动增长

    * 集合的长度是可变的,可以根据元素的增加而增长

*C:数组和集合什么时候用

  * 1.如果元素个数是固定的,推荐用数组

   * 2.如果元素个数不是固定的,推荐用集合(用处更多)

*D:集合继承体系图

1.2 Collection 集合的基本功能测试

package com.se.test2;

import java.util.ArrayList;
import java.util.Collection;

public class Demo2 {
    public static void main(String[] args) {
//        demo1();
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        boolean b = c.remove("a");
        System.out.println(b); // true
        System.out.println(c); // [b, c, d]
//        c.clear(); //清空集合
//        System.out.println(c); // []
        boolean b1 = c.contains("c"); // 判断集合中是否包含"c"
        System.out.println(b1); // true
        System.out.println(c.isEmpty()); // 判断集合是否为空
        int size = c.size(); // 获取元素个数
        System.out.println(size);
    }

    public static void demo1() {
        Collection c = new ArrayList(); //多态,父类引用指向子类对象
        // add(E e)将指定元素添加到列表的尾部
        c.add("abc");
        c.add(true);
        c.add(100);
        c.add("abc");
        c.add(new Student("张三",19));
        c.add(new Student("李四",20));
        System.out.println(c); // 重写了toString()方法
    }
}

1.3 集合的遍历之集合转数组遍历

package com.se.test2;

import java.util.ArrayList;
import java.util.Collection;

public class Demo3 {
    public static void main(String[] args) {
//        demo();
        Collection c = new ArrayList();
        //Object obj = new Student("天气", 22);
        c.add(new Student("张三", 23));
        c.add(new Student("李四", 21));
        c.add(new Student("王五", 25));
        c.add(new Student("赵六", 26));
        //将集合转为数组
        Object[] arr = c.toArray();
        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);
            //在Student类中没有重写toString()时候,向下转型
            Student s = (Student) arr[i];
            System.out.println(s.getName() + "-----" + s.getAge());
        }
    }

    public static void demo() {
        Collection c = new ArrayList();
        c.add(1); // int --> Integer 自动装箱也就是向上转换
        c.add("b");
        c.add("c");
        c.add("d");

        //将集合转换成数组,一般不用这种方式
        Object[] arr = c.toArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

1.4 Collection 集合的带All功能测试

package com.se.test2;

import java.util.ArrayList;
import java.util.Collection;

public class Demo4 {
    public static void main(String[] args) {
//        demo();
//        demo2();
//        demo3();
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");

        Collection c2 = new ArrayList();
        c2.add("a");
        c2.add("b");
        c2.add("c");
        c2.add("d");
        c2.add("e");
        // 调用的对象c1中的元素如果改变了就返回true,如果没有改变就返回false
        boolean b = c1.retainAll(c2); // 取交集
        System.out.println(b);
        System.out.println(c1);
    }

    public static void demo3() {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");

        Collection c2 = new ArrayList();
        c2.add("a");
        c2.add("b");
        boolean b = c1.containsAll(c2); // 判断调用的集合是否包含传入的集合
        System.out.println(b);
    }

    public static void demo2() {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");

        Collection c2 = new ArrayList();
        c2.add("e");
        c2.add("f");
        c2.add("a");
        boolean b = c1.removeAll(c2); // 删除的是交集
        System.out.println(b);
        System.out.println(c1);
    }

    public static void demo() {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");

        Collection c2 = new ArrayList();
        c2.add("a");
        c2.add("b");
        c2.add("c");
        c2.add("d");
        c1.addAll(c2);
        //将c2中的每一个元素添加到c1中
        //c1.add(c2);
        //c1.add(c2); // 将c2看成一个对象添加到c1中
        System.out.println(c1);
        System.out.println(c1.size());
    }
}

1.5 集合的遍历之迭代器遍历

package com.se.test2;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Demo5 {
    public static void main(String[] args) {
//        demo();
        Collection c = new ArrayList();
        c.add(new Student("张三", 20));
        c.add(new Student("李四", 21));
        c.add(new Student("王五", 22));
        c.add(new Student("赵六", 23));
        //获取迭代器
        Iterator it = c.iterator();
        while (it.hasNext()) {
//            System.out.println(it.next()); // 为重写toString()方法,打印出来的是地址值;重写toString()后可以输出
            //向下转型
            Student stu = (Student) it.next();
            System.out.println(stu.getName() + "----" + stu.getAge());
        }
        //for循环
//        for (Iterator it = c.iterator(); it.hasNext();){
//            System.out.println(it.next());
//        }
    }

    public static void demo() {
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        c.add("e");
        Iterator it = c.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

1.6 List 集合存储学生对象并遍历

package com.se.test2;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Demo6 {
    public static void main(String[] args) {
//        Collection c = new ArrayList(); // 多态,祖先引用指向子类对象
        List list = new ArrayList();    // 多态,父类引用指向子类对象
        list.add("a");
        list.add("b");
        list.add("c");
        list.add(3,"f");
        list.set(1,"f"); // 把指定位置的元素给修改了
        System.out.println(list);
        Iterator it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

1.7 并发修改异常产生的原因及解决方法(了解)

也就是用iterator()迭代器,在遍历集合的同时不能修改集合,不然会引发异常ConcurrentModificationException异常

package com.se.test2;

import java.util.*;

public class Demo7 {
    /**
     * 需求:我有一个集合
     * 请问,我想判断里面有没有”world“这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
     * contains
     * 1.遍历集合的每一个元素
     * 2.取到每一个元素和world进行对比,如果相等了就把javaee添加到集合中
     * @param args
     */
    public static void main(String[] args) {
//        Collection c = new ArrayList();
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("world");
        list.add("d");
//        Iterator it = list.iterator();
//        while (it.hasNext()){
//            String str = (String)it.next();
//            if (str.equals("world")){
//                list.add("javaee"); // 遍历集合的同时,你修改集合了,会导致并发异常问题
//            }
//        }
        ListIterator lit = list.listIterator();
        while (lit.hasNext()){
            String str = (String) lit.next();
            if (str.equals("world")){
                // 遍历集合的同时,不使用集合list本身去做修改操作,而是用迭代器lit去修改
                lit.add("javaee");
            }
        }
        System.out.println(list);
    }
}

1.8 ListIterator(了解)

 

1.9 Vector 的特有功能

* A:Vector类概述

* B:Vector类特有功能

  * public void addElement(E obj)

  * public E elementAt(int index)

  * public Enumeration elements()

1.10 数组结构之数组和链表

* A:数组

  * 查询快,修改也快

  * 增删慢

* B:链表

  * 查询慢,修改也慢

  * 增删快

1.11 List 的三个子类的特点

* A:List 的三个子类的特点

  ArrayList:

     底层数据结构是数组,查询快,增删慢,有序

    线程不安全,效率高。

  Vector:

    底层数据结构是数组,查询快,增删慢

    线程安全,效率低。

  Vector 相对 ArrayList 查询慢(线程安全的)

  Vector 相对 linkedList 增删慢(数组结构)

  LinkedList:

    底层数据结构是链表,查询慢,增删快。无序

    线程不安全,效率高。

  

  Vector 和 ArrayList 的区别:

    Vector 是线程安全的,效率低

    ArrayList是线程不安全的,效率高

  共同点:都是数组实现的

  ArrayList 和 LinkedList 的区别

    ArrayList 底层是数组结果,查询和修改快

    LinkedList 底层是链表结构的,增和删比较快,查询和修改比较慢

  共同点:都是线程不安全的


* B: List 有三个儿子,我们到底使用谁呢?

  查询多用ArrayList

  增删多用LinkedList

  如果都多ArrayList

原文地址:https://www.cnblogs.com/LEPENGYANG/p/15009011.html