Map介绍

映射接口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));
      	}
      }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值