Map集合

Collection |--List:元素是有序的,元素可以重复,因为该集合体系有索引 |--ArrayList:底层的数据结构使用的是数据结构。特点:查询速度快,但是增删稍慢,线程不相同。 |--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢,线程不相同。 |--Vector:底层是数据结构。线程同步,被ArrayList替代了,因为效率低! 注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的equals方法! |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。 |--HashSet:底层数据结构是哈希表。 HashSet是如何保证元素唯一性的呢? 是通过元素的两个方法,hashCode和equals来完成。 如果元素的hashCode值相同,才会判断equals是否为true. 如果元素的hashCode值不相同,不会调用equals方法。 注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法! |--TreeSet:可以对Set集合中的元素进行排序。 底层数据结构是二叉树。 保证元素唯一性的依据: compareTo方法return 0/1/-1;  (原装比较器)TreeSet排序的第一种方式:让元素自身具备比较性。 元素要实现Comparable接口,覆盖compareTo方法。 这种方式也称为元素的自然顺序,或者元素默认顺序。

 (比较器)TreeSet的第二中排序方式: 当元素自身不具备比较性时,或者具备的比较性不是所需要的。 这时就需要让集合自身具备比较性。 在集合初始化时,就有了比较方式。 1.Comparable接口是在java.lang类中的,而Comparator接口是在java.util类中的。 2.Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序, 所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。 |--Map |--Hashtable:底层是哈子表数据结构,不可以存入null键null值,该集合是线程同步的。jdk1.0效率低。 添加元素,如果出现添加时,那么后添加的值就会覆盖原有键的值,并put方法会返回被覆盖的值) 代码:(System.out.println(map.put("01","张三")) >>>>  null;   (System.out.println(map.put("01","李四")) >>>>  张三; |--HashMap:底层是哈子表数据结构,允许使用null键和null值,该集合是不同步的。jdk2.0效率高。 |--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序。 Map集合的两种取出方式:(***---------->>>>>>>>map集合key不能为 int 类型,但是可以包装为 Integer 类型) 1.Set<k> keySet:将map中所有的键存入到Set集合,因为Set具备迭代器 所有可以迭代方式取出所有的键,在根据get方法,获取每一个键对应的值 Map集合的取出原理:将map集合转成set集合,在通过迭代器取出。 2.Set<Map.Entry<k,v>> entrySet: 将Map集合中的映射关系存入到了Set集合中,而这个关系的数据类型就是:Map.Entry Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口。 和Set很像,其实Set底层就是使用了Map集合。

泛型:JDK_1.5版本以后出现新特性,用于解决安全问题,是一个类型安全机制。 好处: 1.将运行时期出现问题ClassCastException转移到了编译时期。 方便于程序员解决问题。让运行时期问题减少,安全! 2.避免了强制转换的麻烦! 问题1: 在使用java提供的对象时,什么地方定义泛型呢? 通常在集合框架定义泛型 只要见到<>就要定义泛型 其实<>就是用来接收类型的。 当使用集合时,将集合中要存储的数据类型作为参数传递到<>中集合。 问题2: 什么时候定义泛型类? 当类中要操作的  引用数据类型  不确定的时候, 早期定义Object来完成扩展,现在定义泛型来完成扩展。 泛型类定义的泛型,在整个类中有效,如果被方法使用, 那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了 为了让不同方法可以操作不同类型,而且类型还不确定。 那么可以将泛型定义在方法上。 特殊之处: 静态方法不可以访问类上定义的泛型。 如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。 接口的泛型 interface People<T>{ } 泛型限定 <T extends 父类> <? extends E>可以接受E类型或者E的子类型。————上限 <? super E> 可以接受E类型或者E的父类型。————下限

import java.util.*;

class  Student implements Comparable
{
	private int id;
	private String name;
	public int getId(){
		return id;
	}
	public String getName(){
		return name;
	}
	
	public Student(int id,String name){
		this.id = id;
		this.name = name;
	}
	//当直接打印Student时,或显示 id和name
	public String toString(){
		return id+"......"+name;
	}
	
	//如果用Hash表 装 数据就重写 hashCode和equals两方法
	public int hashCode(){
		return name.hashCode()+id*34;
	}
	public boolean equals(Object o){
		if(!(o instanceof Student)){
			//throw new RuntimeException("类型不匹配");
			throw new ClassCastException("类型不匹配");
		}

		Student s = (Student)o;
		return this.name.equals(s.name) && this.id==s.id;
	}

	//如果是二叉树 就得 重写 compareTo方法(那么就得实现Comparable接口)
	public int compareTo(Object o){
		if(!(o instanceof Student)){
			//throw new RuntimeException("类型不匹配");
			throw new ClassCastException("类型不匹配");
		}
		Student s = (Student)o;
		int num = new Integer(this.id).compareTo(s.id);
		if(num == 0)
			return this.name.compareTo(s.name);
		return num;	
	}

	
}

class MapTest
{
	public static void main(String[] args) 
	{
		//显示 map 与 list 嵌套
		//showMap_and_List();
		//显示 map 与 map 嵌套
		showMap_and_Map();
	}
	//显示 map 与 list 嵌套
	public static void showMap_and_List(){
		HashMap<String,List<Student>> czbk = new HashMap<String,List<Student>>();
		List<Student> first = new ArrayList<Student>();
		List<Student> second = new ArrayList<Student>();
		czbk.put("预热班",first);
		czbk.put("就业班",second);

		first.add(new Student(1, "张三"));
		first.add(new Student(2, "李四"));
		first.add(new Student(3, "王五"));
		first.add(new Student(4, "赵六"));

		second.add(new Student(1, "zhang"));
		second.add(new Student(2, "li"));
		second.add(new Student(3, "wang"));
		second.add(new Student(4, "liu"));
	
		Set<String> keySet = czbk.keySet();
		Iterator<String> it = keySet.iterator();
		while(it.hasNext()){
			String key = it.next();
			List<Student> list = czbk.get(key);
			getStudent(list);
		}
	}
	public static void getStudent(List<Student> list){
		Iterator<Student> it = list.iterator();
		while(it.hasNext()){
			Student stu = it.next();
			System.out.println(stu);
		}
	}

	//显示 map 与 map 嵌套
	public static void showMap_and_Map(){
		//map集合key不能为 int 类型,但是可以包装为 Integer 类型
		HashMap<String,HashMap<Integer,String>> czbk = new HashMap<String,HashMap<Integer,String>>();
		HashMap<Integer,String> first = new HashMap<Integer,String>();
		HashMap<Integer,String> second = new HashMap<Integer,String>();
		czbk.put("预热班",first);
		czbk.put("就业班",second);

		first.put(1, "张三");
		first.put(2, "李四");
		first.put(3, "王五");
		first.put(4, "赵六");

		second.put(1, "zhang");
		second.put(2, "li");
		second.put(3, "wang");
		second.put(4, "liu");
		
		Set<Map.Entry<String,HashMap<Integer,String>>> entrySet = czbk.entrySet();
		Iterator<Map.Entry<String,HashMap<Integer,String>>> it =  entrySet.iterator();
		while(it.hasNext()){
			Map.Entry<String,HashMap<Integer,String>> me = it.next();
			String key = me.getKey();
			HashMap<Integer,String> hm = me.getValue();
			System.out.println(key+"........"+hm);
			getStudent1(hm);
		}
	}
	public static void getStudent1(HashMap<Integer,String> hashMap){
		Set<Map.Entry<Integer,String>> entrySet = hashMap.entrySet();
		Iterator<Map.Entry<Integer,String>> it = entrySet.iterator();
		while(it.hasNext()){
			Map.Entry<Integer,String>  me = it.next();
			int key = me.getKey();
			String value = me.getValue();
			System.out.println(key +"..........."+ value);
		}
	}
	
}

Iterator迭代器的两种形式,获取对象,向上,就看getStudent() 和 getStudent1();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

java中List对象列表去重或取出以及排序

面试碰到几次list的去重和排序。下面介绍一种做法: 1. list去重 1.1 实体类Student List<Student>容量10k以上,要求去重复。这...

3809
来自专栏流媒体

STL(一)vector、set/multiset、listVectorSetmultisetlist

vector封装数组,list封装了链表,map和set封装了二叉树等。set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据...

722
来自专栏java一日一条

Java 容器&泛型(1):认识容器

容器是Java语言学习中重要的一部分。泥瓦匠我的感觉是刚开始挺难学的,但等你熟悉它,接触多了,也就“顺理成章”地知道了。Java的容器类主要由两个接口派生而出:...

652
来自专栏程序员互动联盟

【编程基础】Java Comparator接口的使用

在实际编程中我们经常会用到集合或者数组,有的时候你需要对这个集合中的元素就行排序,那这个时候就用到了Comparator接口,先看一下接口的原型: public...

3269
来自专栏闪电gogogo的专栏

【数据结构(C语言版)系列三】 队列

队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一...

772
来自专栏NetCore

Sql语句收藏

1、 查询列表,按照In的排序进行排序 select *, (select count(0) from [picture] where album_id=[al...

18710
来自专栏跟着阿笨一起玩NET

生成不重复的随机数算法

本文转载http://blog.csdn.net/zhoufoxcn/article/details/5825093#comments

421
来自专栏Android机器圈

Java中list<Object[]>、list<Student>、list<Map<String,String>>排序

1:list<Object[]>的排序 public static void main(String[] args) { // TODO Auto-gene...

3358
来自专栏哲学驱动设计

重构一个繁琐的数据结构

    在GIX4项目的开发过程中,遇到一个比较复杂的数据结构。复杂,是因为它有许多限制条件。我的工作是在现有系统中,添加新的功能,并在过程中重构部分旧代码。 ...

19210
来自专栏精讲JAVA

Comparable 与 Comparator 浅析

来源:朱小厮, blog.csdn.net/u013256816/article/details/50899416 今天博主在翻阅TreeMap的源码,发现其键...

2056

扫码关注云+社区