Map集合以及Collectuions工具类的使用
前言
继之前我们对Collection接口的了解,我们今天继续学习另外一个集合接口Mao接口,Map接口主要是为了存储键值对,我们的日常使用中,免不了和Map打交道,那就让我们一起来了解下吧一、Map集合
1.结构和特点
|----------Map:双列数据,存储键值对数据
|------------HashMap:主要实现类,线程不安全,效率高,存储key和value
|------------LinkedHashMap:保证遍历Map元素时,能够按照添加顺序遍历( 原因:在HashMap的结构基础上,添加了一对指针,指向前一个和后一个元素),对频繁的遍历操作效率要高于HashMap
|------------TreeMap:按照添加的顺序进行排序,实现排序遍历
|------------Hashtable:古老的实现类,线程安全,效率低,不能存储key和value
|------------Properties:用来处理配置文件,key和value都是String类型
Map的结构理解:
Map中的key:无序的,不可重复的,使用Set存储 ----->key所在的类需要重写equals()和hashCode()
Map中的value:无序的,可重复的,使用Collection存储 ------->value所在的类要重写equals()
Map中的Entry是无序的,不可重复的,用Set存储
2.HashMap的底层实现原理
HashMap的底层实现原理:
以存储key1-value1为例,首先通过计算key1的哈希值来确定key1在Entry数组上的位置,如果key1的哈希值和原有的key的哈希值不相同时,添加成功
如果key1的哈希值与已存在的某一个key的哈希值相同时,调用key1所在类的equals(),如果返回flase,添加成功,返回true时,value1将替换原有的value;
当key1和原有的key的哈希值相同时,此时key1-value1和原来的数据通过链表的方式来存储
默认的扩容方式:扩容为原来的2倍,并将原来的数据复制过来
3. jdk8的底层与jdk7的底层的不同点
创建HashMap对象的时候,并没有创建一个长度为16的数组
jdk8底层的数组是node[],不是Entry[]
jdk8首次调用put方法时,会创建一个长度为16的数组
jdk7的的底层是数组加链表,jdk8的底层是数组+链表+红黑树,当数字的一个索引位置上的元素以链表的形式存储的个数>8且当前数组的长度>64时,此索引上的所有的数据改用红黑树来进行存储
4.常用方法(以HashMap为例)
- Object put(Object key,Object value):将指定的key-value添加到Map中
- void putAll(Map m):将m中所有的key-value添加到Map中
- Object remove(Object key):删除指定的key-value
- void clear():清空当前Map中的所有数据
- Object get(Object key):获取指定key相应的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsKey(Object key):是否包含指定的value
- int size():返回map中的键值对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
- Set keySet():返回所有的key组成的集合
- COllection values():返回所有的values组成的集合
- Set EntrySet():返回所有键值对组成的Set集合
代码如下(示例):
@Test
public void test1(){
Map map = new HashMap();
Map map1 = new HashMap();
map.put("a","Aa");
map.put(123,"abc");
map.put("b","Bb");
System.out.println(map);
System.out.println("**************");
map1.put(1,"a");
map1.put(2,"b");
map1.put(3,"c");
System.out.println(map1);
System.out.println("**************");
map.putAll(map1);
map1.remove(2);
System.out.println(map);
System.out.println(map1);
System.out.println("**************");
System.out.println(map.get(123));
System.out.println(map1.containsKey(3));
System.out.println(map.size());
System.out.println(map.isEmpty());
System.out.println("**************");
System.out.println(map.keySet());
System.out.println(map1.values());
System.out.println(map.entrySet());
}
代码结果如下:
二、Collections工具类
Collections是一个操作Set、List、Map的工具类
1.常用方法
- reverse(List):反转List中元素的顺序
- shuffle(List):对List集合元素进行随机排序
- sort(List):根据元素的自然排序对指定的List集合元素按升序排序
- swap(List,int i,int j):将指定的List集合中的i处元素和j处元素进行交换
- Object max(Collection):根据元素的自然顺序,返回最大的元素
- Object max(Collection,Comparator):根据指定的顺序,返回最大的元素
- Object min(Collection):根据元素的自然顺序,返回最小的元素
- Object max(Collection,Comparator):根据指定的顺序,返回最小的元素
- int frequency(Collection,Object):指定集合中指定元素出现的频率
- void copy(List dest,List src):将src中的内容复制到dest中
- boolean replaceAll(List list,Object oldObj,Object newObj):将list集合中的
2.代码示例
代码如下(示例):
@Test
public void test1(){
List list = new ArrayList();
list.add(124);
list.add(3421);
list.add(2131);
list.add(-1312);
list.add(12);
list.add(0);
list.add(1234);
System.out.println(list);
System.out.println("**************");
Collections.reverse(list);
System.out.println(list);
System.out.println("**************");
Collections.shuffle(list);
System.out.println(list);
System.out.println("**************");
Collections.sort(list);
System.out.println(list);
System.out.println("**************");
Collections.swap(list,1,2);
System.out.println(list);
System.out.println("**************");
}
代码结果如下:
代码如下(示例):
@Test
public void test2(){
List list = new ArrayList();
list.add(1234);
list.add(3421);
list.add(2131);
list.add(-1312);
list.add(1234);
list.add(0);
list.add(1234);
int frequency = Collections.frequency(list,1234);
System.out.println(list);
System.out.println(frequency);
System.out.println("*********************");
List dest = Arrays.asList(new Object[list.size()]);
Collections.copy(dest,list);
System.out.println(dest);
System.out.println("*********************");
Collections.replaceAll(list,1234,1111);
System.out.println(list);
}
代码结果如下:
Collections工具类还有一些以synchronized开头的方法,来是的线程和集合之间的联系更见紧密
//返回的list1即为线程安全的list
List list1 = Collections.synchronizedList(list);
总结
以上便是对Map接口和Collections工具类的记录和理解了,希望能够帮到大家。