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

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

作者: 入梦瞌睡 | 来源:发表于2019-08-16 23:17 被阅读0次

    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<Person> 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<Person> 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——动态数组

          本文链接:https://www.haomeiwen.com/subject/gmoqsctx.html