map的综述
java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。键是不能够相同,值可以一样,键相同的话,新键所对应的值会覆盖前面的值。同一个Map对象的任何两个key通过equals方法比较总是返回false。
- map接口定义了如下方法:
- V put(K key,V value)-->添加一个key-value对,如果当前map中已有一个与当前key相等的key-value对,则新的key-value会覆盖原来的key-value对。
- V remove(Object key)-->删除指定的key所对应的key-value对,返回被删除key所关联的value,如果key不存在返回null
- void clear()---------->删除该集合里的所有key-value对
- boolean containsKey(Object key)----------->查询该集合里是否包含指定的key,如果包含返回true
- boolean containsValue(Object value)------->查询该集合是否包含一个或多个value,如果包含返回true
- boolean isEmpty()----->查询该集合是否为空
- int size()------------>查询该集合里的key-value对的个数
- Set entrySet()-------->返回该集合中包含的key-value对所组成的set集合,每个集合元素都是map.entry(entry是map的内部类)对象
9.Set keyset() --------->返回该map中所有key组成的set集合
10.Collection values()-->返回该集合中所有值对象形成的Collection集合
MAP中包含一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法:
Object getKey():返回该Entry里包含的key值。
Object getValue():返回该Entry里包含的value值。
Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值
- HashMap、TreeMap和Hashtable:
这二者的键是哈希表结构,都可以保证键的唯一性。HashMap和Hashtable都是map接口的实现类,他们之间的关系完全类似于ArrayList和Vector的关系。treeMap的键是红黑树结构,可以保证键的排序和唯一性.
HashMap和Hashtable区别:
1.Hashtable是一个线程安全的map实现,但HashMap是线程不安全的实现,故HashMap的性能较高
2.Hashtable不允许使用null作为key和value,如果试图将null放入Hashtable,会报NullPointException异常;但HashMap可放入null作为key或value。
Hashtable的一个子类Properties:
Properties类似Windows操作平台上的ini文件就是一种属性文件。Properties可以把Map对象和属性文件管理起来,从而可以把map对象中的key-value对写入属性文件。也可以把属性文件里的内容加载到map对象中,由于属性文件里的属性名、属性值只能是字符串类型,故Properties里的key、value都是字符串类型。
它有如下方法:
String getProperty(String key) :获取Properties中指定属性名对应的属性值。
Object setProperty(String key, String value) :设置属性值,类似于Hashtable的put方法。
void load(Reader reader):从属性文件中加载key-value对,把加载的key-value对追加到Properties里。
void store(OutputStream out, String comments):将Properties的key-value对输出到属性文件里。
自定义实现HashMap
下面自定义的HashMap实现的是数组+链表的结构。
import java.util.LinkedList;
public class TestMyMap {
LinkedList[] arr = new LinkedList[200]; //申明要放入的数组
int size;
//map放入键值对方法
public void put(Object k,Object v){
jzd a = new jzd(k,v); //表示要放入的内容也就是键值对
int hash = k.hashCode();
hash = hash<0?-hash:hash; //防止hash码为负的
int b = hash%arr.length;
//下面就是找到Hash码对应的数组,里面存放链表,链表里面存放键值对
if(arr[b]==null){
LinkedList c = new LinkedList();
c.add(a);
arr[b] = c;
}else{
if(arr[b]!=null){
for(int i=0;i<arr[b].size();i++){
jzd d = (jzd)arr[b].get(i);
if(d.K.equals(k)){
d.V = v;
return ;
}
}
}
arr[b].add(a);
}
size++;
}
/**删除键值对*/
public void remove(Object k){
int m = k.hashCode()%arr.length;
if(arr[m]!=null){
for(int i=0;i<arr[m].size();i++){
MyMap b = (MyMap)arr[m].get(i);
if(b.k.equals(k)){
System.arraycopy(arr, i+1, arr, i, size-i-1);
}
}
}
arr[--size] = null;
}
//HashMap取出元素的方法
public Object get(Object key){
int hash = key.hashCode();
hash = hash<0?-hash:hash;
int b = hash%arr.length;
if(arr[b]!=null){
for(int i=0;i<arr[b].size();i++){
jzd a = (jzd)arr[b].get(i);
if(a.K.equals(key)){
return a.V;
}
}
}
return null;
}
public int size(){
return size;
}
public static void main(String[] args) {
TestMyMap s = new TestMyMap();
s.put("1", "aa");
s.put("2", "bb");
s.put("1", "cc");
s.remove("1");
System.out.println(s.size);
System.out.println(s.get("1"));
}
}
class jzd{
Object K,V;
public jzd(Object k, Object v) {
super();
K = k;
V = v;
}
}