ArrayList类是一个特殊的数组--动态数组。
普通的数组是静态的,只有先确定了他的大小才能给它初始化赋值或者参与运算,而且这个大小一但初始化后是不能被修改的,所以当你刚开始不确定你要输入数据的多少时,普通的数组不容易实现(万一你输入的数据多于数组大小时,就会数组溢出,导致报错),为此java有了" 数组列表"(ArrayList)。
(小声bb:其实我感觉ArrayList,甚至是Java的整个集合类,都有与C++里的STL类似,所以有C++一些基础的同学们学这一部分应该会很轻松)
优点:
1、支持自动改变大小
2、可以灵活的插入删除元素
缺点:
比普通的数组的速度慢一些
目录
1.如何创建一个ArrayList?(定义一个ArrayList)
2.如何对数组列表进行插入、删除等操作?(ArrayList的方法)
1.如何创建一个ArrayList?(定义一个ArrayList)
在Java中,我们可以通过创建这个简单的语句来创建字符串ArrayList:
ArrayList <String> aList = new ArrayList <String>();
在上面的语法中,aList是“String”类型,因此要添加到此列表的元素将是字符串类型。类型决定了哪种类型的元素列表。
ArrayList <String> aList = new ArrayList <Integer>();
上面的语法是接受int元素。
所以,我们可以有:
ArrayList<参数类型> 变量名字= new ArrayList<参数类型可以没有>;
另:
1、不初始化容量
ArrayList aList = new ArrayList(); //不初始化数组容量,当数组容量满时数组会以当前数组容量的2倍扩容
2、初始化容量
ArrayList aList = new ArrayList(10);//初始容量为10,相当于数组的最大容量
3、用一个集合或数组初始化
ArrayList aList = new ArrayList(a); //a为集合或数组
2.如何对数组列表进行插入、删除等操作?(ArrayList的方法)
- aList.add(int index, Object obj) 将指定的对象添加到该集合中
aList.add("apple"); //默认将“apple”插入到数组列表的末尾
aList.add(1, "pear");//将“pear”插入数组列表“1”的位置
- aList.get(int index) 获得指定索引位置上的元素
- aList.size() 获取数组列表的长度
- aList.isEmpty() 判断数组列表是否为空 空为true
补充:判断该数组列表是否为空,可以用aList.isEmpty()==true?判断,也可以用aList.size()==0? 来判断。
eg:
public static void main(String[] args)
{
ArrayList<String> aList = new ArrayList<String>();
aList.add("blue");
aList.add("black");
aList.add("red");
aList.add(1, "yellow");
aList.add((aList.size() - 1), "green");
System.out.print(aList);
}
该程序的输出为:
[blue, yellow, black, green, red]
- aList.remove(int index) 将指定的对象从该数组列表中删除
- aList.set(int index, Object obj) 将指定索引位置上的元素修改为指定对象
aList.set(1, "pear"); //将数组列表中“1”位置上的元素替换为“pear”
在上述程序后添加
System.out.println( );
aList.remove(1);
aList.set(1, "pink");
for (int i = 0; i < aList.size(); i++)
System.out.print(aList.get(i) + "\t");
输出:
[blue, yellow, black, green, red]
blue pink green red
- aList.clear( ) 清空数组列表
- 在进行查找时,可以用类似字符串的方法:用 indexOf() , lastIndexOf()
3.具体例子分析
题目说明:将1,10,5,4,11,12,9依次放入数组列表,并且按升序维护每个元素。
分析:明白了数组列表的几种方法,这个程序就很好写了。大体思路就是每次插入都让这个数字插入到比他小的数后边,比他大的数前边。
话不多说,上代码:
import javax.swing.JOptionPane;
import java.util.Scanner;
import java.util.*;
public class InsertNumberIntoCorrectPositionVersion
{
public static ArrayList<Integer> numbers = new ArrayList<Integer>();
public static void main(String [] args)
{
insertElement(1); writeElements();
insertElement(10); writeElements();
insertElement(5); writeElements();
insertElement(4); writeElements();
insertElement(11); writeElements();
insertElement(12); writeElements();
insertElement(9); writeElements();
}
public static void insertElement(Integer valueToInsert)//插入元素方法
{
if (numbers.isEmpty())//如果数组列表为空,直接插入
numbers.add(0, valueToInsert);
else if (valueToInsert < numbers.get(0))//如果该数比数组列表最小的数还小
numbers.add(0, valueToInsert);//插入到0位置
else if (numbers.get(numbers.size() - 1) < valueToInsert)//该数比最大的数还大
numbers.add(numbers.size(), valueToInsert);//插入到末尾
else
{
int index, current, next;
boolean locationFound = false;
for(index = 0; index < numbers.size() - 1 && !locationFound; index++)
{
current = numbers.get(index);
next = numbers.get(index + 1);
if (valueToInsert > current && valueToInsert < next)//找到该数该插入的位置
{
numbers.add(index + 1, valueToInsert);
locationFound = true;
}
}
}
}
public static void writeElements()//输出数组列表的方法
{
for (int index = 0; index < numbers.size(); index++)
System.out.print(numbers.get(index) + "\t");
System.out.println();
System.out.println();
}
}
4.*拓展:(多维数组列表contactsList)
- 模型:
- 定义:如下
contactsList = new ArrayList<ArrayList<Type>>();//Type为接受元素的类型,如String,Integer...
- 申请空间
public static void createArrayList()
{
int numberOfSubLists = 6; //申请的长度
contactsList = new ArrayList<ArrayList<String>>();
for (int i = 0; i < numberOfSubLists; i++)
contactsList.add(i, new ArrayList<String>());
}
//上述多维数组列表contactsList就是申请了6个ArrayList的长度,相当于二维数组的列下标开到了6;
- 方法:
与ArrayList的方法一样,唯一不同的是对多维数组列表使用方法时,要精确到每一个一维数组列表。
方法如下:
contactsList.get(0).size()//获取多维数组里的第0个ArrayList的长度
contactsList.get(1).add(0, x)//向多维数组里的第1个ArrayList里的下标0位置插入元素x
contactsList.get(2).get(3)//获取多维数组里的第2个ArrayList里的下标3的元素
......
......
- 最后让我们快乐的读一下代码吧
题目:您需要开发一个允许用户维护联系人列表的应用程序。一个联系人应该有姓氏和名字,并且至少有以下其中一个:固定 电话号码、移动电话号码、电子邮件地址、邮政地址。
分析:直接用多维数组列表来存储,然后像上一个代码一样维护每组数据
(该程序只输入一个联系人,但是程序很完整,完全可以实现输入多组数据)
import javax.swing.JOptionPane;
import java.util.Scanner;
import java.util.*;
public class Task
{
public static ArrayList<ArrayList<String>> contactsList;//定义一个多维数组
public static void main(String [] args)
{
createArrayList();//申请空间
insertDetails();//插入数据
writeContacts();//输出多维数组
}
public static void createArrayList()
{
int numberOfSubLists = 6;
contactsList = new ArrayList<ArrayList<String>>();
for (int i = 0; i < numberOfSubLists; i++)
contactsList.add(i, new ArrayList<String>());//申请6个ArrayList的大小
}
public static void insertDetails()
{
String elementsToInsert[] = new String[6];
elementsToInsert[0] = "Black";
elementsToInsert[1] = "Jim";
elementsToInsert[2] = "061-11234";
elementsToInsert[3] = "085-1234566";
elementsToInsert[4] = "jim.black@gmail.com";
elementsToInsert[5] = "123 O'Connell St Limerick";
insertEntry(elementsToInsert);
}
public static void insertEntry(String [] elementsToInsert)
{
int index;
String current, next;
boolean locationFound = false;
//如果多维数组列表第0个ArrayList为空,即整个多维数组列表为空
//将elementsToInsert数组按下标依次插入多维数组列表第0,1,...,5个ArrayList
if (contactsList.get(0).size() == 0)
for (int i = 0; i < elementsToInsert.length; i++)
contactsList.get(i).add(0, elementsToInsert[i]);
//如果该人的姓比第一个人的姓字典序还小,直接把该人的信息插入0位置
else if (elementsToInsert[0].compareToIgnoreCase(contactsList.get(0).get(0)) < 0)
for (int i = 0; i < elementsToInsert.length; i++)
contactsList.get(i).add(0, elementsToInsert[i]);
//如果该人的姓比最后一个人的姓字典序还大,直接把该人的信息插入末尾
else if (((contactsList.get(0).get(contactsList.get(0).size() - 1)).compareToIgnoreCase(elementsToInsert[0])) < 0)
for (int i = 0; i < elementsToInsert.length; i++)
contactsList.get(i).add(contactsList.get(i).size(), elementsToInsert[i]);
else //否则的话要找到一个合适的位置再进行插入(比前一个人的姓字典序大,比后一个的姓字典序小)
{
for(index = 0; index < contactsList.size() - 1 && !locationFound; index++)
{
current = contactsList.get(0).get(index);
next = contactsList.get(0).get(index + 1);
if (elementsToInsert[0].compareToIgnoreCase(current) > 0 && elementsToInsert[0].compareToIgnoreCase(next) < 0)
{
for (int i = 0; i < elementsToInsert.length; i++)
contactsList.get(i).add(index + 1, elementsToInsert[i]);
locationFound = true;
}
}
}
}
public static void writeContacts()
{
int count = 0;
for (int index = 0; index < contactsList.get(0).size(); index++)
{
System.out.println(contactsList.get(0).get(index));
System.out.println(contactsList.get(1).get(index));
System.out.println(contactsList.get(2).get(index));
System.out.println(contactsList.get(3).get(index));
System.out.println(contactsList.get(4).get(index));
System.out.println(contactsList.get(5).get(index));
}
}
}
(本人为Java的小白,刚学Java语言没多久,如果有什么错误,还请大家指教)