——我是LGM_Hakka,请多多指教。
A. 内部存储的是键key和值value,是一对。
B. 键是唯一的,值可以不唯一
C. 如果键相同,值将被覆盖。
D. put方法会返回上一次的值。若上一次没有值,则返回null。
E. 如果键不存在,返回null,通过此方法用于判断键是否存在。
F. 所有的键可以用单列集合获取到,又因为map集合中的键要保证唯一性,所以Map集合的键是可以用Set集合接收。
G. 所有的值可以用Collection获取到。因为值是不一定是唯一的。
H. Set entrySet();将map集合中映射关系存储到了Set集合中
I. 映射关系:其实就是指键和值的对应关系。映射关系的类型是Map.Entry
J. Map集合没有迭代器,取出元素的方式:
将Map集合转成单列集合,在使用单列集合的迭代器就可以了
A. TreeMap类:数据结构:二叉树。不是同步的。可以对map集合中的键进行排序。
B. HashMap类:数据结构:哈希表。非同步的,允许null作为键和值。
C. LinkedHashMap类:是HashMap的子类,基于链表+哈希表。可以保证map集合有序,即:取出的顺序与存入的顺序一致。
D. Hashtable类: 数据结构: 哈希表。同步的,不允许null作为键和值。被hashMap类代替。
E. Properties类:是HashTable的子类,属性集,键和值都是字符串,而且可以结合流进行键值的操作。
A. 分析问题时出现对应关系时,用map集合。
B. 如果对应关系中出现了有序数字,想到数组。
C. 注意:如果对应关系个数不确定,还是以map为主。
Map:是双列集合。键必须唯一,值可以重复,成对出现的集合
Collection:是单列集合,它的子接口List的元素是可以重复的,而Set集合中元素是唯一的。
因为如果用自定义对象当做键的话,要保持元素的唯一性(因为键是唯一的)
HashMap 通过名字可以看出他是 哈希结构,所以如果想要保持元素的
唯一性需要重写这两个方法.
注意:如果用自定义对象做键的话,需要做以下两个操作
实现排序方式一:让对象所属的类去实现Comparable接口
实现排序方式二:用TreeMap的带参构造,在参数位置接收 Comparator 接口对象。
A:HashMap:线程不安全,效率高,允许键和值为null。
B:Hashtabl:线程安全,效率低,不允许键和值为null。
是否键值对?
是:Map
是否对键排序?
是:TreeMap
否:HashMap
不懂的情况下,使用HashMap。
否:Collection
是否唯一
是:Set
是否对元素进行排序?
是:TreeSet
否:HashSet
不懂的情况下,使用HashSet
否:List
是否要安全:
是:Vector(真正开发中也不用)
List list =Collections.synchronizedList(new ArrayList());
否:ArrayList,LinkedList
查询多:ArrayList
增删多:LinkedList
不懂的情况下,使用ArrayList
/*
* 1.首先定义一个标准学生类(name,age属性)
*/
class Student {
// 定义姓名属性
private String name;
// 定义年龄属性
private int age;
// 无参构造
public Student() {
}
// 带参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 获取姓名属性
public String getName() {
return name;
}
// 设置姓名
public void setName(String name) {
this.name = name;
}
// 获取年龄
public int getAge() {
return age;
}
// 设置年龄
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name + "\t" + age ;
}
}
// --------------------
/*
* 需求:创建一个HashMap集合,然后存入3个成对的元素,
* 要求key是String类型,value是Student类型
*/
public class HashMapStuDemo {
public static void main(String[] args) {
Map map = new HashMap();
Student s1 = new Student("张三", 21);
Student s2 = new Student("李四", 25);
Student s3 = new Student("王五", 23);
map.put("0001", s1);
map.put("0002", s2);
map.put("0003", s3);
// 获取键值对---第二种方法
// Set set = map.keySet();
// for (String string : set) {
// Student s = map.get(string);
// System.out.println(string + "\t" + s.getName() + "\t" + s.getAge());
// }
// 获取键值对---第二种方法
// 此映射中包含的映射关系的 Set 视图。
Set> set = map.entrySet();
// 遍历
for (Map.Entry e : set) {
// 获取键
String key = e.getKey();
// 获取值
Student s = e.getValue();
// 打印键值
System.out.println(key + "\t" + s);
}
}
}
// --------------------
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
* 需求:创建一个HashMap集合,然后存入3个成对的元素,
* 要求key是Student类型,value是String类型
*/
public class HashMapStuDemo2 {
public static void main(String[] args) {
// 创建HashMap对象
Map map = new HashMap();
// 创建学生对象
Student s1 = new Student("张三", 21);
Student s2 = new Student("李四", 25);
Student s3 = new Student("王五", 23);
// 将学生对象存入HashMap集合中
map.put(s1, "0001");
map.put(s2, "0002");
map.put(s3, "0003");
// 创建Set集合,用于存储HashMap的所有键
Set set = map.keySet();
// 遍历Set集合
for (Student s : set) {
// 获取键所对应的值
String str = map.get(s);
System.out.println(str + "\t" + s);
}
}
}
// --------------------
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/*
* 1 创建一个TreeMap,存储5对元素,
* 2 用自定义对象做键,String做值
*/
public class TreeMapStu2 {
public static void main(String[] args) {
// 创建TreeMap对象,带匿名对象比较器
Map tree = new TreeMap(new Comparator() {
@Override
public int compare(Student o1, Student o2) {
int temp = o1.getAge() - o2.getAge();
return temp == 0 ? o1.getName().compareTo(o2.getName()) : temp;
}
});
// 创建学生对象
Student s1 = new Student("zhangsan", 22);
Student s2 = new Student("lisi", 24);
Student s3 = new Student("wangwu", 23);
Student s4 = new Student("zhaoliu", 29);
Student s5 = new Student("chenqi", 20);
/*
* 用自定义对象做键,String做值
*/
tree.put(s1, "3");
tree.put(s2, "1");
tree.put(s3, "5");
tree.put(s4, "4");
tree.put(s5, "2");
Set set = tree.keySet();
for (Student s : set) {
String str = tree.get(s);
System.out.println(str + " " + s);
}
}
}
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/*
* 有一个字符串: "cbxzbvavdvgd" 要求获取字符串中,
* 每一个字母出现次数:"a(1)b(2)c(1)d(2)g(1)v(3)x(1)z(1)"
* 思路:
* 1、定义一个变量接收字符串
* 2、定义一个字符数组,将字符串转为字符数组
* 3、定义一个双列集合,因为需要排序,所以定义TreeMap集合
* 4、遍历字符数组,查找在TreeMap集合中,有没有出现
* 如果没有,将该字符存入集合中,值为1
* 如果有,将该字符对应的值+1,重新将该字符及对应的值,存回集合中
* 5、定义StringBuilder,用于拼接字符串
*/
public class TreeMapDemo {
public static void main(String[] args) {
// 定义一个变量接收字符串
String str = "cbxzbvavdvgd";
// 定义一个字符数组,将字符串转为字符数组
char[] chs = str.toCharArray();
// 定义一个双列集合,因为需要排序,所以定义TreeMap集合
Map map = new TreeMap();
/*
* 遍历字符数组,查找在TreeMap集合中,有没有出现
* 如果没有,将该字符存入集合中,值为1
* 如果有,将该字符对应的值+1,重新将该字符及对应的值,存回集合中
*/
for (char c : chs) {
Integer count = map.get(c);
if (count == null) {
map.put(c, 1);
} else {
count++;
map.put(c, count);
}
}
// 定义StringBuilder,用于拼接字符串
StringBuilder sb = new StringBuilder();
Set set = map.keySet();
for (Character c : set) {
Integer i = map.get(c);
sb.append(c).append("(").append(i).append(")");
}
String result = sb.toString();
System.out.print(result);
}
}