------- android培训、java培训、期待与您交流! ----------
黑马学习日志之十一 集合(二)
1 Map集合
Map<K,V>: 和Collection是并行的接口,将键映射到值的对象,该集合存储键值对,一对一对往里存,而且要保证键的唯一性,一个映射不能包含重复的键,每个键最多只能映射到一个值。
K—此映射所维护的键的类型
V—映射值的类型
Collection 是单列集合。Map是双列集合,像是夫妻,可以给元素加索引甚至起名字。
Map集合方法:
添加:
V put(k ,v): 返回值。键是唯一的,当再次存入的键和集合中已有的键相同,会将原有的值覆盖。
void putAll(map); 将整个集合的元素添加到调用的集合中。
删除:
void clear():清除集合中所有的元素。
v remove(k) 通过键去删除元素,并返回该键对应的值。
判断:
boolean containsKey(Object key):是否包含这个键,返回值是布尔类型。
boolean containsValue(Object value):是否包含这个值,返回值的类型是布尔类型。
boolean isEmpty(): 返回值是布尔类型,判断集合是否为空。
获取:
v get(k):根据键获取值。当键不存在返回null,要尽量使用引用类型进行接收。
int size():获取集合中的长度。
Collection values() 获取集合中所有的值,返回是单列的集合。
Set keySet():获取map集合中所有的键,返回的是Set集合
Set entrySet():获取的是键值的映射的关系。将映射关系封装成对象存入到了Set集合。
2 Map集合的取出
第一种方法:
Set keyset(): 返回此集合映射中的所有的键的集合Set集合,返回的是Set集合。然后通过 遍历键的方法,通过get的方法获取到键的值。
第二种方法:
Set entrySet(): 返回一对键值对象,将map中的键值映射关系看成一个对象,通过getKey和getValue的方法获取其键和值。
Map中的键值映射关系是Map.Entry。 Map.Entry:其实Entry也是一个接口 它是Map接口中的一个内部接口
例子:
第一种:
import java.util.*;
class MapDemo2
{
public static void main(String [] args){
Map<String,String> map= new HashMap<String ,String>();
map.put("02","sun2");
map.put("03","sun3");
map.put("01","sun1");
map.put("04","sun4");
//先获取map集合的所有键的Set集合,keySet();
Set<String> keySet = map.keySet();
//Set集合使用其迭代器
Iterator<String> it = keySet.iterator();
while (it.hasNext())
{
String key = it.next();
//有了键可以通过map集合的get方法获取其对应的值
String value = map.get(key);
System.out.println("key:"+key+",value"+value);
}
}
}
第二种:
//将map集合中的映射关系取出,存入到Set集合中
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
while (it.hasNext())
{
Map.Entry<String,String> me = it.next();
String key = me.getKey();
String value=me.getValue();
System.out.println(key+":"+value);
}
2 Map的子类
Map集合的子类:
HashTable 底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步。
HashMap 底层是哈希表数据结构,允许使用null键和null值。该集合不同步。
TreeMap 底层是二叉树数据结构,线程不同步,可以用于给Map集合的键进行排序。
和Set集合很像,其实Set集合底层就是Map。
3 工具类
Collections类
sort() 对指定列表按升序进行排序。
sort( list, new Comparator()) 对指定的列表用我们指定的方式排序
reverseOrder() 将原先的集合的自然顺序倒序排序。
reverseOrder(new Comparator()) 返回一个比较器,它强行逆转指定比较器的顺序。
binarySearch() 对有序的集合二分查找,返回值是集合中的索引,如果不存在该元素, 就返回-(插入点)-1。
fill( list, obj)用obj将集合中的元素替代
reverse(List list)集合反转
swap(List list, int i, int j);指定位置的交换
shuffle(List list);对集合中的元素随机置换(洗牌)
replaceAll(List list, T oldVal, T newVal)新元素替换老元素
同步集合 synchronizedList(List<T> list) synchronizedMap(Map<T> map) synchronizedSet(Set<T> sett)
Arrays类
asList() 将数组转换成List集合。可以使用集合的方法和思想来操作数组。
注意:
(1)数组变成集合,但是不可以使用集合的增删方法。数组长度是固定的,增删会发生 不支持操作异常
(2)当数组中存储的是基本数据类型,变成集合后,会将这个数组变成集合中的元素
(3)当数组中存储的是引用数据类型,变成集合后,就将数组中的元素作为集合中的元素
集合变数组:Collection接口的toArray()方法。
ArrayList<String> al = new ArrayList<String>();
String[] arr = al.toArray(new String[0]);
长度该怎么定义呢?
当指定的长度小于集合的长度,该方法内部会自动创建一个该类型的新数组长度和集合长度一致 。用于存储集合中的元素。
如果指定的数组长度大于集合的长度,那么该方法就不会创建新数组。而是使用传递进来的数组,存储完集合的元素后,其他的未存储的位置为null。
所以在定义数组是,最好定义长度和集合长度相同的数组最优。
将集合变成数组其实是限定了对元素的增删操作。
4 高级for循环
格式:
for(数据类型 变量名:被遍历的集合Collection或者数组)
{
}
局限:只能取出 不能修改
高级for循环变量 只是指向了集合中的元素 当变量名=其他值时 ,实际是变量名指向发生变化 没有指向集合中的元素 所以集合中的元素还是不变的
传统for和高级for有什么区别?
高级for有一个局限性 必须有被遍历的目标 例如 将helloword 打印100次 高级for不可以
建议在遍历数组的时候,使用传统for,因为可以定义脚标,对脚标进行操作
5 JDk1.5 新特性
可变参数
其实就是上一种数组参数的简写形式,不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式将这些参数封装成了数组。
show(3,4);
show(3,4,5);
publicstaticvoidshow(int...arr)
{
Sop(arr);
}
注意:可变参数一定要定义在参数列表的最后面
show(int...arr,int a) 不可以
show(int...arr,String a)不可以
show(String a ,int...arr) 可以
静态导入
当类名重名时,需要指定具体的包名
当方法名重名时,指定具体所属的对象或者类
import static java.util.Arrays.*; 导入Arrays这个类中的所有静态成员
import static java.lang.System.*; 导入System类中所有静态成员