http://blog.csdn.net/ssssssue
Map
双列结合的根接口
1. 以键值对形式保存数据
一个key 对应一个value
2. 键保持唯一
HashSet和HashMap之间的关系
底层都是哈希算法 根据面向对象来分析 一套算法 两个类使用
HashSet底层是依赖HashMap去实现的
添加到Set中的值 实际上 是 添加到Map中的 键的 位置
HashMap: 有去重功能(操作的是键)(value 不具备这项功能)
TreeMap: 有排序功能(操作的是键)(value 不具备这项功能)
Map的添加方法
// map 的添加方法
HashMap<String , Integer > map = new HashMap<>();
Integer put = map .put("Java" , 21 );
Integer put2 = map .put("Javaya" , 19 );
Integer put3 = map .put("Javaya" , 28 );
// Javaya 的 19 被 28 覆盖了
// put方法 返回的是 被覆盖的值
System.out .println(put);
System.out .println(put2);
System.out .println(put3);
是否包含key
HashMap<String , Integer > map = new HashMap<>();
map .put("a" , 21 );
map .put("b" , 20 );
map .put("c" , 22 );
map .put("d" , 19 );
//是否包含key
boolean containsKey = mao.containsKey("a" );
System.out .println(containsKey);
是否包含value
HashMap<String , Integer > map = new HashMap<>();
map .put("a" , 21 );
map .put("b" , 20 );
map .put("c" , 22 );
map .put("d" , 19 );
boolean containsValue = map .containsValue(19 )
System.out .println(containsValue);
通过key 获取对应的value
HashMap<String , Integer > map = new HashMap<>();
map .put("a" , 21 );
map .put("b" , 20 );
map .put("c" , 22 );
map .put("d" , 19 );
Integer i1 = map .get(a);
Integer i1 = map .get(b);
System.out .println(i1);
System.out .println(i2);
获取所有key的Set集合
HashMap<String , Integer > map = new HashMap<>();
map .put("a" , 21 );
map .put("b" , 20 );
map .put("c" , 22 );
map .put("d" , 19 );
Set<String > keySet = map .KeySet();
System.out .println(keySet);
获取所有value的集合
HashMap<String , Integer > map = new HashMap<>();
map .put("a" , 21 );
map .put("b" , 20 );
map .put("c" , 22 );
map .put("d" , 19 );
Collection<Integer > values = map .values();
System.out .println(values);
通过key删除整个键值对
Integer remove = map.remove ("c" );
System.out.println(remove );
清空Map
HashMap<String , Integer > map = new HashMap<>();
map .put("a" , 21 );
map .put("b" , 20 );
map .put("c" , 22 );
map .put("d" , 19 );
map .clear();
System.out .println(map );
创建一个学生类 里面保存姓名和年龄
写上构造方法 set /get 方法 重写toString方法
HashMap< Student, String > hashMap = new HashMap<> ();
hashMap. put(new Student("a" , 21 ), "温州" );
hashMap. put(new Student("b" , 22 ), "安徽" );
hashMap. put(new Student("c" , 23 ), "河南" );
hashMap. put(new Student("c" , 23 ), "河北" );
System. out. println(hashMap);
发现打印结果 c 有两个 且 一个户籍是 河南 一个户籍是河北
如果想保持键的唯一性的话
就需要去重
这里去重就相当于Set 集合去重
需要重写hashCode 和 equals 方法
重写之后 key相同 value就会被新的值覆盖
用迭代器遍历Map
HashMap< String , Integer > map = new HashMap<> ();
map . put("a" , 21 );
map . put("b" , 20 );
map . put("c" , 22 );
map . put("d" , 19 );
Set < String > KeySet = map . KeySet();
Iterator< String > iterator = keySet. iterator();
while (iterator. hasNext()){
String key = iterator. next();
Integer value = map . get(key);
System. out. println(key + "=" + value);
}
用增强for循环(foreach)来遍历
HashMap< String , Integer > map = new HashMap<> ();
map . put("a" , 21 );
map . put("b" , 20 );
map . put("c" , 22 );
map . put("d" , 19 );
Set < Sring> keySet = map . KeySet();
for(String key : keySet){
Integer value = map . get(key);
System. out. println(key + " = " + value);
}
通过获取键值对对象是Set集合 来遍历
HashMap< String , Integer > map = new HashMap<> ();
map . put("a" , 21 );
map . put("b" , 20 );
map . put("c" , 22 );
map . put("d" , 19 );
Set < Map . Entry< String ,Integer >> entrySet = map . entrySet();
Iterator< Map . Entry< String , Integer >> iterator = entrySet. iterator();
while (iterator. hasNext()){
Entry< String , Integer > entry = iterator. next();
String key = entry. getKey();
Integer value = entry. getValue();
System. out. println(key + " = " + value);
}
增强for循环 Entry遍历
HashMap< String , Integer > map = new HashMap<> ();
map . put("a" , 21 );
map . put("b" , 20 );
map . put("c" , 22 );
map . put("d" , 19 );
Set < Entry< String ,Integer >> entrySet = map . entrySet();
for (Entry< String , Integer > entry : entrySet) {
Integer value = entry. getValue();
String key = entry. getKey();
System. out. println(key + " = " + value);
}
System.out .println("请输入字符串" );
Scanner scanner = new Scanner(System.in );
String string = scanner.nextLine();
char [] charArray = string .toCharArray();
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0 ; i < charArray.length; i++) {
char key = charArray[i];
if (!map.containsKey(key)) {
map.put(charArray[i], 1 );
}else {
Integer value = map.get (key);
value = value + 1 ;
map.put(key, value );
}
}
System.out .println(map);
linkedHashMap
特点: 有序(怎么存的 怎么打印)
LinkedHashMap<String , Integer > map = new LinkedHashMap<>();
map .put("a" , 18 );
map .put("b" , 19 );
map .put("c" , 20 );
map .put("d" , 21 );
System.out .println(map );
TreeSet
特点: 有排序功能(操作的是键)(value 不具备这项功能)
TreeMap< Student, String > map = new TreeMap<> ();
map . put(new Student("a" , 11 ), "安徽" );
map . put(new Student("b" , 13 ), "浙江" );
map . put(new Student("c" , 17 ), "河南" );
map . put(new Student("d" , 16 ), "江苏" );
System. out. println(map );
Collections类中的方法(静态方法)
随机交换集合中的值
ArrayList< Integer > list = new ArrayList<> ();
list . add(12 );
list . add(13 );
list . add(10 );
list . add(11 );
Collections. shuffle(list );
System. out. println(list );
排序
ArrayList< Integer > list = new ArrayList<> ();
list . add(12 );
list . add(13 );
list . add(10 );
list . add(11 );
Collections. sort(list );
System. out. println(list );
ArrayList<Student> list = new ArrayList<>();
list .add(new Student("ygs" ,10 ));
list .add(new Student("sxd" ,12 ));
list .add(new Student("hzn" ,8 ));
Collections.sort(list );
System.out.println(list );
二分查找(前提: 有序)
ArrayList<Integer> list = new ArrayList<>();
list.add (12 );
list.add (13 );
list.add (10 );
list.add (11 );
int index = Collections.binarySearch;
System.out .println(index );
反转
ArrayList< Integer > list = new ArrayList<> ();
list . add(12 );
list . add(13 );
list . add(10 );
list . add(11 );
Collections. reverse(list );
System. out. println(list );