2019-05-24 Java学习日记之Colletion集合

对象数组的概述和使用:

 需求:我有5个学生,请把这5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息

Student[ ] arr = new Student[5];    //存储学生对象

arr[0] = new Student("张三",23);  

arr[1] = new Student("李四",24);

arr[2] = new Student("王五",25);

arr[3] = new Student("赵六",26);

arr4] = new Student("老马",20);

for (int i = 0; i < arr.length; i++){

  System.out.println(arr[i]);

}

import com.bean.Student;

public class Demo1 {
    public static void main(String[] args) {
        // int[] arr = new int[5]; //创建基本数据类型数组
        Student[] arr = new Student[5]; // 创建引用数据类型数组
        
        arr[0] = new Student("张三", 23);        //创建一个学生对象,存储在数组的第一个位置
        arr[1] = new Student("李四", 24);        //创建一个学生对象,存储在数组的第二个位置
        arr[2] = new Student("王五", 25);        //创建一个学生对象,存储在数组的第三个位置
        arr[3] = new Student("赵六", 26);        //创建一个学生对象,存储在数组的第四个位置
        arr[4] = new Student("老马", 20);        //创建一个学生对象,存储在数组的第五个位置
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

注:数组和集合存储引用数据类型,存的都是地址值

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

A:集合的由来

数组长度是固定的,当添加元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,

能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少

B:数组和集合的区别:

区别1:

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

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

区别2:

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

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

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

1、如果元素个数是固定的推荐使用数组

2、如果元素个数不是固定的推荐使用集合

Collection集合的基本功能测试:

注意:collectionXxx.java使用了未经检查或不安全的操作

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

import com.bean.Student;

public class Demo2 {
    /**
     * add方法如果是List集合一直都返回true,因为List集合中是可以存储重复元素的
     * 如果是Set集合当存储重复元素的时候,就会返回false
     * 
     * ArrayList的父类的父类重写toString方法,所以在打印对象的引用的时候,输出的结果不是object类中toString的结果
     */
    public static void main(String[] args) {
//        demo1();
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
//        c.remove("b");                            //删除指定元素
//        c.clear();                                //清空集合
//        System.out.println(c.contains("b"));    //判断是否包含
//        System.out.println(c.isEmpty());
        System.out.println(c.size());             //获取元素的个数
        System.out.println(c);
        
    }

    public static void demo1() {
        Collection c = new ArrayList();
        boolean b1 = c.add("abc");
        boolean b2 = c.add(true);
        boolean b3 = c.add(100);
        boolean b4 = c.add(new Student("张三",23));
        boolean b5 = c.add("abc");
        
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);
        System.out.println(b4);
        System.out.println(b5);
        
        System.out.println(c.toString());
    }

}

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

集合的遍历:其实就是一次获取集合中的每一个元素

    public static void demo2() {
        Collection c = new ArrayList();
        c.add(new Student("张三",29));
        c.add(new Student("李四",24));
        c.add(new Student("王五",26));
        c.add(new Student("赵六",22));
        
        Object[] arr = c.toArray();                    //将集合转换成数组
        for (int i = 0; i < arr.length; i++) {
            //System.out.println(arr[i]);
            Student s = (Student)arr[i];            //向下转型
            System.out.println(s.getName() + "..." + s.getAge());
        }
    }

    public static void demo1() {
        Collection c = new ArrayList();
        c.add("a");
        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]);
        }
    }

Collection集合的带All功能测试:

    public static void demo4() {
        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("z");
        
        //取交集,如果调用的集合改变就返回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");
        c2.add("z");
        
        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("a");
        c2.add("b");
        c2.add("z");
        
        boolean b = c1.removeAll(c2);
        System.out.println(b);
        System.out.println(c1);
    }

    public static void demo1() {
        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); // 将c2看成一个对象添加到c1中
        System.out.println(c1);
    }

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

概述:

