java集合Map
1.Map集合
!!!map中没有迭代器
(1)Map集合,也常被称作字典,因为它主要用于保存具有映射关系的数据,有key有value。
所以Map中保存两组值,分别是key和value,都可以保存任何引用类型的数据。
(2)Map和Set的关系
(3)Map和List的关系
static <K, V> Map.Entry<K,V> entry(K k, V v)
Returns an unmodifiable Map.Entry containing the given key and value.
Set<Map.Entry<K,V>> entrySet()
Returns a Set view of the mappings contained in this map
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
//存储键值对类型数据 键是唯一 通过equals判断 但值是可重复的
Map map = new HashMap();
//添加元素
map.put("xingming","zhang");
map.put("ingming","hai");
map.put("xg","xia");
System.out.println(map);
map.remove("xg");
System.out.println(map);
map.replace("xingming","zhangsan");
System.out.println(map);
//遍历Map
//Keyset方法 把当前map集合中键转换成set集合
//只能用Set集合接收
Set s1 = map.keySet();
for (Object object : s1){
System.out.println("foreach:"+object);
}
Iterator iterator = s1.iterator();
while (iterator.hasNext()){
Object o1 = iterator.next();
System.out.println("迭代器:"+o1 + "="+map.get(o1));
}
//泛型可以避免很多类型转换
//map本身没有迭代器
//Map.Entry是一个接口
//遍历2 entryset 返回此地图中包含的映射的Set视图
Set<Map.Entry<Object,Object>> s2 = map.entrySet();
//迭代器
Iterator<Map.Entry<Object,Object>> iterator1 = s2.iterator();
while (iterator1.hasNext()){
//getKey()方法和 getValue()方法在Map.Entry接口中
Map.Entry<Object,Object> next = iterator1.next();
System.out.println("entry迭代器: "+next.getKey()+"---"+next.getValue());
}
//foreach
for (Map.Entry<Object,Object> entry : s2){
System.out.println("entryforeach"+entry.getKey()+"---"+entry.getValue());
}
//把map中的值转换成collection集合
Collection values = map.values();
System.out.println("map中的值"+values);
}
}
2.HashMap和HashTable实现类(两者用法基本相同)
(1)它们和ArrayList和Vector是一样的概念,其实HashMap是一个比较老的实现类,不建议使用
(2)Hashtale是一个线程安全的Map实现,但HashMap是线程不安全的,所以HashMap比Hashtable的性能会更好;
如果有多个线程访问同一个Map对象时,使用Hashtable会更好
(3)Hashtable不能用null作为key和value,会发生控制器异常,但HashMap可以。
(4)如果需要线程安全的Map实现类,不建议使用Hashtable了 可以用Collections工具类来处理即可
(5)为了在它们中存储,获取对象,用作key的对象必须实现hashCode()方法和equals()方法。
(6)判断两个key是否相等;两个key通过equals()方法比较返回true,两个key的hashCode值也相等。
(7)Hashtable判断两个value是否相等,只要两个对象通过equals方法比较返回true即可。。
(8)hashmap存储跟哈希码值有关 所以判断对象 需要自己重写hashcode()方法和equals()方法
???为什么要同时重写hashCode方法和equals方法
HashMap
HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随机的。
HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null。
HashMap不支持线程的同步(即任一时刻可以有多个线程同时写HashMap),可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable与 HashMap类似,它继承自Dictionary类。
不同的是:Hashtable不允许记录的键或者值为空;它支持线程的同步(即任一时刻只有一个线程能写Hashtable),因此也导致了 Hashtable在写入时会比较慢。
3.LinkedHashMap实现类
(1)LikedHashMap也是用一个双向链表来维护key—value对的顺序,也就是key的顺序,该链表负责维护Map的迭代顺序,
迭代顺序与key-value对的插入顺序保持一致。
(2)LikedHashMap因为需要维护元素的插入顺序,因此性能会比HashMap稍低,但又因为它是链表结构来维护内部的顺序,
在迭代访问Map全部元素时,性能较好。
LinkedHashMap
保存插入顺序:LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。也可以在构造时带参数,按照应用次数排序。
速度慢:在遍历的时候会比HashMap慢,不过有种情况例外:当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
4.Properties实现类 ???什么是字节流什么是字符流
Properties(配置文件类): 主要用于生产配置文件与读取配置文件的信息。 容器类(属于map体系)
使用Properties生产配置文件:
store(OutputStream out,String comments):
第一个参数是一个输出流对象,第二参数是使用一个字符串描述这个配置文件的信息。
Properties要注意的细节:
(1)如果配置文件的信息一旦使用了中文,那么在使用store方法生成配置文件的时候只能使用字符流解决,如果使用字节流生成配置文件的话,
默认使用的是iso8859-1码表进行编码存储,这时候会出现乱码。
(2) 如果Properties中的内容发生了变化,一定要重新使用Properties生成配置文件,否则配置文件信息不会发生变化。
public class ProPeritesDemo {
//用法示例
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
//调用Hashtable方法put。提供了与getProperty方法的并行性。强制使用字符串
//作为属性键和值。返回的值是对put的Hashtable调用的结果。
//public synchronized Object setProperty(String key, String value) {
//return put(key, value);
//}
properties.setProperty("name","zhangsan");
properties.setProperty("age","12");
//这里的Hello.properites的格式可以改变为(.txt),但之后不能通过load方法读入
properties.store(new FileOutputStream("src/Hello.properites"),"ppp");
System.out.println(properties);
Properties properties1 = new Properties();
//public void store(OutputStream out, String comments)
//throws IOException
//{
//store0(new BufferedWriter(new OutputStreamWriter(out, ISO_8859_1.INSTANCE)),
//comments,
//true);
//}
properties1.load(new FileInputStream("src/Hello.properites"));
System.out.println(properties1);
}
}
总结:
(1)Map存储是键值对类型数据 put方法进行添加 它里面没有迭代器 需要转转成集合集合进行遍历 键是唯一的 值不唯一
值可以被再次赋值
(2)hashmap hashtable区别
用法一样
(3)LinkedHashMap 它的存储跟哈希码值有关,存储方式是双向链表 插入没有hashmap快
(4)Properites 当前这个对象在今后的项目中应用广泛 他对应的文件后缀properites load方法加载
store方法写入文件的方法

浙公网安备 33010602011771号