黑马程序员——java基础——集合框架(二: 双列集合 (Map体系))

时间:2023-02-18 15:30:19

前面学习了集合集合框架中的单例集合,现在开始学习集合框架中双列集合。

双列集合的特点:

a, 与单列集合不一样,单列集合一次添加一个元素,而双列集合一次可以添加一对元素。

b, 双列结合中存储的是键值对。

c, 双列集合必须保证键的唯一性。


双列集合的顶层就是Map接口

Map接口中的常用方法

(1)添加(K,V是Map接口上的加入泛型是定义的类型参数变量)

 V put(K key, V value) 
          将一对键值对添加到集合中,如果key在之前的集合中就存在,value会替换掉之前的值,并返回之前的值,要是之前key不存在,就直接添加进去,返回null

void putAll(Map<? extends K,? extends V> m) 
          将值定的Map集合添加到该集合中去

(2)删除

 V remove(Object key) 
          通过指定的键去删除集合汇总对应的键值对,要是集合中存在对应的键值对,删除成功返回被删除的键值对的value值,如果集合中不存在对应的键值对返回null

void clear() 
          清除集合中所有的键值对

(3)判断

 boolean containsKey(Object key) 
          如果集合中包含指定的键值返回true,否则false 
 boolean containsValue(Object value) 
          如果集合中包含指定的值返回true,否则false 

boolean isEmpty() 
          判断此集合中是否存在键值对元素 存在返回true 否则false

(4)获取

 int size() 
          返回此集合中的键值对的个数 
 Collection<V> values() 
         将此集合中的所有的值封装到一个Collection集合中返回(因为键值对中的值可以不唯一所以返回的是Collection集合)

 Set<K> keySet() 
          将此集合中所有的键值封装到一个Set集合中返回 (因为键值对中的键是唯一的所以返回的是Set集合)

Set<Map.Entry<K,V>> entrySet() 
          Map.Entry<K,V> 是用来描述集合中所有键值对的映射关系的接口,该接口是定义在Map接口内部的一个静态内部接口。只要我们能够通过Map集合的entrySet()方法获取到描述该集合所有键值对映射关系的set集合的话,可以通过该接口中的定义的方法getValue() getKey()来获取所有的键值对。entrySet() 返回的实际上是一个在Map集合内部实现了Map.Entry<K,V>接口的实现类对象(内部类的对象)。



Map接口下的常用子类

A:Hastable:

内部的数据结构是哈希表,该集合是Java1.0就出现了,到了Java1.2被纳入到了集合框架中,并实现Map接口了。集合中有一个自己特有的方法elements()该方法返回的是此集合中所有的值的枚举。这个Hashtable集合是同步的,所以增删效率低,同时这个集合不允许null作为键值,null作为值。

演示Hashtable的elements方法

//创建hashtable集合
Hashtable<Integer, String> table=new Hashtable<Integer,String>();

//往集合中添加元素
table.put(2, "zhangsan");
table.put(6, "lisi");
table.put(7, "wangcai");
table.put(8, "xiaoqinag");

//获取值的枚举 通过枚举获取值
for(Enumeration<String> en=table.elements();en.hasMoreElements();)
{
String str=en.nextElement();
System.out.println(str);

}

输出结果:

xiaoqinag
wangcai
lisi
zhangsan


B:Properties

是Hashtable 的子类,同步的,在Java1.0就出现了。 它表示一个持久的属性集(通过System.getProperties()获取到的系统系统属性集就是该类的一个实例),该类没有加入泛型机制,因为该类中的键值对类型都是固定的String类型,所以该集合通常和IO技术相结合去操作一些简单的配置文件(一些复杂的的配置文件一般是xml文件,简单的配置文件,就以键值对的形式存取配置信息)。

注意:Properties类本身虽然没有加入泛型机制,但是并不排除该类的方法中可以加入了泛型 ,比如:Enumeration<?> propertyNames()   Set<String> stringPropertyNames() 。

演示用Properties+IO 

//创建一个Properties集合
Properties p=new Properties();

//创建一个字符读取流 从配置文件中读取数据

FileReader in=new FileReader("C:\\Users\\Enhon\\Desktop\\配置文件.properties");
//将读取流从文件中的数据存放到集合中
p.load(in);

//获取配置文件中的信息
p.store(new OutputStreamWriter(System.out),"aa");

输出结果:

#aa
#Sat Jun 13 09:02:25 CST 2015
1201640122=王五
1201640121=李四
1201640120=张山


C:HashMap

内部的数据结果是哈希表,是不同步的,允许null键null值,并且此类不保证映射的顺序,特别是它不保证该顺序恒久不变。为了保证键的唯一性使用该集合的存储键值对的时候,键对应元素对象要是覆盖Object的hashcode()和equals()方法 。

用代码演示用ketSet() 遍历HashMap结合


//创建hashMap集合
HashMap<Integer, String> map=new HashMap<Integer,String>();

//往集合中添加元素
map.put(2, "zhangsan");
map.put(6, "lisi");
map.put(7, "wangcai");
map.put(8, "xiaoqinag");

//获取集合的键值的set集合
Set<Integer> set=map.keySet();

//通过set集合获取map集合中的元素

for(Iterator<Integer> it=set.iterator();it.hasNext();)
{
Integer temp=it.next();
System.out.println(temp+"="+map.get(temp));

}

输出结果:

2=zhangsan
6=lisi
7=wangcai
8=xiaoqinag

上面遍历集合的过程用图片展示出来

黑马程序员——java基础——集合框架(二: 双列集合 (Map体系))

D:LinkedHashMap

LinkedHashMap是HashMap的子类 不同步,该类内部的数据接口是哈希表和链表,具有可预知的迭代顺序和LinkedHashset差不多取出的顺序和存入的顺序一样。

E:TreeMap

TreeMap内部的数据结果是二叉树,是不同步的,为了保证键的唯一性使用该集合的存储键值对的时候,键对应元素对象要具有比较性或者在创建该类的对象的时候指定比较器。

代码演示用entrySet()遍历TreeMap集合

//创建TreeMap集合
TreeMap<Integer, String> map=new TreeMap<Integer,String>();

//往集合中添加元素
map.put(2, "zhangsan");
map.put(6, "lisi");
map.put(7, "wangcai");
map.put(8, "xiaoqinag");

//获取集合的Map.Entry的set集合
Set<Map.Entry<Integer, String>> set=map.entrySet();

//通过set集合获取map集合中的元素

for(Iterator<Map.Entry<Integer, String>> it=set.iterator();it.hasNext();)
{
Map.Entry<Integer, String> temp=it.next();
System.out.println(temp.getKey()+"="+temp.getValue());
}

输出结果:

2=zhangsan
6=lisi
7=wangcai
8=xiaoqinag

从输出结果中给看到键值对明显按照 Integer的自然排序方法进行了排序

上面遍历集合的过程用图片展示出来

黑马程序员——java基础——集合框架(二: 双列集合 (Map体系))