[Java]开发安卓,你得掌握的Java知识10——动态数组

0.前言

  • 上一篇文章,我们讲解了Java中的I/O流的概念及其使用方法

  • 今天我们主要讲述Java中动态数组的使用方法

  • 若想要了解“类”等其他主要知识,可以去看前面的文章

  • 由于最终目的是要开发安卓app,
    因此这里使用的IDE是AS(Android Studio)
    (不会使用的可以参考下面这篇文章中的例子)
    《[Java]开发安卓,你得掌握的Java知识2》

1.本文主要内容简介

  • List、ArrayList、LinkedArrayList的概念及其使用

  • 一个实际的例子(思路、代码)

2.基础知识讲解

2.1什么是动态数组

  • 在C语言阶段,我们使用的数组都是静态数组,即
    数组的大小是无法改变的
  • 在Java中,为了方便代码的编写,便将数组进行了包装,形成了List这个抽象类
  • ArrayList、LinkedArrayList等则是List这个类的子类
  • List类的特点就是:
    (1)能够自动扩容,数组长度不再是固定的
    (2)增删改插等操作全部封装成为方法,通过调用方法来完成具体的操作,而不是程序员自己去实现

2.2ArrayList

  • ArrayList其实可以理解为C语言中传统数组被封装后的版本
  • ArrayList增加元素的基本操作思路为:
    (1)先创建一个ArrayList,并在<>中规定泛型
    (2)创建一个泛型对应的类的对象A
    (3)使用add()方法将对象A放入ArrayList中
    ps:第(4)步实际是将对象A的值的地址存入了ArrayList中的空间
//首先我们定义一个Person类
class Person{
    public int age;
    public String name;

    //构造方法
    public Person( String name,int age){
        this.age = age;
        this.name = name;
    }
}
List personList = new ArrayList<>();
Person person1 = new Person("小王",20);
personList.add(person1);
  • 如果有多个对象,可以定义静态数组,将类的各项属性都提前放好,然后用for循环来逐个放入ArrayList中
public static String[] NAMES = {"小王","小红","小李","张黑","张白"};
public static int[] AGES = {19,35,20,25,33};
 for (int i = 0; i < Constant.NAMES.length; i++) {
      Person person = new Person(NAMES[i],AGES[i]);
      personList.add(person);
}

ArrayList的遍历方法

  • 初学者可能大多习惯于用for(int i = 0; i < 5; i++)这种方式来遍历ArrayList(就是将每一个元素都访问一遍)
  • 除了这种传统的for循环方法,还有几种其他的遍历方法:
    方法1.foreach(又称为增强for循环,或者快速循环)
    方法2.使用Iterator(迭代器)
  • foreach的语法:
for(Person person : personList){
    System.out.print(person.name);
}
  • 其中,Person person其实是声明了一个对象引用,它指向personList中的对象(都是Person类型的)
  • 每次循环,person都会对当前指向的personList中的对象进行操作,然后在当次循环结束后,指向下一个对象
  • Iterator遍历方法:
Iterator iterator = personList.iterator();
while(iterator.hasNext()){
      System.out.print(iterator.next());
}
  • 可以理解为每一个ArrayList都可以通过iterator()来获得自己的迭代器,而这个迭代器可以遍历并选择序列中的对象
  • 一开始Iterator会指向第一个元素的前一个位置
    第一次调用Iterator的next()方法时,
    它返回序列的第一个元素。
  • 要注意的是next()会导致指针往后走一步,
    因此while的判断条件中,不能用next(),
    得用hasNext()
Iterator的方法 具体作用
boolean hasNext() 判断是否有下一个元素
next() 获取下一个元素,如果越界会报错
  • 除了遍历的方法,ArrayList还有许多常见的方法:
