[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<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的关键就是:我们需要摆脱以前任何方法都得自己实现的想法,要学会使用系统自带的类与方法,让编程变得更加轻松简单。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容