Map集合以及Collections集合工具类

时间:2021-03-26 17:18:58

一、Collection集合主要特点与Map集合的区别

Collection:

单列集合;有两个子接口 List集合元素是有序的,可以重复的 Set集合元素是无序的,不可以重复

List:元素可重复,有序

ArrayList:底层数据结构是数组,查询快,增删慢,不同步,线程不安全,效率高;没有特殊说明一般使用ArrayList集合;

Vector:底层数据结构是数组,查询快,增删慢,同步,线程安全,效率低;有一个elements()特有迭代方法;

LinkedList:底层数据结构是链表,查询慢,增删快,不同步,线程不安全,效率高;有特有的增删方法;

Set:元素不可重复,无序

HashSet:底层数据结构是哈希表,由hashCode()和equals()方法支持它的不可重复性,且不保证迭代顺序,特别是不保证其顺序永久不变;

LinkedHashSet:继承HashSet 底层数据结构是哈希变和链表,所有是有序的,但是不可重复;

TreeSet:底层数据结构是红黑树数据结构(基于HashMap),保证元素唯一并且对其排序;

两种排序方式:1、自然排序,需要元素所在的类实现Comparable接口,重写compareTo()方法;

2、选择器排序,创建TreeSet方法时需要创建Comparator接口的子实现类作为参数,并且重写其compare()方法。

Map:

双列集合;有两个主要子实现类 HashMap和TreeMap;Map集合是一种键值对的一种映射关系 key-value 其键唯一,值可重复

二、Map<K,V>接口

1、概述:public interface Map<K,V>将键映射到值的对象;一个映射不能包含重复的键;每个键最多只能映射到一个值。

K - 此映射所维护的键的类型

V - 映射值的类型

2、Map集合主要方法:

添加功能:

  V put(K key,V value):添加元素,如果键是第一次存储的时候,返回值null,如果键已经存在,再次存储的时候将第一次的值返回,并且后面的值覆盖掉前面的值

删除功能:

void clear()从此映射中移除所有映射关系(强拆)

V remove(Object key):删除键,返回值

判断功能:

boolean containsKey(Object key):判断当前Map集合中是否存在key:键

boolean containsValue(Object value):判断当前Map姐中是否存在value:值

获取功能:

Set<Map.Entry<K,V>> entrySet()返回一个键值对对象

V get(Object key)返回指定键所映射的值

Set<K> keySet():获取所有的键的集合

Collection<V> values():获取所有的值的集合

3、集合遍历:

A:方式一:使用keySet()方法,获取所有的键,再用键去获取所对应的值

HashMap<K,V> hm = new HashMap<K,V>();

//添加元素put(key,value)

Set<K> hs = hm.keySet();

for(K key : hs){

System.out.println(key + "---" + hm.get(key));

}

B:方式二:使用entrySet()方法,获取键值对对象,通过Map.Entry<K,Y>接口的getKey()、getValue()方法遍历集合

HashMap<K,V> hm = new HashMap<K,V>();

//添加元素put(key,value)

Set<Entry<K, Y>> s = hm.entrySet();

for(Entry<K, Y> se : s){

K key = se.getKey();

Y value = se.getValue();

system.out.println(key + "---" + value);

}

4、子实现类――HashMap

1)概述:HashMap集合是哈希表组成,并且他们的键允许null,值也可以允许null,,该类不能保证被元素的顺序恒久不变。

2)因为键的唯一性,所以在键的位置上存储自定义类的时候需要重写hashCode()和equals()方法;

值可以重复,不影响。

3)HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,他两是平级关系,Hashtable类似HashMap;

HashMap集合:允许有null键和null值,线程不安全,不同步,执行效率高;

Hashtable集合:不允许有null键和null,线程安全的,同步,效率低。

3)LinkedHashMap――extends HashMap

底层是有哈希表和链表组成,可以保证键的唯一性,和有序性(存取一致);

5、子实现类――TreeMap

1)底层基于红黑树的数据结构,该映射根据其键的自然顺序进行排序,或者根据其键进行选择器排序,具体取决于使用的构造方法

2)排序方式:(排序排的都是键,排序方式同TreeSet)

自然排序:要求储存在键位置上的元素的类implements Comparable接口并且重写compareTo()方法;

选择器排序:使用TreeMap(Comparator<T> comparator)构造器,使用匿名内部类的方式创建Comparator的子实现类对象,并重写compare()方法;

