集合框架、泛型、迭代(java基础知识十六)

1.ArrayList存储自定义对象并遍历

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。* ArrayList存储自定义对象并遍历
            ArrayList<Person> list = new ArrayList<>();
            list.add(new Person("张三",23));
            list.add(new Person("李四",24));
            list.add(new Person("王五",25));
            迭代器
            //Iterator
            for ( Iterator<Person> i = list.iterator(); i.hasNext(); ) {
                Person p = i.next();
                System.out.println(p);//输出的是每个对象;
                System.out.println(p.getName()+","+p.getAge());//输出对象中的属性值
            }
            * 普通for
            for(int i = 0;i < list.size();i++){
                Person p = (Person)list.get(i);//强转
                System.out.println(p);//输出每个对象
                System.out.println(p.getName()+","+p.getAge());
            }

2.Vector的特有功能

* A:Vector类概述
* B:Vector类特有功能
    * public void addElement(E obj)//添加一个元素
    * public E elementAt(int index)//返回指定索引处的元素
    * public Enumeration elements()//迭代
* C:案例演示
    * Vector的特有功能演示
    *   Vector v = new Vector();
        v.addElement("my");
        v.addElement("girl");
        Object obj = v.elementAt(1);
        System.out.println(obj);//girl
        for(Enumeration e = v.elements();e.hasMoreElements();){
            System.out.println(e.nextElement());
        }

3.LinkedList的特有功能

* A:LinkedList类概述* 底层数据结构是链表,查找慢,删除快
* B:LinkedList类特有功能
    * public void addFirst(E e)及addLast(E e)//在头添加,在尾添加
    * public E getFirst()及getLast()//得到头元素,得到尾元素
    * public E removeFirst()及public E removeLast()//删除头元素,删除尾元素
    * LinkedList list = new LinkedList();
        list.addFirst("1");
        list.addFirst("2");
        System.out.println(list);//[2,1]
        list.addLast("3");
        list.addLast("4");
        System.out.println(list);//[2,1,3,4]
        Object obj = list.getFirst();
        System.out.println(obj);//2
        Object obj1 = list.getLast();
        System.out.println(obj1);//4
        Object obj2 = list.removeFirst();
        System.out.println(obj2);//2
        System.out.println(list);
        Object obj3 = list.removeLast();
        System.out.println(obj3);//4
        System.out.println(list);//[1,3]    

4.去除ArrayList中重复字符串元素方式

需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
        思路:创建新集合方式
        public static void main(String[] args) {
            ArrayList list = new ArrayList();
            list.add("a");
            list.add("a");
            list.add("b");
            list.add("b");
            list.add("c");
            list.add("c");
            ArrayList list2 = getSingle(list);
            System.out.println(list2);
        }
        public static ArrayList getSingle(ArrayList list){
            ArrayList list1 = new ArrayList();
            for(Iterator i = list.iterator();i.hasNext();){
                String str = (String)i.next();
                if(!list1.contains(str)){
                    list1.add(str);
                }
            }
            return list1;
        }
需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
        public static void main(String[] args) {
            ArrayList list = new ArrayList();
            list.add(new Person("张三",23));
            list.add(new Person("张三",23));
            list.add(new Person("李四",24));
            list.add(new Person("李四",24));
            list.add(new Person("王五",25));
            list.add(new Person("王五",25));
            ArrayList list2 = getSingle1(list);
            System.out.println(list2);//重写equals 方法
        }
        public static ArrayList getSingle1(ArrayList list){
            ArrayList list1 = new ArrayList();
            for(Iterator i = list.iterator();i.hasNext();){
                Person p = (Person)i.next();
                if(!list1.contains(p)){
                    list1.add(p);
                    System.out.println(p.getName()+","+p.getAge());
                }
            }
            return list1;
        }    
* B:注意事项
        重写equals()方法的
        @Override
        public boolean equals(Object obj) {
            Person p = (Person)obj;
            return this.name.equals(p.name) && this.age == p.age;
        }
    * contains() 和remove() 方法底层都是依赖于equals()方法,
    * 如果没有重写equals()方法,比较的都是地址值。

5.用LinkedList模拟栈数据结构的集合并测试

需求:请用LinkedList模拟栈数据结构的集合,并测试
        1.LinkedList list = new LinkedList();
            list.addLast("B");//从结尾添加元素,
            list.addLast("M");
            list.addLast("W");
            System.out.println(list);
          while(!list.isEmpty()){
            list.removeLast();//删除结尾的元素
            System.out.println(list);
            }
            System.out.println(list);
        2.测试类:
            LinkedList list = new LinkedList();
                list.addFirst("B");//从开头添加元素,
                list.addFirst("M");
                list.addFirst("W");
                System.out.println(list);
            while(!list.isEmpty()){
                list.removeFirst();//删除结尾的元素
                System.out.println(list);
            }
            System.out.println(list);
          运行类:
            public class Stack {
                private LinkedList list = new LinkedList();
                //进栈,只需要把元素放进去即可,不需要任何返回类型;
                //返回值类型为:void ,参数列表:Object obj--传入任意一个数
                public void in(Object obj){
                    list.addFirst(obj);
                }
                //出栈,返回的是一个数,类型为:Object ;参数无。
            public Object out(){
                return list.removeFirst);
            }
            //判空方法。返回值类型为boolean。
            public boolean isEmpty(){
                return list.isEmpty();
                }
            }

