Map接口
Map集合的特点
Map
存储了一系列键值的映射关系Map
集合需要保证键的唯一性- 可以通过键获得值,反之则不能
- Map集合存储元素使用
put(key,value)
方法
HashMap实现类
- 线程不安全,存取速度快,允许存放null键,null值。
- 通过HashSet原理保证键唯一性
Hashtable实现类
- 线程安全,速度慢,不允许存放null键,null值,已被
HashMap
替代。
TreeMap实现类
- 通过二叉树算法保证键唯一性
- 对键进行排序,排序原理与
TreeSet
相同
Properties实现类
Hashtable
的子类,所以也是线程安全的- 用于读写配置文件的,一般配置项等号两边都是String,所以该集合中的两列保存的都是
String
类型的数据,这个集合中只能存String
,所以不需要定义泛型。
resource目录新建: db.properties
文件
className=cn.zysheep.core.sysbase.bill.entity.User
classMethod=setUsername
测试类ReflectionTest
public class ReflectionTest {
public static void main(String[] args) throws IOException, ClassNotFoundException,
InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
InputStream inputStream = ReflectionTest.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(inputStream);
String className = properties.getProperty("className");
// 反射得到Class对象
Class<?> clazz = Class.forName(className);
// 创建实例
Object o = clazz.newInstance();
String classMethod = properties.getProperty("classMethod");
Method method = clazz.getMethod(classMethod,String.class);
method.invoke(o, "zysheep");
System.out.println(o);
ClassLoader classLoader = User.class.getClassLoader();
Class<?> aClass = classLoader.loadClass(className);
System.out.println(aClass);
}
}
Map接口中方法
Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
添加
- put(K key, V value)
- putAll(Map<? extends K,? extends V> m)
删除
- clear()
- remove(Object key)
判断
- containsValue(Object value)
- containsKey(Object key)
- isEmpty()
获取
- get(Object key)
- size()
- values()
- entrySet()
- keySet()
总结
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
Map和Set很像,其实Set底层就是使用了Map接口
map集合的两种取出方式:
- Set keySet():
- 将map中所有的键存入到Set集合。因为set具备迭代器。
- 所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
- Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
//Map
HashMap<Object,Object> map = new HashMap();
map.put(1,"I");
map.put(2,"love");
map.put(3,"you");
Set<Object> mapSet = map.keySet(); //根据key获取value
for (Object obj:mapSet) {
System.out.println(obj+"----"+map.get(obj)); //实际上就是遍历Set
}
- Set<Map.Entry<k,v>> entrySet():
将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry,Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。
// 方式1
Set<Map.Entry<Object, Object>> mapSet1= map.entrySet();
Iterator<Map.Entry<Object, Object>> iterator2 = mapSet1.iterator();
while(iterator2.hasNext()){
Map.Entry<Object, Object> next = iterator2.next();
System.out.println(next.getKey()+"======"+next.getValue());
}
// 方式2
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
/* Map(interface)
* 实现类:(implements)
* HashMap:低层实现采用了哈希表,这是一种非常重要是数据结构 数组+链表 核心(Node<K,V>[] ) 位桶数组
* ※HashMap线程不安全,效率高,允许key或value为null
* jdk8以后链表的长度大于8,转换成红黑树
* put的底层原理:
* 首先根据key对象的hashCode方法的到一个任意的哈希值,通过散列算法(一般是求余 %16)得到一个0-16的哈希值
* 然后存放到相应的地址(hash key value next),如果还有继续添加,形成链表结构
* get的底层原理:
* 首先根据key对象的hashCode方法的到一个任意的哈希值,通过散列算法(一般是求余 %16)得到一个0-16的哈希值
* 根据equals方法找到对应key的值的value 并返回
* java中规定,两个内容相同(equals()为true)的对象必须具有相等的hashCode
* TreeMap : 是红黑二叉树的典型实现,可以按照key递增的方式排序
*
* HashTable:
* ※线程安全,效率低,不允许key或value为null
*
* */