数组与集合

数组与集合用于处理成员为相同类型或相同结构的一组数据,本课将讨论Java数组、List<E>接口及Map<K,V>接口类型。

数组

数组多用于数量已确定的情况,如需要10个int成员的数组,可以使用如下代码定义。

Java
public class Hello {
	public static void main(String[] args) {
		int[] arrInt = new int[10];
		for(int i=0; i<arrInt.length; i++)
			System.out.println(arrInt[i]);
	}
}

代码会显示10个0。从本例中,我们可以看到Java数组一个基本特点,如:

  • 定义数组类型时,需要成员类型和一对方括号,如int[]。
  • 数组也是类,需要使用new关键字进行初始化。
  • 确认成员数量时应在成员类型后的一对方括号中指定。
  • 数组对象中包含多少个成员可以使用length属性获取。
  • 数组的成员可以使用从0开始的索引值访问,如本例中的第一成员数据使用arrInt[0]设置或读取,最后一个成员的索引就是length-1。
  • 数组成员的默认值就是成员类型的默认值,如数值类型为0、boolean类型为false等。

当可以确定数组成员的数据时,可以在定义时直接进行赋值,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		int[] arrInt = {1,1,2,3,5,8};
		for(int i=0; i<arrInt.length; i++)
			System.out.println(arrInt[i]);
	}
}

代码显示结果如下图。

当表示多维数据时,也可以使用多维数组,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		int[][] matrix = {
				{0,1,2,3,4},
				{5,6,7,8,9},
				{10,11,12,13,14}
		};
		for(int row=0; row<matrix.length; row++) {
			for(int col=0; col<5; col++) {
				System.out.printf("%d,", matrix[row][col]);
			}
			System.out.println();
		}
	}
}

代码执行结果如下图。

使用for循环访问数组成员时,还可以使用:符号,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		int[] arrInt = {1,1,2,3,5,8};
		for(int num : arrInt)
			System.out.println(num);
	}
}

代码执行结果如下图。

List<E>接口及相关类型

List<E>泛型接口及相关类型,用于处理相同类型的数据集合,与数组不同的是,它可以更灵活地操作,比如,在指定位置插入新的成员等操作。

ArrayList<E>是List<E>接口的实现类,下面的代码演示了它们的应用。

Java
import java.util.*;
public class Hello {
	public static void main(String[] args) {
		List<String> lst = new ArrayList<String>();
		lst.add("aaa");
		lst.add("ccc");
		lst.add(1,"bbb");
		for(String item : lst) {
			System.out.println(item);
		}
	}
}

代码执行结果如下图。

本例中,我们使用了add()方法的两个重载版本,即:

  • add(E),将成员E添加到列表的最后一个成员。
  • add(index,E),将成员E添加到index(int类型)指定的索引位置。

List<E>接口继承于Collection<E>接口类型,下面是Collection<E>接口中一些常用的方法。

addAll()方法,用于添加一组数据,参数应该是实现Collection<E>接口的类型,由于List<E>接口也继承于Collection<E>接口类型,所以,将一个ArrayList<E>对象的成员添加到另一个ArrayList<E>对象也是非常方便的,如下面的代码。

Java
import java.util.*;
public class Hello {
	public static void main(String[] args) {
		List<String> lst1 = new ArrayList<String>();
		lst1.add("aaa");
		lst1.add("bbb");
		List<String> lst2 = new ArrayList<String>();
		lst2.addAll(lst1);
		lst2.add("ccc");
		lst2.add("ddd");
		for(String item : lst2) {
			System.out.println(item);
		}
	}
}

代码执行结果如下图。

删除成员时,可以使用如下方法:

  • clear()方法,清除所有成员。
  • remove(int)方法,删除指定索引位置的成员。
  • remove(E),删除指定的成员对象。