6.泛型概述和基本使用

* A:泛型概述 <T>,JDK1.5出现的
    *  <> 是泛型,里面放的是引用数据类型,因为集合只能存引用数据类型。
    *  <> 前面加 后面不加 是JDK1.7版本出现,叫做菱形泛型
* B:泛型好处
    * 把运行期的错误转换到运行期、不用强转
* C:泛型基本使用

7.ArrayList存储字符串并遍历泛型版

 ArrayList<String> list = new ArrayList<>();
        list.add("MY");
        list.add("B");
        list.add("M");
        list.add("W");
        //不使用泛型
        for(Iterator i = list.iterator();i.hasNext();){
            String s = (String)i.next();//此处的i.next()接收的是Object类型
            System.out.println(s);
        }
        /*使用泛型,不用强转类型
            for(Iterator<String> i = list.iterator();i.hasNext();){
            String s = i.next();//此处的i.next()接收的是String类型。
            System.out.println(s);
            //System.out.println(i.next());//俩句可以换成一句。
        }*/
ArrayList存储自定义对象并遍历泛型版
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三",23));//此处添加的.add()方法,提示的只接受Person类的对象。
        list.add(new Person("李四",24));
        list.add(new Person("王五",25));
        //非泛型。需要强转。
        for (Iterator i = list.iterator(); i.hasNext();) {
            Person p = (Person) i.next();
            System.out.println(p.getName()+","+p.getAge());
        }
        /* 泛型的情况。
        for (Iterator<Person> i  = list.iterator(); i.hasNext();) {
            Person p = i.next();//此处直接得到的就是person中的对象。
            System.out.println(p.getName()+","+p.getAge());
        }*/

8.泛型的由来、泛型类的概述及使用

* 泛型的由来:通过Object转型问题引入
    * 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

* A:泛型类概述
    * 把泛型定义在类上
* B:定义格式
    * public class 类名<泛型类型1,…>
    * public class Tool<W>{}
    * 泛型类型在创建对象时才有值。
* C:注意事项    
    * 泛型类型必须是引用类型

9.泛型方法的概述和使用

* A:泛型方法概述
    * 把泛型定义在方法上
    * 非静态的方法:public void show(W w){}
    * 静态的方法:public static <W>返回值类型 方法名(W w){},静态的方法直接可以用类名.调用,优于对象的创建。
* B:定义格式    
    * public <泛型类型> 返回类型 方法名(泛型类型 变量名)

10.泛型接口的概述和使用

* A:泛型接口概述
    * 把泛型定义在接口上
* B:定义格式
    * public interface 接口名<泛型类型>
    * interface Inter<T>{
    *         public abstract void show();
    *   }
    * 1.class Demo implements Inter<String>{//建议开发用,实现接口,已经确定是什么类型了。
    *         public void show(String s){
    *             System.out.println(s);
    *         }
    * }
    * 2.class Demo<T> implements Inter<T>{//Demo创建对象才实现T
    *         public void show(T t){
    *
    *         }
    * }

11.泛型高级之通配符

* A:泛型通配符<?>//不确定谁来用
    * 任意类型,如果没有明确,那么就是Object以及任意的Java类了
* B:? extends E
    * 向下限定,E及其子类
    * 可以添加E类型以及E的子类型,E是上边界(固定上边界)
* C:? super E
    * 向上限定,E及其父类

12.增强for的概述和使用

* A:增强for概述
    * 底层就是迭代器实现
    * 简化数组和Collection集合的遍历
* B:格式:
        for(元素数据类型 变量 : 数组或者Collection集合) {
            使用变量即可,该变量就是元素
        }
        for(临时变量:容器名){
            输出临时变量;
        }

ArrayList存储字符串并遍历增强for版
        ArrayList<String> list = new ArrayList<>();
        list.add("MY");
        list.add("little");
        list.add("girl");
        for(String str : list){
            System.out.println(str);
        }
ArrayList存储自定义对象并遍历增强for版
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("张三",23));
        list.add(new Person("李四",24));
        list.add(new Person("王五",25));
        for (Person p : list) {
            //System.out.println(p);
            System.out.println(p.getName()+","+p.getAge());
        }

13.静态导入的概述和使用

* A:静态导入概述
    * 导入的是静态方法,只要是静态方法都能用静态导入,开发严重不推荐, 
* B:格式:
    * import static 包名….类名.方法名;
    * 可以直接导入到方法的级别
