Map集合总结

2022-08-23 19:21:39 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

一:Map

Map用于保存具有映射关系的数据,总是以键值对的方式存储数据。

Map继承树

Map集合的key和value都可以是任何引用类型的数据。Map集合的key不允许重复,value允许重复。key和value之间存在单向一对一关系,即通过指定的键可以找到唯一,确定的value。Map集合中获取数据时,只要给出指定的key,就可以取出对应的value。

Map接口中定义的常用方法:

(1)void clear():删除该Map对象中所有的键值对。

(2)boolean containsKey(Object key):查询Map中是否包含指定key。

(3)boolean containsValue(Object value):查询Map中是否包含一个或多个value。

(4)Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。

(5)Object get(Object obj):返回指定key所对应的value。如果没有,这返回null。

(6)boolean isEmpty():查询该Map是否为空,如果为空则返回true。

(7)Set keySet():返回该Map中所有key组成的Set集合。

(8)Object put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。

(9)void putAll(Map m):将指定Map中的键值对复制到m中。

(10)Object remove(Object key):删除指定key所对应的键值对,如果不存在,则返回null。

(11)int size():返回Map里的键值对个数。

(12)Collection values():返回该Map里所有的vlaue组成的Collection。

Map中包括一个内部类Entry。该类封装了一个键值对。

Entry包含的三个方法:

(1)Object getKey():返回该Entry里包含的key值。

(2)Object getValue():返回该Entry里包含的value值。

(3)Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。

HashMap和Hashtable实现类

HashMap和Hashtable都是Map接口的典型实现类,Hashtable是一个古老的集合,JDK1.0起就出现了。

HashMap和Hashtable的典型区别:

(1)Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现。所以HashMap比Hashtable的性能高一点。

(2)Hashtable不允许使用null作为key和value。

注意:HashMap和Hashtable判断两个key相等的标准是:两个key通过equals方法比较返回true,两个key的hashCode值也要相等。 HashMap和Hashtable包含一个containsValue方法用于判断是否包含指定vlaue,HashMap和Hashtable判断值相等的标准:只要两个对象通过equals方法比较返回true即可。

LinkedHashMap类:

LinkedHashMap和LinkedHashSet一样,也是使用双向链表来维持键值对的顺序,该链表定义了迭代顺序,该迭代顺序与键值对的插入顺序保持一致。

LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代方法Map集合的全部元素时将有很好的性能,因为它以链表来维护内部顺序。

Properties类

Properties类是Hashtable的子类。该对象在处理属性文件时特别方便。Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的键值对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件中的属性名和属性值只能是字符串类型,所以Properties里的key和value都是字符串类型。Properties提供的常用方法:

(1)String getProperty(String key):获取Properties中指定属性名对应的属性值,类似于Map的get方法。

(2)String getProperty(String key, String defaultValue):该方法与上面的方法基本类似,如果Properties中不存在指定的key值,该方法返回默认值。

(3)Object setProperty(String key,String value):设置属性值,类似Hashtable的put方法。

(4)void load(InputStream inStream):从属性文件(以输入流表示)中加载属性名=属性值,把加载到的属性名=属性值对追加到Properties里。

(5)void store(OutputStream out,String comments):将Properties中的键值对写入指定属性文件(以输出流表示)。

经典实例:

代码语言:javascript复制
public class PropertiesTest {

	public static void main(String[] args) throws Exception {

		Properties props = new Properties();
		//向Properties中增加属性
		props.setProperty("userName", "smarhit");
		props.setProperty("password", "1234456");
		//将Properties中的属性保存到test.ini文件中
		props.store(new FileOutputStream("d:\test.ini"), "smarhit");
		//新键一个Properties对象
		Properties props1 = new Properties();
		//向Properties中增加属性
		props1.setProperty("gender", "MALE");
		//将test.ini文件中的属性名-属性值追加到props2中
		props1.load(new FileInputStream("d:\test.ini"));
		System.out.println(props1);//{password=1234456, gender=MALE, userName=smarhit}
	}
}

test.ini文件的内容:

#smarhit #Tue Mar 12 22:22:26 CST 2013 password=1234456 userName=smarhit

Properties还可以把键值对以XML文件的形式保存,也可以从XML文件中加载属性名-属性值。

SortedMap接口和TreeMap实现类

Map接口和set接口一样,也派生出一个SortedMap子接口,TreeMap是SortedMap接口的实现类。与TreeSet类似,TreeMap也是基于红黑树对TreeMap中所有key进行排序,从而保证TreeMap中所有键值对处于有序状态。

TreeMap同样有两种排序方式:自然排序,定制排序。

TreeMap判断两个key相等的标准和TreeSet判断两个元素相等的标准是一样的。TreeMap提供的方法也和TreeSet的类似【参考上一篇博客】。

WeakHashMap实现类

WeakHashMap与HashMap的用法基本相似,但与HashMap的区别在于,HashMap的key保留对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象;但WeakHashMap的key只保留对实际对象的弱引用,这意味着如果该HashMap对象所有key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,HashMap也可能自动删除这些key所对应的键值对对象。

经典实例:

