Java学习——集合



Collection这个接口下的4个子接口:List、Set、Queue(队列)、Map(键值对/映射表 /字典/关联数组)

List:它以特定的顺序保存一组元素,有序可重复的,查找快,删除和插入慢因为会重新排序

Set:与List一样,但是它的元素是无序且不能重复的,查找慢,删除和插入快

Queue:按照排队规则来确定对象的产生顺序,只允许在一端插入对象,并从另一端移除对象

Map:保存两个对象,键和值

实现List接口的类有:ArrayList、LinkedList(链表)、Vector、Stack(栈):LIFO后进先出

实现Set接口的类有:HashSet、TreeSet、LinkedHashSet

实现Queue接口的类有:FIFO先进先出

实现Map接口的类有:HashMap、TreeMap、LinkedHashMap

迭代器:Iterator,它是一个对象 ,它的工作:遍历并选择序列中的对象。Java中的Iterator只能单向移动。它的常用方法:

iterator()  返回一个Iterator,并且准备好返回序列的第一个元素。

next()获取  序列中的下一个元素

hasNext()  检查序列中是否还有元素

remove()  将迭代器新近返回的元素删除


Map集合:Map 存储的是键值对形式的元素,每个键最多只能映射到一个值。键唯一,值可以重复。

Map的常见实现类:

HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现不是同步的。

LinkedHashMp:Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。此实现不是同步的

WeakHashMap:以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,null 值和 null 键都被支持。

Hashtable:此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。 Hashtable 是同步的

TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 此实现不是同步的

Map的常用方法如下:


Map的常用方法示例:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapReview {
	public static void main(String[] args) {
		Map<String,String> map=new HashMap<String,String>();
		map.put("000", "qqq");
		map.put("003", "rrr");
		map.put("001", "www");
		map.put("002", "eee");
		map.put("004", "sss");
		
		System.out.println(map);
		
		// 遍历1 : 通过键值对对象entrySet获取键与值
		Set<Map.Entry<String,String>> entrySet=map.entrySet();
		for(Map.Entry<String,String> entry:entrySet) {
			String key=entry.getKey();
			String value=entry.getValue();
			System.out.println("Key="+key+" Value="+value);
		}
		System.out.println("------------------------");
		
		// 遍历2 : 通过键keySet获取值
		Set<String> keySet=map.keySet();
		for(String key:keySet) {
			String value=map.get(key);
			System.out.println("Key="+key+" Value="+value);
		}
		System.out.println("------------------------");
		
		// 获取Map值的集合
		Collection<String> values=map.values();
		System.out.println(values);
		
		// 判断是否存在键和值
		System.out.println("containsKey="+map.containsKey("001"));
		System.out.println("containsValue="+map.containsValue("ooo"));
		
		// 向Map集合添加元素时,若键存在,则返回之前与键对应的值
		String put=map.put("000", "aaa");
		System.out.println("put="+put);
		
	   //替换功能,将旧值替换成新值,并返回旧值(若有的话)
		String replace=map.replace("003", "666");
		System.out.println("replace="+replace);
		System.out.println(map);
		
		// 只有当键key存在,并且oldKey与oldValue相匹配时,旧的值才会被替换成新的值,并且返回true
		boolean success=map.replace("004", "sss", "lll");
		System.out.println("replace2="+success);
	}

}
运行结果:

HashMap的例子(失败的例子)

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

//import javax.sound.sampled.DataLine.Info;

class Info{

	public Info(int i,String s) {
		Map<Integer,String > info=new HashMap<Integer,String>();
		info.put(i, s);
	}
}

public class HashMapReview {

	public static void main(String[] args) {
		test1();
		test2();
	}
	private static void test2() {
		HashMap<Info,String> map=new HashMap<Info,String>();
		map.put(new Info(0,"aaa"), "0000");
		map.put(new Info(1,"bbb"), "1111");
		map.put(new Info(3,"ddd"), "3333");
		map.put(new Info(0,"aaa"), "4444");
		map.put(new Info(2,"ccc"), "2222");
		
		printMap(map);
		
	}
	
	private static void test1() {
		HashMap<String,String> map=new HashMap<String,String>();
		map.put("aaa", "123");
		map.put("bbb", "789");
		map.put("aaa", "456");
		map.put("ccc", "321");
		
		System.out.println(map);
		
	}
	private static void printMap(Map<Info,String> map) {
		Set<Map.Entry<Info,String>> entrySet=map.entrySet();
		for(Map.Entry<Info,String> entry:entrySet) {
			System.out.println("key="+entry.getKey()+" value="+entry.getValue());
		}
	}

}

运行结果:

{aaa=456, ccc=321, bbb=789}
key=Info@7852e922 value=0000
key=Info@5c647e05 value=4444
key=Info@33909752 value=2222
key=Info@70dea4e value=3333
key=Info@4e25154f value=1111

猜你喜欢

转载自blog.csdn.net/weixin_39430584/article/details/80016253