* C:注意事项
    * 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。

14.可变参数的概述和使用

* A:可变参数概述
    * 其实就是一个可变的数组
    * 定义方法的时候不知道该定义多少个参数
* B:格式
    * 修饰符 返回值类型 方法名(数据类型…  变量名){}
* C:注意事项:
    * 这里的变量其实是一个数组
    * 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

15.Arrays工具类的asList()方法的使用
* A:案例演示
    * Arrays工具类的asList()方法的使用
    * 将数组转换成集合,转换后的集合不能添加删除里面的元素,
    * 必须是引用数据类型的数组,否则会将整个数组当成一个对象,

集合嵌套之ArrayList嵌套ArrayList
        ArrayList<ArrayList<Person>> list = new ArrayList<>();
        ArrayList<Person> list1 = new ArrayList<>();
        list1.add(new Person("张三",23));
        list1.add(new Person("李四",24));
        list1.add(new Person("王五",25));
        ArrayList<Person> list2 = new ArrayList<>();
        list2.add(new Person("小张",12));
        list2.add(new Person("小李",11));
        list2.add(new Person("小王",13));
        list.add(list1);//添加集合
        list.add(list2);
        for(ArrayList<Person>li : list){
            for(Person p : li){
                System.out.println(p);
            }
        }        
时间: 2024-10-22 12:52:45

集合框架、泛型、迭代(java基础知识十六)的相关文章

ASP.NET Core 2.2 基础知识(十六) SignalR 概述

原文:ASP.NET Core 2.2 基础知识(十六) SignalR 概述 我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual-studio 这个例子一共涉及到下面几个步骤: 自定义中心 ChatH

java基础知识十二

第十二章 异常 异常(Exception):又称为例外,是程序在运行过程中发生的非正常事件,其发生会影响程序的正常执行.Exception是程序级错误,可由程序本身处理:Error是系统级错误,程序可不用处理.Java异常类都必须继承Throwable类或其子类.用户通过继承自定义异常.常见异常:除数为零.负数开方.数组越界.I/O异常. 抛出的异常由catch捕获,未被捕获的异常逐层传播直到main.如果main也没有处理该异常,则操作系统会终止main执行. 处理异常时,也可以抛出新异常,也

包、修饰符、内部类、匿名内部类(java基础知识十)

1.package关键字的概述及作用 * A:为什么要有包     * 将字节码(.class)进行分类存放  * B:包的概述     *   * C:包的作用     * 包名要定义在第一行,     * 包名.*这个包下所有的类都可见     * 具体的类比较好,能提高效率 2.包的定义及注意事项 * A:定义包的格式 * package 包名; * 多级包用.分开即可* B:定义包的注意事项 * A:package语句必须是程序的第一条可执行的代码 * B:package语句在一个jav

Scanner、String(java基础知识十二)

1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in); * String str = sc.nextLine(); * B:Scanner的构造方法原理 * Scanner(InputStream source) * System类下有一个静态的字段: * public static final InputStream in; 标准的输入流,对应着键

java基础(十六)集合(三)

这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是比较清晰的!如果你有需要可以在评论中留下您的邮箱我看到一定会免费发给你的!感谢这个平台让我们大家共同进步吧!! 记住 程序员是无私的!!! 也非常欢迎到我的博客内观看 博客地址:http://www.cnblogs.com/duscl/ /* 1:登录注册案例(理解) 2:Set集合(理解) (1)

【基础知识十六】强化学习

一.任务与奖赏 我们执行某个操作a时,仅能得到一个当前的反馈r(可以假设服从某种分布),这个过程抽象出来就是“强化学习”. 强化学习任务通常用马尔可夫决策过程MDP来描述: 强化学习任务的四要素 E = <X, A, P, R> E:机器处于的环境 X:状态空间 A:动作空间 P:状态转移概率 R:奖赏函数 学习目的: “策略”:机器要做的是不断尝试学得一个“策略” π,根据状态x就能得到要执行的动作 a = π(x) 策略的评价: 长期累积奖赏,常用的有“T步累积奖赏” 强化学习与监督学习的

Java基础知识陷阱(六)

本文发表于本人博客. 上次说了下equals跟==的问题,今天再来认识一下这个equals()跟hasCode().上次的代码如下: class Person{ public String name; public Person(String name){ this.name = name; } public String getName(){ return this.name; } @Override public boolean equals(Object anObject) { if (t

Android学习之基础知识十六 — Android开发高级技巧的掌握

一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到Context而发愁,因为我们很多地方都是在活动中进行的,而活动本身就是一个Context对象,但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离Activity类,但此时又恰恰需要使用Context,特许这个时候就会感到有些伤脑筋了. 举个例子,在前面网络编程的最佳实践中,我们编写

java基础知识(六)日期处理

一.日期处理类 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串.不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串.Date 中的相应方法已废弃 1.Date package com; import java.util.Date; /** * Created by Admini