代码语言:javascript复制
public class WeakHashMapTest {
	public static void main(String[] args) {
		// 创建WeakHashMap对象
		WeakHashMap<String, String> whm = new WeakHashMap<String, String>();
		// 向WeakHashMap中添加数据,三个key值都是匿名字段。
		whm.put(new String("语文"), new String("优秀"));
		whm.put(new String("数学"), new String("及格"));
		whm.put(new String("英语"), new String("中等"));
		whm.put(new String("日语"), new String("优秀"));
		// 向WeakHashMap加入一条强应用数据
		whm.put("德语", "不会");
		System.out.println(whm);// 打印输出:{德语=不会, 数学=及格, 英语=中等, 日语=优秀, 语文=优秀}
		// 通知系统立即进行垃圾回收。
		System.gc();
		System.runFinalization();
		System.out.println(whm);// 打印输出:{德语=不会}
	}
}

如果需要使用WeakHashMap的key来保留对象的弱引用,不要让该key所引用的对象具有任何强引用,否则将失去使用WeakHashMap的意义。

IdentityHashMap实现类

IdentityHashMap和HashMap基本相似,但它在处理两个key相等时比较独特:在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等,而HashMap,只要key1和key2通过equals比较返回true,并且他们的hashCode值相等才认为两个可以相等。

IdentityHashMap提供了与HashMap基本相似的方法,也允许使用null作为key和value。

EnumMap实现类

EnumMap是一个与枚举类一起使用的Map实现。EnumMap中所有key都必须是单个枚举类的枚举值。

EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。

EnumMap根据key的自然顺序(枚举值在枚举类中定义的顺序)来维护键值对的次序,

EnumMap不允许使用null作为key值,但允许使用null作为value。

操作集合的工具类:Collections

Collections该工具类提供了大量的方法对集合元素进行排序,查询和修改等操作。还提供了将集合对象设置为不可变,对集合对象实现同步控制等方法。

排序操作。

Collections提供了如下几个方法对List集合元素进行排序

(1)static void reverse(List list):反转指定List集合中元素的顺序。

(2)static void shuffle(List list):对List集合元素进行随机排序。

(3)static void sort(List list):根据元素的自然顺序对指定List集合的元素按升序进行排序。

(4)static void sort(List list,Comparator c):根据指定Comparator产生的顺序对List集合的元素进行排序。

(5)static void swap(List list,int i,int j):将指定List集合中i处元素和j处元素进行交换。

(6)static void rotate(List list,int distance):当distance为正数时,将list集合的后distance个元素移到前面;当distance为负数时,将list集合中的前distance个元素移到后面。该方法不会改变集合的长度。

查找,替换操作

Collections还提供了如下用于查找、替换集合元素的常用方法

(1)static int binarySearch(List list,Object key):使用二分搜索法搜索指定List集合,以获得指定对象在List集合中的索引。记得必须保证List中的元素已经处于有序状态。

(2)static Object max(Collection coll):根据元素的自然顺序,返回给定集合中最大元素。

(3)static Object max(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合的最大元素。

(4)static Object min(Collection coll):根据元素的自然顺序,返回给定集合中最小元素。

(5)static Object min(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合的最小元素。

(6)static void fill(List list,Object obj):使用指定元素obj替换指定List集合中的所有元素。

(7)static int frequency(Collection c,Object o):返回指定集合中等于指定对象的元素数量。

(8)static int indexOfSubList(List source,List targer):返回子List对象在母List对象中第一次出现的位置索引;如果母List中没有出现子List,返回-1。

(9)static int lastIndexOfSubList(List source,List targer):返回子List对象在母List对象中最后一次出现的位置索引;如果母List中没有出现子List,返回-1。

(10)static boolean replaceAll(List list,Object oldVal,Object newVal):使用一个新值newVal替换List对象所有的旧值oldVal。

同步控制

Collections类提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而可以解决多线程并发访问集合时的线程安全问题。

经典实例:

代码语言:javascript复制
public static void main(String[] args) {
		//下面创建四个同步的集合对象
		Collection<String> c=Collections.synchronizedCollection(new ArrayList<String>());
		List<String> list=Collections.synchronizedList(new ArrayList<String>());
		Set<String> set=Collections.synchronizedSet(new HashSet<String>());
		Map<String, String> map=Collections.synchronizedMap(new HashMap<String, String>());
	}

设置不可变集合

Collections提供了入下三类方法来返回一个不可以变的集合:

(1)emptyXxx():返回一个空的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。

(2)singletonXxx():返回一个值包含指定对象(只有一个或一项元素)的,不可以变的集合对象,此处的集合既可以是List,也可以是Set,还可以是Map。

(3)unmodifiableXxx():返回指定集合对象的不可变视图。此处的集合既可以是List,也可以是Set,还可以是Map。

经典实例:

代码语言:javascript复制
public class CollectionsTest {

	public static void main(String[] args) {
		//创建一个空的,不可改变的List对象
		List<String> unmodifiableList=Collections.emptyList();
		//创建一个只有一个元素,且不可改变的Set对象
		Set<String> unmodifiableSet=Collections.singleton("Android");
		//创建一个普通的map对象
		Map<String, Integer> map=new HashMap<String, Integer>();
		map.put("语文", 90);
		map.put("Java", 80);
		map.put("Android", 95);
		//返回普通map对象对应的不可变版本。
		Map<String, Integer> unmodifiableMap=Collections.unmodifiableMap(map);
		//下面三句话都会引发java.lang.UnsupportedOperationException异常
		unmodifiableList.add("smarhit");
		unmodifiableSet.add("java");
		unmodifiableMap.put("math", 100);
	}
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139346.html原文链接:https://javaforall.cn

0 人点赞