-
Map接口
- Map内存储的是键/值对这样以成对的对象组(可以把一组对象当成一个元素),通过“键”对象来查询“值”对象
- Map是不同于Collection的另外一种集合接口
- Map中,key值是唯一的(不能重复),而key对象是与value对象关联在一起的
-
Map接口有两个实现:
- HashMap — key/value对是按照Hash算法存储的
TreeMap — key/value对是排序(按key排序)存储的
方法 | 含义 |
---|---|
Object put(Object key,Object value) | 将指定的值与此映射中的指定键相关联 |
void putAll(Map t) | 将映射t中所有映射关系复制到此映射中 |
Object get(Object key) | 返回此映射中映射到指定键的值 |
Object remove(Object key) | 若存在此键的映射关系,将其从映射中移除 |
boolean containsKey(Object key) | 若此映射包含指定键的映射关系,返回 true |
boolean containsValue(Object value) | 若此映射为指定值映射一个或多个键,返回 true |
int size() | 返回此映射中的键-值映射对数 |
void clear() | 从此映射中移除所有映射关系 |
boolean isEmpty() | 若此映射未包含键-值映射关系,返回 true |
Set keySet() | 返回此映射中包含的键的 set 视图 |
- Map接口的实现类
- 基于哈希表的 Map 接口的实现
- HashMap的构造方法
HashMap 变量名 = new HashMap() ;
HashMap 变量名 = new HashMap(int capacity) ;
HashMap 变量名 = new HashMap(int capacity,float lodeFactor) ;
HashMap 变量名 = new HashMap(Map m) ;
-
HashMap与TreeMap的比较
- HashMap基于哈希表实现。TreeMap基于树实现。
- HashMap可以通过调优初始容量和负载因子,优化HashMap空间的使用。TreeMap没有调优选项,因为该树总处于平衡状态
- HashMap性能优于TreeMap。
-
HashMap与Hashtable的比较
- Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
- Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
- HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
-
如何选择集合类
- Set内存放的元素不允许重复,List存放的元素有一定的顺序。
- Map的应用主要在利用键/值对进行快速查询。
- ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但LinkedList的中间元素的插入与删除性能好 。
- HashSet和TreeSet的区别在于集合内元素是否排序 。
使用集合类时常见的异常
异常类型 | 说明 |
---|---|
ClassCastException | 从集合中取得元素对象在进行类型转换的时候类型不匹配 |
UnsupportedOperationException | 当底层实现没有实现上层的相关方法的时候由Collection抛出该异常。Collection接口(或其他集合超类)中的一些函数在java doc中是标明”可有可无(Optional)”的函数,这些函数在底层的一些具体实现中,有的实现了,有的没有实现,当我们调用底层实现集合类的这些没有实现的方法时就会抛出该异常。 |
ConcurrentModificationException | ConcurrentModificationException 当采用Iterator遍历集合时,如果此时集合中的元素被改变则Iterator遍历抛出此异常 |
IndexOutOfBoundsException | 集合中元素引用的索引值超出界限(<0或>size()) |
NoSuchElementException | LinkedList中getLast,getFirst等方法取元素的时候List为空 |
示例代码:
package Map集合;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class TestHashMap {
public static void main(String[] args) {
/**
* Map 集合的特点:
* 1. key不能重复,null类型也不能重复
* (因为这个key在 内存里面是乱放的,
* 如何键相同则认为是同一个对象,
* 所以地址是同一个地址)
* 2. key可以是 null
* 3. value列的值有多个null是可以的
*
*/
Map<Integer,String> m;
Hashtable<Integer, String> h;
m = new HashMap<>();
m.put(1,"yezong");
m.put(2,"zhaozong");
m.put(3,"chenzong");
m.put(null,null);
m.put(null,null);
m.put(4,"yezong");
m.put(3,"tanzong");
//迭代访问方式一:
for(Integer i: m.keySet()) {
System.out.println(i);
}
System.out.println("--------------------------");
m.remove(4);//删除key为4的元素
//迭代访问方式二:把双列集合变成单列集合然后迭代
Set<Entry<Integer,String>> s = m.entrySet();
Iterator<Entry<Integer,String>> it = s.iterator();
while(it.hasNext()) {
Entry<Integer, String> e = it.next();
System.out.println("e.getKey(): " + e.getKey() + " e.getValue():" + e.getValue());
}
}
}
Map集合的访问原理
泛型的使用
-
集合在使用上的问题
- 集合中的add( )方法接受的是一个Object对象的参数 ,在获取集合中的对象时,必须进行造型(强制类型转换)操作。
- 造型操作可能出现问题,一般在程序运行时才能发生,发现问题比较困难。
-
集合中泛型的使用
- 在对象放入集合前,为其作个限制
- 在获取集合中的对象时,不用进行造型的操作
- 当有不同类型的对象添加到集合中的时候,编译时就能检查出错误
-
集合中泛型的使用
- 泛型经常被称为参数化类型,它能够像方法一样接受不同类型的参数。
定义方式
ArrayList<E> 变量名 ;
- E是变量类型
ArrayList<String> arr;
arr = new ArrayList<String>();
HashMap<Integer,String> hm = new HashMap<Integer,String>();
泛型的使用
- “<>”类型推断运算符
- JDK 1.7引入一个新的操作符<>,也被称作钻石操作符,它使得构造方法也可以进行类型推导 。在这之前,你得在对象创建表达式的左右两边同时指定类型,现在你只需要在左边指定就可以了。
JDK 7之前:
Map<String, List<String>> employeeRecords = new HashMap<String, List<String>>();
List<Integer> primes = new ArrayList<Integer>();
JDK 7 :
Map<String, List<String>> employeeRecords = new HashMap<>();
List<Integer> primes = new ArrayList<>();
示例代码:
package Map集合;
public class Test<E> {//如果此类被实例化 E 被赋值为String 那么所有的E都是String
private Object[] objs = new Object[2000];
private E element;
public E getElement() {
return element;
}
public void put(E e) {
objs[0] = e;
}
}
扩展知识:
以上就是我关于 Java-Map集合.md 知识点的整理与总结的全部内容,另附源码
分割线
博主为咯学编程:父母不同意学编程,现已断绝关系;恋人不同意学编程,现已分手;亲戚不同意学编程,现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏,金额不限。。。