映射接口Map
- 储存唯一不重复,无序的一组数据
- 生活中,
- 身份证号 -> 一个人
- 110 -> 报警电话
- 一个人的素质 -> 他的家教
- 这样的一对一的关系,我们就叫做“映射关系”
- 在程序中,这样的数据关系,还有另外一个名字,叫做“键值对”
- 键 -> 值
- key -> value
1、实现类HashMap
线程不安全的,键值都可以为null
添加时的顺序和拿出来的顺序是没有任何关系的。
需求:建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作
public static void main(String[] args) {
Map map = new HashMap();
map.put("CN", "中华人民共和国");
map.put("SRB", "塞尔维亚共和国");
map.put("JPN", "日本国");
map.put("RU", "俄罗斯联邦");
System.out.println("CN对应的国家是:" + map.get("CN"));
System.out.println("Map中共有" + map.size() + "组数据");
System.out.println("Map中包含FR这个key吗?" + map.containsKey("FR"));
System.out.println("Map中包含SRB这个key吗?" + map.containsKey("SRB"));
System.out.println(map.keySet());
System.out.println(map.values());
System.out.println(map);
// 清空数据
map.clear();
if (map.size() == 0) {
System.out.println("已清空map中的数据");
} else {
System.out.println("map中的存在数据");
}
}
2、实现类Hashtable
线程安全的,键值都不能为null
public class Test2_Hashtable {
public static void main(String[] args) {
Map map = new Hashtable();
map.put("咪咪", new Cat("白色"));
map.put("阿黄", new Cat("橘色"));
map.put("警长", new Cat("黑色"));
// 使用集合框架在添加数据的时候,会发生自动的向上转型(无论是什么数据类型都会提升为object)。所以往出拿的时候需要强制类型转换!!!
for (Object name : map.keySet()) {
Cat c = (Cat) map.get(name);
System.out.println("这只" + c.color + "的猫,叫做" + name);
}
}
}
class Cat {
String color;
public Cat(String color) {
this.color = color;
}
}
3、实现类LinkedHashMap
和HashMap基本一致,只是具备可预测的顺序
public static void main(String[] args) {
Map map = new LinkedHashMap();
map.put("CN", "中华人民共和国");
map.put("SRB", "塞尔维亚共和国");
map.put("RU", "俄罗斯联邦");
map.put("JPN", "日本国");
System.out.println(map);
}
集接口Set
- 储存唯一不重复,无序的。
1、实现类HashSet
public class Test1_HashSet {
public static void main(String[] args) {
Set set = new HashSet();
set.add(new Dog(1));
set.add(new Dog(2));
set.add(new Dog(3));
set.add(new Dog(4));
set.add(new Dog(5));
for (Object o : set) {
Dog d = (Dog) o;
System.out.println(d.age);
}
}
}
class Dog {
int age;
public Dog(int age) {
this.age = age;
}
}
2、实现类LinkedHashSet
和HashSet一样用法,具备可预测的顺序(添加时的顺序)
3、实现类TreeSet
对基本的数值数据,会自动排序(不是可预测的顺序)
public static void main(String[] args) {
Set set = new TreeSet();
set.add(2);
set.add(3);
set.add(4);
set.add(1);
set.add(5);
for (Object o : set) {
System.out.println(o);
}
}
如果添加的自定义的类型对象,例如猫,狗了,那么程序不仅不排序,而且还报错。
public class Test2_TreeSet {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(new Cat(1));
set.add(new Cat(2));
set.add(new Cat(3));
set.add(new Cat(4));
set.add(new Cat(5));
for (Object o : set) {
Cat c = (Cat) o;
System.out.println(c.age);
}
}
}
报错信息:set.Cat cannot be cast to java.lang.Comparable
上述错误,是因为TreeSet会对其集合中的元素进行自动排序,而cat这个类并没有提供排序的法则或依据,所以报错!!!!
对Cat类实现排序法则,提供排序的依据,问题即可解决!!!
解决方案:将Cat显示一个接口Comparable接口,重写compareTo方法,在方法中定义排序法则
class Cat implements Comparable {
int age;
public Cat(int age) {
this.age = age;
}
@Override
public int compareTo(Object o) {
// 定义排序法则
Cat c = (Cat) o;
int i = age - c.age;
return i;
}
}
迭代器
-
“迭代”,就是挨个访问的意思
-
迭代器 Iterator,是java为了迭代专门创建的一个工具对象。
-
只对集合有效。
public static void main(String[] args) { Map map = new HashMap(); map.put(110, "报警电话"); map.put(119, "火警电话"); map.put(120, "急救电话"); map.put(114, "号码百事通"); // 对所有的键,实行迭代方法,返回迭代器对象 Iterator it = map.keySet().iterator(); while( it.hasNext() ) { //有没有下一个元素 Object key = it.next(); //获得下一个元素 System.out.println(key + "---->" + map.get(key)); } }