集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)

    public static void demo2() {
        Collection c = new ArrayList();
        c.add(new Student("张三",29));
        c.add(new Student("李四",24));
        c.add(new Student("王五",26));
        c.add(new Student("赵六",22));
        
        //获取迭代器
        Iterator it = c.iterator();
        while (it.hasNext()) {
            //System.out.println(it.next());
            Student s = (Student)it.next();        //向下转型
            System.out.println(s.getName() + "..." + s.getAge());
        }
    }

    public static void demo1() {
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        
        //对集合中的元素迭代(遍历)
        Iterator it = c.iterator();            //获取迭代器
        
        /*boolean b1 = it.hasNext();            //判断集合中是否有元素,有就返回true
        Object obj1 = it.next();
        System.out.println(b1);
        System.out.println(obj1);
        
        boolean b2 = it.hasNext();            //判断集合中是否有元素,有就返回true
        Object obj2 = it.next();
        System.out.println(b2);
        System.out.println(obj2);*/
        
        while (it.hasNext()) {
            System.out.println(it.next());
            
        }
    }

Collection存储自定义对象并遍历:

迭代器的原理及源码解析:

A:迭代器原理

迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和

取都是不一样的,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以

的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,

定义自己的迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,

第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可

B:迭代器源码解析

1、在eclipse中Ctrl + shift + t 找到ArrayList类

2、Ctrl + o查找iterator()方法

3、查看返回值是new Itr(),说明Itr这个类实现Iterator接口

4、查找Itr这个内部类,发现重写了Iterator中的所有抽象方法

List集合的特有功能概述和测试:

概述:

void add(int index,E element)

E remove(int index)

E get(int index)

E set(int index,E element)

    public static void demo5() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        list.set(1, "z");            //将指定位置的元素修改
        System.out.println(list);
    }

    public static void demo4() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        //Object obj = list.get(2);
        //System.out.println(obj);
        //通过索引遍历list集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    public static void demo3() {
        List list = new ArrayList();
        list.add(111);
        list.add(222);
        list.add(333);
        list.add(444);
        
        list.remove(111);            //删除的时候不会自动装箱,把111当作索引
        System.out.println(list);
    }

    public static void demo2() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        Object obj = list.remove(1);    //通过索引删除元素,被删除的元素返回
        System.out.println(obj);
        System.out.println(list);
    }

    public static void demo1() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add(4,"f");    //index <= size并且index >= 0都不会 报异常
        //list.add(1,"e");
        //list.add(10,"z");    //java.lang.IndexOutOfBoundsException,当存储时使用不存在索引时
        
        System.out.println(list);
    }

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

import java.util.List;
import java.util.ArrayList;

import com.bean.Student;

public class Demo2 {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Student("张三",29));
        list.add(new Student("李四",24));
        list.add(new Student("王五",26));
        list.add(new Student("赵六",22));
        
        for (int i = 0; i < list.size(); i++) {
            //System.out.println(list.get(i));    //通过索引获取每一个元素
            Student s = (Student)list.get(i);
            System.out.println(s.getName() + "..." + s.getAge());
        }
    }

}

并发修改异常产生的原因及解决方案:

A:需求:

我有一个集合,请问,我想判断里面有没有“world”这个元素,如果有,我就添加一个“javaee”元素

,请写代码实现

 B:ConcurrentModificationException出现

迭代器遍历,集合修改集合

C:解决方案

a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

b:集合遍历元素,集合修改元素

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Demo3 {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("world");
        list.add("d");
        list.add("f");
        /*
        Iterator it = list.iterator();            //获取迭代器
        while (it.hasNext()) {                    //判断集合中是否有元素
            String str = (String)it.next();        //向下转型
            if ("world".equals(str)) {
                list.add("javaee");                //遍历的同时在增加元素,并发修改ConcurrentModificationException
            }
            
        }*/
        
        ListIterator lit = list.listIterator();    //获取迭代器(List集合特有的)
        while (lit.hasNext()) {
            String str = (String)lit.next();    //向下转型
            if ("world".equals(str)) {
                //list.add("javaee");                //遍历的同时在增加元素,并发修改ConcurrentModificationException
                lit.add("javaee");
            }
        }
        System.out.println(list);
    }
}

数据结构之数组和链表:

A:数组

查询快修改也快

B:链表

查询慢,修改也慢

增删快

List的三个子类的特点:

A:特点

ArrayList:

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

线程不安全,效率高

Vector:

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

线程安全,效率低。

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

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

LinkedList:

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

线程不安全,效率高

Vector和ArrayList的区别:

Vector是线程安全的,效率低

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

共同点:都是数组实现的

ArrayList和LinkedList的区别:

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

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

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

原文地址:https://www.cnblogs.com/clqbolg/p/10922998.html