zoukankan      html  css  js  c++  java
  • 对象数组、集合、链表(java基础知识十五)

    1.对象数组的概述和使用

    * 需求:我有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);
            arr[4] = new Student("马哥", 20);
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }

    2.集合的由来

    * A:集合的由来
        * 数组长度是固定,当需要增加和减少元素时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。
    * B:数组和集合的区别
        * 区别1 : 
            * 数组既可以存储基本数据类型,又可以存储引用数据类型
            * 集合只能存储引用数据类型(对象)
        * 区别2:
            * 数组长度是固定的,不能自动增长
            * 集合的长度的是可变的,可以根据元素的增加而增长
    * 数组和集合什么时候用
            * 1,如果元素个数是固定的推荐用数组
            * 2,如果元素个数不是固定的推荐用集合。

    3.Collection集合的基本功能测试

    * 1.Collection 层次结构 中的根接口。
    * 2.Collection 表示一组对象,这些对象也称为 collection 的元素。
    * 3.一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
    * 4.JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。

    基本功能演示
            boolean add(E e)  //添加一个元素到集合中
            boolean addAll()   //将一个集合中的所有元素添加到另一个集合中去
    
            boolean remove(Object o)  //移除指定的元素
            boolean removeAll()  //删除某个集合中的另一个集合中的所有元素
            
            void clear()  //清空集合,即删除集合中的所有元素
            
            boolean contains(Object o)  //包含指定的元素返回true
            boolean contaionsAll()  //判断一个集合中是否包含另一个集合中的所有元素
            
            boolean isEmpty()  //判断集合是否为空
            int size()  //集合元素的个数

    4.集合的遍历之集合转数组遍历

    * A:集合的遍历
        * 其实就是依次获取集合中的每一个元素。
    * B:案例演示
        * 把集合转成数组,可以实现集合的遍历
        * toArray()
        *
            
                Collection coll = new ArrayList();
                coll.add(new Student("张三",23));        //Object obj = new Student("张三",23);
                coll.add(new Student("李四",24));
                coll.add(new Student("王五",25));
                coll.add(new Student("赵六",26));
                
                Object[] arr = coll.toArray();                //将集合转换成数组
                for (int i = 0; i < arr.length; i++) {
                    Student s = (Student)arr[i];            //强转成Student
                    System.out.println(s.getName() + "," + s.getAge());
                }

    5.Collection集合的高级功能测试

    带All的功能演示
            boolean addAll(Collection c)//把一个集合中所有的元素添加到另一个集合的后面
            boolean removeAll(Collection c)//从一个集合中删除另一个集合,删除的是交集
            boolean containsAll(Collection c)//一个集合是否包含另一个集合
            boolean retainAll(Collection c)//求俩个集合的交集

    6.集合的遍历之迭代器遍历

    * A:迭代器概述
        * 集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历) 
    * B:案例演示
        * 迭代器的使用
            
                Collection c = new ArrayList();
                c.add("a");
                c.add("b");
                c.add("c");
                c.add("d");
                
                Iterator it = c.iterator();                        //获取迭代器的引用
                while(it.hasNext()) {                            //集合中的迭代方法(遍历)
                    System.out.println(it.next());
                }

    7.Collection存储自定义对象并遍历

    * A:案例演示
        * Collection存储自定义对象并用迭代器遍历
        * 
                Collection c = new ArrayList();
                
                c.add(new Student("张三",23));
                c.add(new Student("李四",24));
                c.add(new Student("王五",25));
                c.add(new Student("赵六",26));
                c.add(new Student("赵六",26));
                
                for(Iterator it = c.iterator();it.hasNext();) {
                    Student s = (Student)it.next();                        //向下转型
                    System.out.println(s.getName() + "," + s.getAge());    //获取对象中的姓名和年龄
                }
                System.out.println("------------------------------");
                Iterator it = c.iterator();                                //获取迭代器
                while(it.hasNext()) {                                    //判断集合中是否有元素
                    //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
                    Student s = (Student)it.next();                        //向下转型
                    System.out.println(s.getName() + "," + s.getAge());    //获取对象中的姓名和年龄
                }

    8.迭代器的原理及源码解析

    * A:迭代器原理
        * 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可。 
    * B:迭代器源码解析
        * 1,在eclipse中ctrl + shift + t找到ArrayList类
        * 2,ctrl+o查找iterator()方法
        * 3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
        * 4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法 。

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

    * 1.有序的 collection(也称为序列)。
    * 2.此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
    * 3.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
    * 4.List 接口在 iterator、add、remove、equals 和 hashCode 方法的协定上加了一些其他约定,超过了 Collection 接口中指定的约定。
    * 5.List 接口提供了 4 种对列表元素进行定位(索引)访问方法。
    * 6.在列表元素上迭代通常优于用索引遍历列表。
    * A:List集合的特有功能概述
        * void add(int index,E element)//在某个位置添加固定的元素
        * E remove(int index)//删除某个固定位置的元素
        * E get(int index)//得到某个固定位置的元素
        * E set(int index,E element)//把某个固定位置的设置为

    * 通过size()和get()方法结合使用遍历。
                List list = new ArrayList();
                list.add("a");
                list.add("b");
                list.add("c");
                list.add("d");
                list.add("e");
                //这种遍历只支持list集合,set集合不可以,因为set集合无索引
                for(int i = 0; i < list.size(); i++) {            
                    System.out.println(list.get(i));                //根据索引获取值
                }
    * List集合存储学生对象并遍历。
        * 通过size()和get()方法结合使用遍历。
                List list = new ArrayList();
                list.add(new Student("马哥", 18));
                list.add(new Student("马粉1", 18));
                list.add(new Student("马粉2", 18));
                list.add(new Student("马粉3", 18));
                list.add(new Student("马粉4", 18));
                
                for(int i = 0; i < list.size(); i++) {
                    Student s = (Student)list.get(i);
                    System.out.println(s.getName() + "," + s.getAge());
                }
    * 需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
    
                List list = new ArrayList();
                list.add("a");
                list.add("b");
                list.add("world");
                list.add("d");
                list.add("e");
                
                /*Iterator it = list.iterator();
                while(it.hasNext()) {
                    String str = (String)it.next();
                    if(str.equals("world")) {
                        list.add("javaee");            //这里会抛出ConcurrentModificationException并发修改异常
                    }
                }*/

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

    * A:ConcurrentModificationException出现
        * 迭代器遍历,集合修改集合
    *C:解决方案
        * a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
        * b:集合遍历元素,集合修改元素
    
                ListIterator lit = list.listIterator();        //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
                while(lit.hasNext()) {//判断是否由下一个元素
                    String str = (String)lit.next();//强转类型
                    if(str.equals("world")) {//是否和指定的字符串一样
                        lit.add("javaee");    //添加
                        //list.add("javaee");//会发生并发修改异常ConcurrentModificationException
                    }
                }

    11.ListIterator、Vector的特有功能

    * boolean hasNext()是否有下一个
    * boolean hasPrevious()是否有前一个
    * Object next()返回下一个元素
    * Object previous();返回上一个元素
    * A:Vector类概述
    * B:Vector类特有功能
        * public void addElement(E obj)//添加元素
        * public E elementAt(int index)//返回指定索引处的元素
        * public Enumeration elements()//枚举
    * C:案例演示    
        * Vector的迭代
    
                Vector v = new Vector();                //创建集合对象,List的子类
                v.addElement("a");
                v.addElement("b");
                v.addElement("c");
                v.addElement("d");
                
                //Vector迭代
                Enumeration en = v.elements();            //获取枚举
                while(en.hasMoreElements()) {            //判断集合中是否有元素
                    System.out.println(en.nextElement());//获取集合中的元素
                }

    12.数据结构之数组和链表

    * A:数组
        * 查询快修改也快
        * 增删慢
    * B:链表
        * 查询慢,修改也慢
        * 增删快

    13.List的三个子类的特点

        ArrayList:
                底层数据结构是数组,查询快,增删慢。
                线程不安全,效率高。
            Vector:
                底层数据结构是数组,查询快,增删慢。
                线程安全,效率低。
            Vector相对ArrayList查询慢(线程安全的)
            Vector相对LinkedList增删慢(数组结构)
            LinkedList:
                底层数据结构是链表,查询慢,增删快。
                线程不安全,效率高。
    
            Vector和ArrayList的区别
                Vector是线程安全的,效率低
                ArrayList是线程不安全的,效率高
            ArrayList和LinkedList的区别
                ArrayList底层是数组结果,查询和修改快
                LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
         查询多用ArrayList
            增删多用LinkedList
            如果都多ArrayList
  • 相关阅读:
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    使用Jasmine和karma对传统js进行单元测试
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南
    nginx 基于IP的多虚拟主机配置
    Shiro 框架的MD5加密算法实现原理
    项目实战:Qt+OSG三维点云引擎(支持原点,缩放,单独轴或者组合多轴拽拖旋转,支持导入点云文件)
    实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  • 原文地址:https://www.cnblogs.com/wanghui1316/p/5449782.html
Copyright © 2011-2022 走看看