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