第十三节、轻松学Java_集合

集合的概述

集合按照其存储结构可以分为两大类: 单列集合 Collection 和双列集合 Map。
Collection两个重要的子接口List 和 Set。 List 接口的主要接口实现类有两个: ArrayList 和 LinkedList, 而 Set 接口的主要接口实现类也有两个: HashSet 和 TreeSet。
Map 接口的主要接口实现类有两个: HashMap 和 TreeMap。

package com.test;

import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
	public static void main(String[] args) {
		String a = "A";
		String b = "B";
		String c = "C";
		Collection<String> list = new ArrayList<String>();
		list.add(a); // 通过add(E obj)方法添加指定对象到集合中
		list.add(b);
		
		Collection<String> list2 = new ArrayList<String>();
		// 通过addAll(Collection<? extends E> col)方法添加指定集合中的所有对象到该集合中
		list2.addAll(list);
		list2.add(c);
		Iterator<String> it = list2.iterator(); // 通过iterator()方法序列化集合中的所有对象
		while (it.hasNext()) {
			String str = it.next(); // 因为对实例it 进行了泛化,所以不需要进行强制类型转换
			System.out.println(str);
		}

		// 通过containsAll()方法查看在该集合中是否存在指定集合中的所有对象,并获得返回信息
		boolean isContains = list.containsAll(list2);
		System.out.println(isContains);
		
		// 通过retainAll()方法仅保留该集合中同时包含在指定集合中的对象,并获得返回信息
		boolean isContains2 = list.retainAll(list2);
		System.out.println(isContains2);
		Iterator<String> it2 = list.iterator();
		while (it2.hasNext()) {
			String str = it2.next();
			System.out.println(str);
		}

		// 通过removeAll()方法从该集合中移除同时包含在指定集合中的对象,并获得返回信息
		boolean isContains1 = list2.removeAll(list);
		System.out.println(isContains1);
		Iterator<String> it1 = list2.iterator();
		while (it1.hasNext()) {
			String str = it1.next();
			System.out.println(str);
		}
	}
}

输出:
A
B
C
false
false
A
B
true
C

List集合

List集合为列表类型,以线性方式存储对象。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。用户可以通过索引来访问List中的元素
在这里插入图片描述

ArrayList集合

ArrayList支持可随需要而增长的动态数组。

package com.test;

import java.util.ArrayList;
public class Test {
	public static void main(String args[]) {
		// 创建一个ArrayList 对象
		ArrayList al = new ArrayList();
		System.out.println("a1 的初始化大小:" + al.size());
		// 向ArrayList 对象中添加新内容
		al.add(new Integer(1)); // 0 位置
		al.add(new Integer(2)); // 1 位置
		al.add(new Integer(3)); // 2 位置
		al.add(new Integer(4)); // 3 位置
		al.add(new Integer(5)); // 4 位置
		al.add(new Integer(6)); // 5 位置
		// 把A2 加在ArrayList 对象的第2 个位置
		al.add(1, new Integer(0)); // 加入之后的内容:C A2 A E B D F
		System.out.println("a1 加入元素之后的大小:" + al.size());
		// 显示Arraylist 数据
		System.out.println("a1 的内容: " + al);
		// 从ArrayList 中移除数据
		al.remove(2); // C A2 E B D
		System.out.println("a1 删除元素之后的大小: " + al.size());
		System.out.println("a1 的内容: " + al);
		
		// 得到对象数组
		Object ia[] = al.toArray();
		int sum = 0;
		// 计算数组内容
		for (int i = 0; i < ia.length; i++)
			sum += ((Integer) ia[i]).intValue();
		System.out.println("数组累加结果是:" + sum);
	}
}

输出:
a1 的初始化大小:0
a1 加入元素之后的大小:7
a1 的内容: [1, 0, 2, 3, 4, 5, 6]
a1 删除元素之后的大小: 6
a1 的内容: [1, 0, 3, 4, 5, 6]
数组累加结果是:19

LinkedList集合

除了LinkedList类继承的方法外,它本身还定义了一些有用的方法。
使用addFirst()方法可以在列表头增加元素,使用addLast()方法可以在列表的尾部增加元素。
使用getFirst()方法可以获得第一个元素,使用getLast()方法可以得到最后一个元素。
使用removeFirst()方法可以删除第一个元素,使用removeLast()方法可以删除最后一个元素。

package com.test;

import java.util.LinkedList;
public class Test {
	public static void main(String args[]) {
		// 创建LinkedList 对象
		LinkedList ll = new LinkedList();
		// 加入元素到LinkedList 中
		ll.add("F");
		ll.add("B");
		ll.add("D");
		ll.add("E");
		ll.add("C");
		// 在链表的最后一个位置加上数据
		ll.addLast("Z");
		// 在链表的第一个位置上加入数据
		ll.addFirst("A");
		// 在链表的第二个元素的位置上加入数据
		ll.add(1, "A2");
		System.out.println("ll 最初的内容:" + ll);
		// 从linkedlist 中移除元素
		ll.remove("F");
		ll.remove(2);
		System.out.println("从ll 中移除内容之后:" + ll);
		// 移除第1 个和最后一个元素
		ll.removeFirst();
		ll.removeLast();
		System.out.println("ll 移除第一个和最后一个元素之后的内容:" + ll);
		// 取得并设置值
		Object val = ll.get(2);
		ll.set(2, (String) val + " Changed");
		System.out.println("ll 被改变之后:" + ll);
	}
}

输出:
ll 最初的内容:[A, A2, F, B, D, E, C, Z]
从ll 中移除内容之后:[A, A2, D, E, C, Z]
ll 移除第一个和最后一个元素之后的内容:[A2, D, E, C]
ll 被改变之后:[A2, D, E Changed, C]

Set集合

