一.Map接口
如果程序中存储了几百万个学生,而且经常需要使用学号来搜索某个学生,那么这个需求有效的数据结构就是Map。
Map是一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。
在Map中键(key)可以使任意类型的对象。Map中不能有重复的键(Key),每个键(key)
都有一个对应的值(value)。
一个键(key)和它对应的值构成map集合中的一个元素。
Map中的元素是两个对象,一个对象作为键,一个对象作为值。键不可以重复,但是值可以重复。
双列集合:
-------------| Map 如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,
键不可重复,值可以重复。
----------------| HashMap 底层也是基于哈希表实现的。
----------------| TreeMap TreeMap也是基于红黑树(二叉树)数据结构实现 的,
特点:会对元素的键进行排序存储。
----------------| Hashtable 底层是哈希表数据结构,线程是同步的,效率较低,被HashMap 替代。
Map与Collection的异同:
1.Map与Collection在集合框架中属并列存在。
2.Map存储的是键值对,collection存储的是单个值。
3.Map存储元素使用put方法,Collection使用add方法
4.Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素
5.Map集合中键要保证唯一性
也就是Collection是单列集合, Map 是双列集合。
总结:
Map一次存一对元素, Collection 一次存一个。Map 的键不能重复,保证唯一。
Map 一次存入一对元素,是以键值对的形式存在.键与值存在映射关系.一定要保证键的唯一性.
Map接口的常用方法:
添加:
1、V put(K key, V value) (可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,
如果没有就返回null)
2、putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
删除
1、remove() 根据键删除一条map中的数据,返回的是该键对应 的值。
2、clear() 清空集合中的所有数据。
获取
1:value get(key); 根据指定的键获取对应的值;可以用于判断键是否存在的情况。
当指定的键不存在的时候,返回的是null。
判断:
1、boolean isEmpty() 长度为0返回true否则false
2、boolean containsKey(Object key) 判断集合中是否包含指定的key
3、boolean containsValue(Object value) 判断集合中是否包含指定的value
长度:
Int size() 获取map集合键值对个数
遍历Map的方式:
1、将map 集合中所有的键取出存入set集合。
Set<K> keySet() 返回所有的key对象的Set集合
再通过get方法获取键对应的值。
2、 values() ,获取所有的值.
Collection<V> values()不能获取到key对象
3、Map.Entry对象 推荐使用
Set<Map.Entry<k,v>> entrySet() 将map 集合中的键值映射关系打包成一个对象,
Map.Entry对象通过Map.Entry 对象的getKey,getValue获取其键和值。
map集合遍历方式一: 使用keySet方法进行遍历
缺点:keySet方法只是返回了所有的键,没有值。
//keySet()把Map集合中的所有键都保存到一个Set类型的集合对象中返回。
Set<String> keys = map.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.println("键:"+ key+" 值:"+ map.get(key));
}
map集合遍历方式二:使用values方法进行遍历
缺点:values方法只能返回所有的值,没有键
//values() 把所有的值存储到一个Collection集合中返回。
Collection<String> c = map.values();
Iterator<String> its = c.iterator();
while(its.hasNext()){
System.out.println("值: " + its.next());
}
map集合的遍历方式三:使用entry方法遍历。
//通过Map中的entrySet()方法获取存放Map.Entry<K,V>对象的Set集合。
//用面向对象的思想将map集合中的键和值映射关系打包为一个对象,就是Map.Entry,将该对象存入Set集合,
//Map.Entry是一个对象,那么该对象具备的getKey,getValue获得键和值。
Set<Map.Entry<String, String>> entrys = map.entrySet();
Iterator<Map.Entry<String, String>> itss = entrys.iterator();
while(itss.hasNext()){
Map.Entry<String, String> entry = itss.next();
System.out.println("键: "+ entry.getKey()+ " 值: "+ entry.getValue());
}
二.Map接口下的实现类—HashMap类
底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,
和equals方法。
HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算
就可以算出该元素在哈希表中的存储位置。
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,
如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,
不允存储。
三.Map接口下的实现类—TreeMap类
TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。
TreeMap 要注意的事项:
1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,
把键的比较规则定义在CompareTo方法上。
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,
那么就必须在创建TreeMap对象的时候传入比较器。
注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;
注意:Set的元素不可重复,Map的键不可重复,如果存入重复元素如何处理?
Set元素重复元素不能存入add方法返回false
Map的重复健将覆盖旧键,将旧值返回。
四.Collections类与Arrays类
1.集合框架中的工具类:特点:该工具类中的方法都是静态的。
Collections:常见方法:
1,对list进行二分查找:
//前提该集合一定要有序。
int binarySearch(list,key);
//必须根据元素自然顺序对列表进行升级排序
//要求list 集合中的元素都是Comparable 的子类。
int binarySearch(list,key,Comparator);
2,对list集合进行排序。
sort(list);
//对list进行排序,其实使用的事list容器中的对象的compareTo方法
sort(list,comaprator);
//按照指定比较器进行排序
3,对集合取最大值或者最小值。
max(Collection)
max(Collection,comparator)
min(Collection)
min(Collection,comparator)
4,对list集合进行反转。
reverse(list);
5,可以将不同步的集合变成同步的集合。
Set synchronizedSet(Set<T> s)
Map synchronizedMap(Map<K,V> m)
List synchronizedList(List<T> list)
2.Arrays:用于对数组操作的工具类
1,二分查找,数组需要有序
binarySearch(int[])
binarySearch(double[])
2,数组排序
sort(int[])
sort(char[])……
2,将数组变成字符串。
toString(int[])
3,复制数组。
copyOf();
4,复制部分数组。
copyOfRange():
5,比较两个数组是否相同。
equals(int[],int[]);
6,将数组变成集合。
List asList(T[]);
这样可以通过集合的操作来操作数组中元素,
但是不可以使用增删方法,add,remove。因为数组长度是固定的,会出现UnsupportOperationExcetion。
可以使用的方法:contains,indexOf。。。
如果数组中存入的基本数据类型,那么asList会将数组实体作为集合中的元素。
如果数组中的存入的引用数据类型,那么asList会将数组中的元素作为集合中的元素。