zoukankan      html  css  js  c++  java
  • 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底层是链表结构的,增和删比较快,查询和修改比较慢

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

  • 相关阅读:
    算法笔记 第3章 入门篇(1) 学习笔记
    算法笔记 上机训练实战指南 第3章 入门篇(1)--入门模拟 学习笔记 3.1简单模拟
    机器学习实战:基于Scikit-Learn和TensorFlow 第5章 支持向量机 学习笔记(硬间隔)
    机器学习实战:基于Scikit-Learn和TensorFlow 读书笔记 第6章 决策树
    算法笔记 第7章 提高篇(1)--数据结构专题(1) 学习笔记
    算法笔记 第6章 C++标准模版库(STL)介绍 学习笔记
    自然语言处理入门 何晗 读书笔记 第2章 词典分词
    自然语言处理入门 何晗 读书笔记 第1章 新手上路
    [ML]随机森林
    [ML]LightGBM论文理解
  • 原文地址:https://www.cnblogs.com/clqbolg/p/10922998.html
Copyright © 2011-2022 走看看