需要判断一个成员是否存在于集合中时,可以使用如下方法:

  • contains(E)方法,判断集合是否包含E成员。
  • indexOf(E)方法,返回E成员在集合中出现的第一个索引位置,没有返回-1。
  • lastIndexOf(E)方法,返回E成员在集合中最后出现的位置,没有返回-1。

判断集合中的元素数量时,可以使用如下方法:

  • size()方法,返回集合中的成员数量。
  • isEmpty()方法,如果成员数量大于0返回true,否则返回false。

获取或设置指定索引位置的成员时,可以使用如下方法。

  • get(index)方法,返回索引index位置的成员。
  • set(index,E)方法,设置索引index位置的成员为E。

最后了解一下toArray(T[])方法,它可以将集合转换为一个数组,如下面的代码。

Java
import java.util.*;
public class Hello {
	public static void main(String[] args) {
		List<String> lst = new ArrayList<String>();
		lst.add("aaa");
		lst.add("bbb");
		lst.add("ccc");
		String[] arr = new String[lst.size()];
		lst.toArray(arr);
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
}

代码执行结果如下图。

Map<K,V>接口及相关类型

Map<K,V>接口用于处理的集合中,成员的格式为“键(Key)/值(Value)”,HashMap<K,V>类实现了Map<K,V>接口,下面的代码演示了它们的基本应用。

Java
import java.util.*;
public class Hello {
	public static void main(String[] args) {
		Map<String,String> dict = new HashMap<String,String>();
		dict.put("mercury","水星");
		dict.put("venus","金星");
		dict.put("earth","地球");
		for(String k : dict.keySet()) {
			System.out.printf("%s : %s \n", k, dict.get(k));
		}
	}
}

代码执行结果如下图。

请注意,使用Map<K,V>对象的成员时,不能依赖它们的顺序,而只能通过“键(Key)”获取相应的“值(Value)”。

下面是Map<K,V>接口中一些常用的方法,首先,判断集合中成员的数量时,可以使用以下方法。

  • isEmpty()方法,判断成员数量是否为0。
  • size()方法,返回集合中的成员数量。

判断指定的键或值是否存在时,可以使用以下方法。

  • containsKey(K)方法,判断指定的键是否存在。
  • containsValue(V)方法,判断指定的值是否存在。

添加集合的成员时,使用put(K, V)方法,其中,K为键,V为值。添加和修改成员时,还可以使用如下方法。

  • putAll(Map<K,V>)方法,将一个Map<K,V>对象中的成员添加到当前对象中。
  • replace​(K key, V value)方法,将键为key的成员的值修改为value。
  • replace​(K key, V oldValue, V newValue)方法,如果键为key的成员的值为oldValue,则使用newValue替换它,并返回true;如果原有的键、值不匹配,则返回false值。

获取成员数据时可以使用以下方法。

  • keySet()方法,返回由所有“键”组成的集合,返回类型为Set<K>。
  • values()方法,返回由所有“值”组成的集合,返回类型为Collection<V>。
  • get(K key)方法,返回指定“键”的值。
  • get(K key,V defaultValue),返回指定“键”的值,如果指定的key不存在,则返回defaultValue。

删除成员时可以使用以下方法。

  • remove(K key)方法,删除键为key的成员。
  • remove(K key, V value)方法,当成员的键为key,并且值为value时删除成员,并返回true;当键、值不匹配时返回false。
  • clear()方法,删除所有成员。

下面的代码演示了一个值替换的操作。

Java
import java.util.*;
public class Hello {
	public static void main(String[] args) {
		Map<Integer,String> dict = new HashMap<Integer,String>();
		dict.put(1,"水星");
		dict.put(2,"金星");
		dict.put(3,"地球");
		dict.put(4,"火火");
		//
		System.out.println(dict.replace(4, "火星", "火星"));
		System.out.println(dict.replace(4, "火火", "火星"));
		//
		for(Integer k : dict.keySet()) {
			System.out.printf("%d : %s \n",k,dict.get(k));
		}
	}
}

代码执行结果如下图。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc001012