三、Collections ―― 集合工具类

1、概述:对集合操作的工具类,没有构造方法,所有方法都由static修饰,可以直接调用;

2、常用方法:

public static <T> void sort(List<T> list):默认自然排序:将集合中的元素升序排序

默认的自然排序:需要元素所在的类implements Comparable接口,重写compareTo()方法,指定排序的方式;

比较器排序:public static <T> void sort(List<T> list,Comparator<T> c)

注意,如果两种排序方式都是使用了,那么最终结果遵从比较器排序。

public static <T> int binarySearch(List> list,T key):二分查找搜索法:key:查找的元素

public static void reverse(List list):反转功能(StringBuffer也有reverse功能)

public static void shuffle(List<?> list):随机置换,打乱顺序

四、集合嵌套遍历

1、ArrayList嵌套HashMap

/*需求:

假设ArrayList集合的元素是HashMap。有3个。

每一个HashMap集合的键和值都是字符串。

元素我已经完成,请遍历。

结果:

周瑜---小乔

吕布---貂蝉


郭靖---黄蓉

杨过---小龙女


令狐冲---任盈盈

林平之---岳灵珊*/

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Set;

public class ArratListTest {

public static void main(String[] args) {

ArrayList<HashMap<String,String>> al = new ArrayList<HashMap<String,String>>();

HashMap<String,String> hm1 = new HashMap<String, String>();

HashMap<String,String> hm2 = new HashMap<String, String>();

HashMap<String,String> hm3 = new HashMap<String, String>();

hm1.put("周瑜", "小乔");

hm1.put("吕布", "貂蝉");

hm2.put("郭靖", "黄蓉");

hm2.put("杨过", "小龙女");

hm3.put("令狐冲", "任盈盈");

hm3.put("林平之", "岳灵珊");

al.add(hm1);

al.add(hm2);

al.add(hm3);

for(HashMap<String,String> hm : al){

Set<String> keySet = hm.keySet();

for(String key : keySet){

System.out.println(key + "---" + hm.get(key));

}

System.out.println();

}

}

}

2、HashMap嵌套ArrayList

/*需求:

假设HashMap集合的元素是ArrayList。有3个。

每一个ArrayList集合的值是字符串。

元素我已经完成,请遍历。

结果:

三国演义

吕布

周瑜

笑傲江湖

令狐冲

林平之

神雕侠侣

郭靖

杨过 */

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Set;


public class HsahMapTest {

public static void main(String[] args) {

HashMap<String,ArrayList<String>> hm = new HashMap<String,ArrayList<String>>();

ArrayList<String> al1 = new ArrayList<String>();

al1.add("吕布");

al1.add("周瑜");

ArrayList<String> al2 = new ArrayList<String>();

al2.add("令狐冲");

al2.add("林平之");

ArrayList<String> al3 = new ArrayList<String>();

al3.add("郭靖");

al3.add("杨过");

hm.put("三国演义", al1);

hm.put("笑傲江湖", al2);

hm.put("神雕侠侣", al3);

Set<String> keySet = hm.keySet();

for(String key : keySet){

System.out.println(key);

ArrayList<String> valueList = hm.get(key);

for(String value : valueList){

System.out.println("\t" + value);

}

}

}

}

3、HashMap嵌套HashMap

/*HashMap嵌套HashMap

 基础班

 陈玉楼20

 高跃22

 就业班

 李杰21

 曹石磊23

先存储元素,然后遍历元素*/

import java.util.HashMap;

import java.util.Set;

public class HsahMapTest2 {

public static void main(String[] args) {

HashMap<String,HashMap<String,Integer>> hm = new HashMap<String,HashMap<String,Integer>>();

HashMap<String,Integer> hm1 = new HashMap<String, Integer>();

hm1.put("陈玉楼", 20);

hm1.put("高跃", 22);

HashMap<String,Integer> hm2 = new HashMap<String, Integer>();

hm2.put("李杰", 21);

hm2.put("曹石磊", 23);

hm.put("基础班", hm1);

hm.put("就业班", hm2);

Set<String> keySet = hm.keySet();

for(String key : keySet){

System.out.println(key);

HashMap<String, Integer> hashMap = hm.get(key);

Set<String> keySet2 = hashMap.keySet();

for(String key2 : keySet2){

System.out.println("\t" + key2 + "\t" + hashMap.get(key2));

}

}

}

}