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()); } }