Set集合中的对象不按特定的方式排序,但是Set集合中不能包含重复对象。Set集合继承自Collection接口,因此包含Collection接口的所有方法。

HashSet集合

需要注意的是,散列集合并不能确定元素的排列顺序,通常无法干预排序集合的创建,如果需要排序,另一种类集TreeSet将是一个更好的选择。

TreeSet集合

对象按升序存储, 访问和检索是很快的。 在存储了大量的需要进行快速检索的排序信息的情况下, TreeSet 是一个很好的选择。

package com.test;
import java.util.TreeSet;
public class Test {
	public static void main(String args[]) {
		// 创建TreeSet 对象
		TreeSet ts = new TreeSet();
		// 加入元素到TreeSet 中
		ts.add("C");
		ts.add("A");
		ts.add("B");
		ts.add("E");
		ts.add("F");
		ts.add("D");
		System.out.println(ts);
	}
}

输出:
[A, B, C, D, E, F]

Map集合

Map中不能包含相同的键,每个键只能映射一个值。

HashMap集合

散列映射并不保证它的元素的顺序,因此元素加入三列映射的顺序并不一定是它们被迭代方法读出的顺序。

TreeMap集合

TreeMap提供了按顺序存储键-值对的有效手段,同时允许快速检索,树映射保证它的元素按照键升序排序。

package com.test;
import java.util.TreeMap;
import java.util.Iterator;
import java.util.Collection;
public class Test {
	public static void main(String args[]) {
		// 创建TreeMap 对象
		TreeMap tm = new TreeMap();
		// 加入元素到TreeMap 中
		tm.put(new Integer(2000), "张三");
		tm.put(new Integer(1500), "李四");
		tm.put(new Integer(2500), "王五");
		tm.put(new Integer(5000), "赵六");
		//获得值,将值按照键排序
		Collection col = tm.values();
		Iterator i = col.iterator();
		System.out.println("按工资由低到高顺序输出:");
		while (i.hasNext()) {
			System.out.println(i.next());
		}
	}
}

输出:
按工资由低到高顺序输出:
李四
张三
王五
赵六

Properties集合

键和值都是字符串。

package com.test;
import java.util.Set;
import java.util.Iterator;
import java.util.Properties;
public class Test {
	public static void main(String args[]) {
		Properties capitals = new Properties();
		Set states;
		String str;
		capitals.put("中国", "北京");
		capitals.put("俄罗斯", "莫斯科");
		capitals.put("日本", "东京");
		capitals.put("法国", "巴黎");
		capitals.put("英国", "伦敦");
		// 返回映射中包含的项的集合
		states = capitals.keySet();
		Iterator itr = states.iterator();
		while (itr.hasNext()) {
			str = (String) itr.next();
			//getProperty返回与键相关联的值
			System.out.println("国家:" + str + " ,首都:" + capitals.getProperty(str) + ".");
		}
		// 查找列表,如果没有则显示为默认的返回值:“没有发现”
		str = capitals.getProperty("美国", "没有发现");
		System.out.println("美国的首都:" + str + ".");
	}
}

输出;
国家:法国 ,首都:巴黎.
国家:俄罗斯 ,首都:莫斯科.
国家:中国 ,首都:北京.
国家:日本 ,首都:东京.
国家:英国 ,首都:伦敦.
美国的首都:没有发现.

Properties还有一个有用之处就是利用store()和load()方法方便地对包含在Properties对象中的信息进行存储或从盘中装入信息。

package com.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
public class Test {
	public static void main(String[] args) {
		Properties settings = new Properties();
		try {
			settings.load(new FileInputStream("c:\\count.java"));
		} catch (Exception e) {
			settings.setProperty("count", new Integer(0).toString());
		}
		int c = Integer.parseInt(settings.getProperty("count")) + 1;
		System.out.println("这是本程序第" + c + "次被使用");
		settings.put("count", new Integer(c).toString());
		try {
			settings.store(new FileOutputStream("c:\\count.java"), "PropertiesFile use it .");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

Stack集合

是Vector的一个子类,它实现标准的后进先出堆栈。

package com.test;

import java.util.Stack;
import java.util.EmptyStackException;
public class Test {
	static void showpush(Stack st, int a) {
		st.push(new Integer(a));
		System.out.println("入栈(" + a + ")");
		System.out.println("Stack: " + st);
	}

	static void showpop(Stack st) {
		System.out.print("出栈 -> ");
		Integer a = (Integer) st.pop();
		System.out.println(a);
		System.out.println("Stack: " + st);
	}

	public static void main(String args[]) {
		Stack st = new Stack();
		System.out.println("Stack: " + st);
		showpush(st, 42);
		showpush(st, 66);
		showpush(st, 99);
		showpop(st);
		showpop(st);
		showpop(st);
		// 出栈的时候会有一个EmptyStackException 的异常,需要进行异常处理
		try {
			showpop(st);
		} catch (EmptyStackException e) {
			System.out.println("出现异常:栈中内容为空");
		}
	}
}

输出:
Stack: [42, 66]
入栈(99)
Stack: [42, 66, 99]
出栈 -> 99
Stack: [42, 66]
出栈 -> 66
Stack: [42]
出栈 -> 42
Stack: []
出栈 -> 出现异常:栈中内容为空

Vector集合

是实现动态数组,与ArrayList相似,但是Vector是同步的。

package com.test;

import java.util.Vector;
import java.util.Iterator;
public class Test {
	public static void main(String[] args) {
		Vector v = new Vector();
		v.add("A");
		v.add("B");
		v.add("C");
		v.add("D");
		v.add("E");
		v.add("F");
		Iterator e = v.iterator();
		while (e.hasNext()) {
			System.out.print(e.next() + "\t");
		}
	}
}

输出;
A B C D E F

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值