ArrayList常见方法 具体作用
add(obj) 添加元素到末尾(obj为对应类的对象)
addAll(List) 将整个ArrayList内容添加到末尾
remove(int) 删除指定位置的元素(括号内为位置)
remove(Integer) 删除泛型为Integer的List的指定对象
add(i,j) 在指定位置插入元素(i为位置,j为元素)
get(i) 访问位置为i的元素
set(i,j) 修改指定位置的元素(i为位置,j为元素)
clear() 清空ArrayList
indexOf(obj) 某个对象在集合里面第一次出现的位置
lastIndexOf(obj) 某个对象在集合里面最后一次出现的位置
subList(i,j) 取List中第i位到第j-1位(不包括第j位)
equals(List) 集合的对比**
isEmpty() 判断是否为空
retainAll(List) 两个集合取交集

3.知识实际运用

Demo要求:

  • 要求定义五个人,五个人有姓名、年龄
  • 判断这些人中年龄大于30的人
  • 判断这些人中姓名带有“张”的人

第一步

首先,要求定义五个人,因此我们得有一个Person类

public class Person {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}
  • 没什么复杂的内容,name、age两个属性,一个Person类的构造方法,以及toString方法,都很简单易懂

第二步

由于这五个人是定死的,所以我们定义一个Constant类,专门放静态内容

public class Constant {
    public static String[] NAMES = {"小王","小红","小李","张黑","张白"};
    public static int[] AGES = {19,35,20,25,33};
}

第三步

  • 定义一个ArrayList来放Person
  • 为了封装性,我们专门定义一个PersonManager类来管理一切对Person类的操作
public class PersonManager {
    List personList = new ArrayList<>();

    //单例设计模式
    public static PersonManager instance = new PersonManager();
    private PersonManager(){}

    //初始化personList
    public void initPersonList(){
        for (int i = 0; i < Constant.NAMES.length; i++) {
            Person person = new Person(Constant.NAMES[i],Constant.AGES[i]);
            personList.add(person);

        }
    }

    //输出personList
    public void showPersonList(){
        for (Person person : personList) {
            System.out.println(person);
        }
    }
}

  • 其中定义了一个名为personList的ArrayList,

  • public static PersonManager instance = new >PersonManager();
    private PersonManager(){}
    这两句话实现了单例设计模式
    (以后调用时用 PersonManager.instance.方法名 即可)

  • intPersonList将Constant类中的静态数组中的内容放入了PersonManager的personList属性中
    使用的方法就是上文中提到的方法

  • showPersonList()使用的是foreach方法进行遍历

public static void main(String[] args){
        //1.初始化PersonList
        PersonManager.instance.initPersonList();

        //2.显示personList
        PersonManager.instance.showPersonList();

        //3.主要操作
        int ageCount = 0;
        int nameCount = 0; 
        for(Person person : PersonManager.instance.peronList)
        {
               if(person.age>30){
                     ageCount++;
                     System.out.println(person.name+"大于30岁");
               }
               if(person.name.contains("张")){
                     nameCount++;
                     System.out.print(person.name+"的名字中有\"张\"这个字")
               }

        }
}

  • 主函数中则先初始化personList、输出personList
  • 然后foreach循环来遍历ArrayList,同时判断每一个元素的情况

4.总结

(1)本文中主要讲解了List中的ArrayList的使用方法。作为Java中比较常用的类,需要熟练掌握才行
(2)本文中没有提到LinkedArrayList——链表,主要原因是,虽然在底层实现方面,ArrayList和链表的差别比较大,但是经过封装之后,ArrayList与LInkedArrayList的方法基本都是一样的,判断使用哪个的关键就在于:
①ArrayList适合于查询
②LinkedArrayList适合插入、删除
(3)与C语言不同的是,Java已经把数组、链表等封装成了一个类供大家直接使用。从C过渡到Java的关键就是:我们需要摆脱以前任何方法都得自己实现的想法,要学会使用系统自带的类与方法,让编程变得更加轻松简单。

你可能感兴趣的:([Java]开发安卓,你得掌握的Java知识10——动态数组)