1、Java ArrayList
ArrayList
类是可调整大小的数组,可以在java.util
包中找到。
Java中的数组与Java中的ArrayList
之间的区别在于,数组的大小无法修改(如果要向数组中添加元素或从中删除元素,则必须创建一个新的)。虽然可以随时根据需要从ArrayList
中添加和删除元素。语法也略有不同:
例如:
创建一个名为langs的ArrayList
对象,该对象将存储字符串:
import java.util.ArrayList; // import the ArrayList class
ArrayList<String> langs = new ArrayList<String>(); // 创建 ArrayList对象
2、向ArrayList添加元素
ArrayList
类具有许多有用的方法。 例如,要将元素添加到ArrayList
,需要使用add()
方法:
例如:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList langs = new ArrayList();
langs.add("c");
langs.add("java");
langs.add("python");
langs.add("cjavapy");
System.out.println(langs);
}
}
3、访问ArrayList中元素
要访问ArrayList
中的元素,请使用get()
方法并引用索引号:
例如:
langs.get(0);
注意:数组索引以0开头:[0]是第一个元素。 [1]是第二个元素,依此类推。
4、修改ArrayList中元素
要修改元素,需要使用set()
方法并引用索引号:
例如:
langs.set(0, "C#");
5、删除ArrayList中元素
要删除元素,需要使用remove()方法并引用索引号:
例如:
langs.remove(0);
要删除ArrayList
中的所有元素,请使用clear()
方法:
例如:
langs.clear();
6、ArrayList size
要找出ArrayList有多少个元素,需要使用size方法:
例如:
langs.size();
7、循环遍历 ArrayList
使用for
循环遍历ArrayList
的元素,并使用size()
方法指定循环应运行的次数:
例如:
public class Main {
public static void main(String[] args) {
ArrayList<String> langs = new ArrayList<String>();
langs.add("c");
langs.add("java");
langs.add("python");
langs.add("cjavapy");
for (int i = 0; i < langs.size(); i++) {
System.out.println(langs.get(i));
}
}
}
还可以通过for-each循环遍历ArrayList
:
例如:
public class Main {
public static void main(String[] args) {
ArrayList<String> langs = new ArrayList<String>();
langs.add("c");
langs.add("java");
langs.add("python");
langs.add("cjavapy");
for (String i : langs) {
System.out.println(i);
}
}
}
8、其它类型
ArrayList中的元素实际上是对象。在上面的示例中,我们创建了元素 (对象)类型为字符串。Java中的String是一个对象(不是原始类型)。要使用其他类型,例如,int,必须指定等效的包装器类:Integer。对于其他基本类型,需要使用:Boolean表示布尔值,Character表示char,Double表示double,等等:
例如:
创建一个ArrayList
来存储数字(添加类型为Integer
的元素):
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> myNumbers = new ArrayList<Integer>();
myNumbers.add(10);
myNumbers.add(15);
myNumbers.add(20);
myNumbers.add(25);
for (int i : myNumbers) {
System.out.println(i);
}
}
}
9、ArrayList的排序
java.util
包中另一个有用的类是Collections
类,该类包括用于对列表进行字母或数字排序的sort()
方法:
例如:
对字符串的ArrayList进行排序:
import java.util.ArrayList;
import java.util.Collections; // Import the Collections class
public class Main {
public static void main(String[] args) {
ArrayList<String> langs = new ArrayList<String>();
langs.add("c");
langs.add("java");
langs.add("python");
langs.add("cjavapy");
Collections.sort(langs); // Sort cars
for (String i : langs) {
System.out.println(i);
}
}
}
例如:
对整数数组列表进行排序:
import java.util.ArrayList;
import java.util.Collections; // Import the Collections class
public class Main {
public static void main(String[] args) {
ArrayList<Integer> myNumbers = new ArrayList<Integer>();
myNumbers.add(33);
myNumbers.add(15);
myNumbers.add(20);
myNumbers.add(34);
myNumbers.add(8);
myNumbers.add(12);
Collections.sort(myNumbers); // Sort myNumbers
for (int i : myNumbers) {
System.out.println(i);
}
}
}
10、 ArrayList重要的方法、属性和实例
1)构造器
ArrayList提供了三个构造器:
public ArrayList();
默认的构造器,将会以默认(16)的大小来初始化内部的数组
public ArrayList(ICollection);
用一个ICollection对象来构造,并将该集合的元素添加到ArrayList
public ArrayList(int);
用指定的大小来初始化内部的数组
2)IsSynchronized属性和ArrayList.Synchronized方法
IsSynchronized
属性指示当前的ArrayList
实例是否支持线程同步,而ArrayList.Synchronized
静态方法则会返回一个ArrayList
的线程同步的封装。
如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如:
ArrayList list = new ArrayList();
//...
lock(list.SyncRoot) //当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性
{
list.Add("Add a Item");
}
如果使用ArrayList.Synchronized
方法返回的实例,那么就不用考虑线程同步的问题,这个实例本身就是线程安全的,实际上ArrayList
内部实现了一个保证线程同步的内部类,ArrayList.Synchronized
返回的就是这个类的实例,它里面的每个属性都是用了lock
关键字来保证线程同步。
3)Count属性和Capacity属性
Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。
Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。
4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange
Add
:方法用于添加一个元素到当前列表的末尾
AddRange
:方法用于添加一批元素到当前列表的末尾
Remove
:方法用于删除一个元素,通过元素本身的引用来删除
RemoveAt
:方法用于删除一个元素,通过索引值来删除
RemoveRange
:用于删除一批元素,通过指定开始的索引和删除的数量来删除
Insert
:用于添加一个元素到指定位置,列表后面的元素依次往后移动
InsertRange
:用于从指定位置开始添加一批元素,列表后面的元素依次往后移动
Clear
:方法用于清除现有所有的元素
Contains
:方法用来查找某个对象在不在列表之中
5)TrimSize方法
这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。
6)ToArray方法
这个方法把ArrayList的元素Copy到一个新的数组中。
ArrayList实例:
import java.util.*;
public class ArrayListTest {
public static void main(String[] args) {
// 创建ArrayList
ArrayList list = new ArrayList();
// 将“”
list.add("1");
list.add("2");
list.add("3");
list.add("4");
// 将下面的元素添加到第1个位置
list.add(0, "5");
// 获取第1个元素
System.out.println("the first element is: "+ list.get(0));
// 删除“3”
list.remove("3");
// 获取ArrayList的大小
System.out.println("Arraylist size=: "+ list.size());
// 判断list中是否包含"3"
System.out.println("ArrayList contains 3 is: "+ list.contains(3));
// 设置第2个元素为10
list.set(1, "10");
// 通过Iterator遍历ArrayList
for(Iterator iter = list.iterator(); iter.hasNext(); ) {
System.out.println("next is: "+ iter.next());
}
// 将ArrayList转换为数组
String[] arr = (String[])list.toArray(new String[0]);
for (String str:arr)
System.out.println("str: "+ str);
// 清空ArrayList
list.clear();
// 判断ArrayList是否为空
System.out.println("ArrayList is empty: "+ list.isEmpty());
}
}