黑马学习笔记--集合初识

来源:互联网 发布:索多玛120天 知乎 编辑:程序博客网 时间:2024/06/05 22:35

对象数组

对象数组概述

  • A:基本类型的数组:存储的元素为基本类型
    int[] arr={1,2,3,4}
  • B:对象数组:存储的元素为引用类型
    Student[] stus=new Student[3];

案例

package com.itheima;/* * 创建一个学生数组,存储三个学生对象并遍历 * * 分析: *      A:定义学生类 *      B:创建学生数组 *      C:创建学生对象 *      D:把学生对象作为元素赋值给学生数组 *      E:遍历学生数组 */public class StudentDemo {    public static void main(String[] args) {        //创建学生数组        Student[] students = new Student[3];        //创建学生对象        Student s1 = new Student("曹操",40);        Student s2 = new Student("刘备",35);        Student s3 = new Student("孙权",30);        //把学生对象作为元素赋值给学生数组        students[0] = s1;        students[1] = s2;        students[2] = s3;        //遍历学生数组        for(int x=0; x<students.length; x++) {            Student s = students[x];            //System.out.println(s);            System.out.println(s.getName()+"---"+s.getAge());        }    }}

对象数组的内存图: 内存图

集合类

集合只能存引用数据类型,存储基本数据类型用的是自动拆箱

ArrayList

  • 为了方便对多个对象进行操作,我们就必须对这多个对象进行存储,而要想对多个对象进行存储, 就不能是一个基本的变量,而应该是一个容器类型的变量。

ArrayList添加新元素

package com.itheima_01;import java.util.ArrayList;/* * 为什么会出现集合类: *      我们学习的是面向对象编程语言,而面向对象编程语言对事物的描述都是通过对象来体现的。 *      为了方便对多个对象进行操作,我们就必须对这多个对象进行存储,而要想对多个对象进行存储, *      就不能是一个基本的变量,而应该是一个容器类型的变量。 *      到目前为止,我们学习过了哪些容器类型的数据呢?StringBuilder,数组。 *      StringBuilder的结果只能是一个字符串类型,不一定满足我们的需求。 *      所以,我们目前只能选择数组了,也就是我们前面学习过的对象数组。 *      但是,数组的长度是固定的,适应不了变化的需求,那么,我们该如何选择呢? *      这个时候,java就提供了集合类供我们使用。 * * 集合类的特点: *      长度可变。 * * ArrayList<E>: *      大小可变数组的实现 * *      <E>:是一种特殊的数据类型,泛型。 *      怎么用呢? *          在出现E的地方我们使用引用数据类型替换即可 *          举例:ArrayList<String>,ArrayList<Student> * * 构造方法: *      ArrayList() * * 添加元素: *      public boolean add(E e):添加元素 *      public void add(int index,E element):在指定的索引处添加一个元素 */public class ArrayListDemo {    public static void main(String[] args) {        //创建集合对象        ArrayList<String> array = new  ArrayList<String>();        //add(E e):添加元素        array.add("hello");        array.add("world");        array.add("java");        //add(int index,E element):在指定的索引处添加一个元素        //array.add(1, "android");        System.out.println("array:"+array);    }}

ArrayList删改查方法

  • A:获取元素: public E get(int index):返回指定索引处的元素
  • B:集合长度: public int size():返回集合中的元素的个数
  • C:删除元素:
    public boolean remove(Object o):删除指定的元素,返回删除是否成功.
    public E remove(int index):删除指定索引处的元素,返回被删除的元素.
  • D:修改元素: public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
package com.itheima_01;import java.util.ArrayList;/* * 获取元素 *      public E get(int index):返回指定索引处的元素 * 集合长度 *      public int size():返回集合中的元素的个数 * 删除元素 *      public boolean remove(Object o):删除指定的元素,返回删除是否成功 *      public E remove(int index):删除指定索引处的元素,返回被删除的元素 * 修改元素n *      public E set(int index,E element):修改指定索引处的元素,返回被修改的元素 */public class ArrayListDemo2 {    public static void main(String[] args) {        //创建集合对象        ArrayList<String> array = new ArrayList<String>();        //添加元素        array.add("hello");        array.add("world");        array.add("java");        //public E get(int index):返回指定索引处的元素        //System.out.println("get:"+array.get(0));        //System.out.println("get:"+array.get(1));        //System.out.println("get:"+array.get(2));        //public int size():返回集合中的元素的个数        //System.out.println("size:"+array.size());        //public boolean remove(Object o):删除指定的元素,返回删除是否成功        //System.out.println("remove:"+array.remove("world"));//true        //System.out.println("remove:"+array.remove("world"));//false        //public E remove(int index):删除指定索引处的元素,返回被删除的元素        //System.out.println("remove:"+array.remove(0));        //public E set(int index,E element):修改指定索引处的元素,返回被修改的元素        System.out.println("set:"+array.set(1, "android"));        //输出        System.out.println("array:"+array);    }}

ArrayList遍历

集合的遍历思想和数组的遍历思想相同,循环遍历容器,依次取出里面的元素即可.

public class ArrayListTest {    public static void main(String[] args) {        //创建集合对象        ArrayList<String> array = new ArrayList<String>();        //添加字符串元素        array.add("向问天");        array.add("刘正风");        array.add("左冷禅");        array.add("风清扬");        //遍历集合        for(int x=0; x<array.size(); x++) {            String s = array.get(x);            System.out.println(s);        }    }}

迭代器

hasNext()方法:用来判断集合中是否有下一个元素可以迭代。如果返回true,说明可以迭代。

next()方法:用来返回迭代的下一个元素,并把指针向后移动一位。

import java.util.ArrayList;import java.util.Iterator;/* * 在java当中不止ArrayList一个集合,java提供了众多的集合. * * 不同的容器完成不同方式的数据存储. * 不同集合的特点不同,ArrayList有序且可重复且带索引的集合.但是有的集合不带索引.所以如果使用其他集合,可能无法通过get+索引的方式获取元素 * * 所有集合的通用获取元素方法并不是通过索引获取,而是通过迭代器获取. * 迭代器:iterator */public class Demo02iterator {    public static void main(String[] args) {        //创建集合对象        ArrayList<Integer> list = new ArrayList<Integer>();        //向集合中添加元素        list.add(10);        list.add(100);        list.add(2000);        //获取该集合的迭代器        Iterator<Integer> iterator = list.iterator();        //使用迭代器的方法,迭代集合(遍历集合)        while(iterator.hasNext()) {            //获取集合中元素            Integer thisNumber = iterator.next();            System.out.println(thisNumber);        }    }}

原理

import java.util.ArrayList;import java.util.Iterator;/* * 集合用来持有数据,所有常用集合都具备了可迭代功能iterator方法,该方法用于迭代集合,该方法才是最为通用的集合迭代方法。 * * 迭代器:集合迭代(集合遍历)的工具 * * 集合的获取迭代器方法 * public Iterator<E> iterator()  获取某个集合的迭代器实例对象 * * Iterator:迭代器接口 *      boolean hasNext()  判断集合中是否有下一个元素   不移动元素指针 *      E next()  获取集合中下一个元素    移动指针,指向下一个元素 */public class Demo03iterator {    public static void main(String[] args) {        //创建集合对象        ArrayList<Integer> list = new ArrayList<Integer>();        //向集合中添加元素        list.add(10);        list.add(100);        list.add(2000);        //调用集合的iterator方法,返回迭代器对象        Iterator<Integer> itr = list.iterator();        //混合使用hasNext与next方法,循环获取元素        while(itr.hasNext()) {            //如果有元素,就获取元素            Integer thisNumber = itr.next();            System.out.println(thisNumber);        }    }}

并发修改异常

java.util.ConcurrentModificationException:在前一个迭代器迭代自定义数据类型的基础上,添加新的需求
- 在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
解决并发修改异常,重新获取迭代器

public class Demo05ConcurrentModificationException {    public static void main(String[] args) {        //创建集合对象        ArrayList<Person> list = new ArrayList<Person>();        //向集合中添加元素        Person p = new Person("Jack",18);        Person p2 = new Person("Rose",16);        Person p3 = new Person("Trump",62);        Person p4 = new Person("Obama",56);        Person p5 = new Person("Castro",90);        list.add(p);        list.add(p2);        list.add(p3);        list.add(p4);        //调用集合的iterator方法,返回迭代器对象        Iterator<Person> itr = list.iterator();        //混合使用hasNext与next方法,循环获取元素        while(itr.hasNext()) {            //如果有元素,就获取元素            Person thisP = itr.next();            //判断年龄是否为16岁            if(thisP.getAge() == 16) {                //如果存在16岁的人,就加入90岁的卡斯特罗                list.add(p5);            }        }    }}

增强for循环

for(元素的数据类型  变量 : Collection集合or数组){}
0 0