------- android培训、java培训、期待与您交流! ----------
Collection体系描述
对象可以放在数组和集合中。
集合的特点:
1、 集合中只用来存储对象,
2、 集合长度是可变的
3、 集合可以存储不同类型的对象。、
集合体系:
集合框架:
为什么会出现这么多的容器呢?
因为每个容器对数据的存储方式都有不同,这个存储方式称为数据结构。
共性方法
创建一个集合容器,示例使用Collection接口的子类——ArrayList。
ArrayList al1=new ArrayList();
1、 添加元素:add(Objectob);
al1.add(“java01”);
al1.add(“java02”);
al1.add(“java03”);
al1.add(“java04”);
2、 获取个数,集合长度
al1.size();
内存结构:
(1) add方法的参数类型是Object(add(Object ob),以便于接收任意类型对象。
(2) 集合中存储的都是对象的引用(地址)
打印集合:System.out.println(al1);
3、 删除元素:
al1.remove(“java01”);
al1.clear();//清空集合
al1.removeAll(al2);al1中只会保留在al2中没有的元素。
4、 判断元素
al1.contains(“java01”);al1中有没有java01对象
al1.isEmpty();//al1是否为空。
5、 取交集
ArrayList al2=new ArrayList();
al2.add(“java01”);
al2.add(“java02”);
al2.add(“java05”);
al2.add(“java06”);
al1.retainAll(al2);//取交集al1中只会保留和al2中相同的元素。
迭代器
什么是迭代器?
其实就是集合取出元素的方式。
Iterator it=al1.iterator();//获取迭代,用于取出集合中的元素。
while(it.hasNext()){
System.out.println(it.nex());
}
it.hasNext();//判断如果仍有元素可迭代,则返回true。
开发是通常不用while循环而用for循环,因为it迭代以后就没用了所以定义成局部变量比较合适。
for(Iteratorit=al1.iterator();it.hasNext();){
System.out.println(it.next());
}
List集合共性方法
List:元素是有序的;元素可以重复,因为该集合体有索引。
set:元素无序,元素不可以重复
List特有方法:凡可以操作脚标的方法都是该体系特有方法。
1、 增:
add(index,element);
addAll(index,Collection);
2、 删:
remove(index);
3、 改:
set(index,element);
4、 查:
get(index);
subList(from,to);
listIterator();
例:
for(int x=0;x<al1.size();x++){
System.out.println(al1.get(x));
}
上例所实现得到的功能用Collection中的方法实现
for(Iterator it=al1.Iterator();it.hasNext();){
System.out.println(it.nex());
}
ListIterator
通过indexOf获取对象的位置。
例如:al1.indexOf(“java02”);
获得子集合:List sub=al1.subList(1,3);
当操作一个集合元素时,只能用一种方式操作(要么是迭代器的方法,要么是集合对象的方法),因为不能并发进行,否则会出现异常。
例如:Interator it=al1.iterator();
while(it.hasNext()){
Objectobj=it.Next();//迭代器的方法
if(obj==”java02”)
//al1.add(“java008”);//集合对象的方法,这样会异常,所以用下面迭代器方法
it.remove();
System.out.println(al1);//测试打印的是没有移除前的集合元素,因为it.remove();
//时只删除了集合中”java02”的引用,但”java02”还在obj中所使//用,所以才打印出来了
}
System.out.println(al1);//此时打印是删除后的集合元素。
List集合特有的迭代器——ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
用ListIterator迭代器修改后的代码:
ListInterator li=al1.listIterator();
while(li.hasNext()){
Objectobj=it.Next();
if(obj.equals(“java02”))
li.set(“java008”);
}
在List集合中在操作指针之前,指针是在最右边元素的右边一个位置上的。
所以用hasNext()和Next()是会右移。
在ListIterator中有个方法与hasNext()和Next()完全相反的方法——hasPrevious()和Previous()。他是倒叙迭代的,因为指针(如上),所以迭代时注意。
List集合具体对象的特点
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
注意:ArrayList和Vector因为是数组结构,数组长度不可变,所以当往里添加元素超过数组长度时他们会创建新的数组,把旧数组的元素拷过去。ArrayList初始长度是10,每延长一次数组长度增加50%;Vector初始长度是10,每延长一次数组长度增加100%;
Vector:
在API中Vector下的方法带有element的方法都是其特有方法。
枚举(Enumeration): Elements下的Enumeration的方法hasMoreElements();nextElements();此方法为Vector特有的取出方式。发现枚举和迭代器很像,其实枚举和迭代器是一样的。因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。
LinkedList:
LinkedList:特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst();代替addFirst();
offerLast();代替addLast();
peekFirst();代替getFirst();
peekLast();代替getLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();代替removeFirst();
pollLast();代替RemoveLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
例题:
/*
使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出 如同一个杯子。
队列:先进先出 First in First out FIFO 如同一个水管。
*/
import java.util.*;
class DuiLie
{
privateLinkedList link;
DuiLie()
{
link= new LinkedList();
}
publicvoid myAdd(Object obj)
{
link.addFirst(obj);
}
publicObject myGet()
{
returnlink.removeFirst();
}
publicboolean isNull()
{
returnlink.isEmpty();
}
}
class LinkedListTest
{
publicstatic void main(String[] args)
{
DuiLiedl = new DuiLie();
dl.myAdd("java01");
dl.myAdd("java02");
dl.myAdd("java03");
dl.myAdd("java04");
while(!dl.isNull())
{
System.out.println(dl.myGet());
}
}
}
例二:
package exception;
import java.util.*;
class Person{
private String name;
privateintage;
Person(Stringname,intage){
this.name=name;
this.age=age;
}
publicboolean equals(Object obj){//由于Object中定义的equals
//方法只是比较地址值,此处重写比
//较姓名和年龄。
if(!(obj instanceof Person)){
returnfalse;
}
Personp=(Person)obj;
returnthis.name.equals(p.name)&&this.age==p.age;
}
public String getName() {
returnname;
}
publicint getAge() {
returnage;
}
}
publicclassArrayListText2 {
publicstaticvoid sop(Object obj){
System.out.println(obj);
}
publicstatic ArrayListsingleElement(ArrayList al){
ArrayListnewAl=newArrayList();
Iteratorit=al.iterator();
while(it.hasNext()){
Objectobj=it.next();
if(!newAl.contains(obj)){//contains方法中用到了equals
//方法,因为比较姓名和年龄所以上面才重写了equals方法。因为newAl中的
//对象都是Person的对象所以调用时也是Person类中的equals,所以才在
//Person中重写equals的
newAl.add(obj);
}
}
return newAl;
}
publicstaticvoid main(String[] args) {
ArrayListal=newArrayList();
al.add(new Person("lisi01",30));
al.add(new Person("lisi01",30));
al.add(new Person("lisi02",31));
al.add(new Person("lisi03",32));
al.add(new Person("lisi03",32));
al.add(new Person("lisi04",33));
al=singleElement(al);
Iteratorit=al.iterator();
while(it.hasNext()){
Personp=(Person)it.next();//因为add(Object obj)接收的
//对象时用到了多态的上转型,所以要想用到Person中的方法getName等所以
//要向下转型。
sop(p.getName()+"::"+p.getAge());
}
}
}
HashSet
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
所以在自定义对象时如果要存放在hashSet集合中,通常要复写hashCade和equals方法。
例子:
class HashSetTest
{
publicstatic void sop(Object obj)
{
System.out.println(obj);
}
publicstatic void main(String[] args)
{
HashSeths = new HashSet();
hs.add(newPerson("a1",11));
hs.add(newPerson("a2",12));
hs.add(newPerson("a3",13));
// hs.add(newPerson("a2",12));
// hs.add(newPerson("a4",14));
//sop("a1:"+hs.contains(newPerson("a2",12)));
// hs.remove(newPerson("a4",13));
Iteratorit = hs.iterator();
while(it.hasNext())
{
Personp = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
privateString name;
privateint age;
Person(Stringname,int age)
{
this.name= name;
this.age= age;
}
publicint hashCode()
{
System.out.println(this.name+"....hashCode");
returnname.hashCode()+age*37;
}
publicboolean equals(Object obj)
{
if(!(objinstanceof Person))
returnfalse;
Personp = (Person)obj;
System.out.println(this.name+"...equals.."+p.name);
returnthis.name.equals(p.name) && this.age == p.age;
}
publicString getName()
{
returnname;
}
publicint getAge()
{
returnage;
}
}
|--
TreeSet:
|--TreeSet:底层数据结构是二叉树。
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
public interface Comparable:此接口强行对实现他的每个类的对象进行整体自然排序。
返回:保证元素唯一性的依据是compareTo方法返回0.可以对Set集合中的元素进行自然排序。
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
要放进TreeSet集合中的对象所属的类必须实现Comparable接口,并实现这个接口中的int comparable(T o)方法o为比较的对象。以规定按对象的什么属性排序。
TreeSet集合在往这个集合中添加元素时,会在底层调用comparableTo方法。
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
排序第一种示例:
需求:
往TreeSet集合中存储自定义对象学生。
想按照学生的年龄进行排序。
记住,排序时,当主要条件相同时,一定判断一下次要条件。
*/
class TreeSetDemo
{
publicstatic void main(String[] args)
{
TreeSetts = new TreeSet();
ts.add(newStudent("lisi02",22));
ts.add(newStudent("lisi007",20));
ts.add(newStudent("lisi09",19));
ts.add(newStudent("lisi08",19));
Iteratorit = ts.iterator();
while(it.hasNext())
{
Studentstu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class Student implements Comparable//该接口强制让学生具备比较性。
{
privateString name;
privateint age;
Student(Stringname,int age)
{
this.name= name;
this.age= age;
}
publicint compareTo(Object obj)
{
//return0;
if(!(objinstanceof Student))
thrownew RuntimeException("不是学生对象");
Students = (Student)obj;
System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return1;
if(this.age==s.age)
{
returnthis.name.compareTo(s.name);
}
return-1;
/**/
}
publicString getName()
{
returnname;
}
publicint getAge()
{
returnage;
}
}
排序第二种示例:
import java.util.*;
class Student implements Comparable//该接口强制让学生具备比较性。
{
privateString name;
privateint age;
Student(Stringname,int age)
{
this.name= name;
this.age= age;
}
publicint compareTo(Object obj)
{
//return0;
if(!(objinstanceof Student))
thrownew RuntimeException("不是学生对象");
Students = (Student)obj;
if(this.age>s.age)
return1;
if(this.age==s.age)
{
returnthis.name.compareTo(s.name);
}
return-1;
}
publicString getName()
{
returnname;
}
publicint getAge()
{
returnage;
}
}
class TreeSetDemo2
{
publicstatic void main(String[] args)
{
TreeSetts = new TreeSet(new MyCompare);// 当两种排序都存在时,以比较器为主。//newMyCompare为定义的比较器类。空参数的为compareTo方法比较。
ts.add(newStudent("lisi02",22));
ts.add(newStudent("lisi02",21));
ts.add(newStudent("lisi007",20));
ts.add(newStudent("lisi09",19));
ts.add(newStudent("lisi06",18));
ts.add(newStudent("lisi06",18));
ts.add(newStudent("lisi007",29));
Iteratorit = ts.iterator();
while(it.hasNext())
{
Studentstu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class MyCompare implements Comparator//定义比较器
{
publicint compare(Object o1,Object o2)
{
Students1 = (Student)o1;
Students2 = (Student)o2;
intnum = s1.getName().compareTo(s2.getName());
if(num==0)
{
returnnew Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
/*
if(s1.getAge()>s2.getAge())
return1;
if(s1.getAge()==s2.getAge())
return0;
return-1;
*/
}
returnnum;
}
}
泛型
基本数据类型可以放在add(Object obj)中做参数,因为1.5jdk以后基本数据类型可以自动装箱封装成对象。
泛型:jdk1.5版本出现的新的特性。
用于解决安全问题,是一个安全机制。
因为集合中可以存放许多类型的对象,而这些对象有有不同的方法。
比如:
求字符串的长度,当it.Next()从集合中取出对象时势必要向下转型为在string类型再调用String特有的length()方法求长度,当其中集合中有一个基本数据类型对象被取出再转成String类型时会出现异常,所以演化出来泛型。
泛型:ArrayList<String> al=new ArrayList<String>();定义一个ArrayList容器,容器中的元素为String类型,这样在add()时就有了赛选。
泛型好处:
1、 将运行时期出现问题ClassCastException转移到了编译时期,方便于程序员解决问题。让运行时异常相对减少,安全。
2、 避免了强制转换麻烦。
实例1:
class GenericDemo
{
publicstatic void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("abc01");
al.add("abc0991");
al.add("abc014");
//al.add(4);//al.add(newInteger(4));
Iterator<String> it = al.iterator();
while(it.hasNext())
{
Strings = it.next();
System.out.println(s+":"+s.length());
}
}
}
实例二:
import java.util.*;
class GenericDemo2
{
publicstatic void main(String[] args)
{
TreeSet<String>ts = new TreeSet<String>(new LenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator<String>it = ts.iterator();
while(it.hasNext())
{
Strings = it.next();
System.out.println(s);
}
}
}
class LenComparator implementsComparator<String>//遇上个实力比较的亮点
{
publicint compare(String o1,String o2)
{
intnum = new Integer(o2.length()).compareTo(new Integer(o1.length()));
if(num==0)
returno2.compareTo(o1);
returnnum;
}
}
泛型格式:通过<>来定义要曹祝的应用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中常见,只要在jdk中见到<>就要定义泛型。其实<>就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
泛型类
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型类完成扩展。
例:
class Work{
}
class Student{
}
class Utils<QQ>{
privateQQ q;
publicvoid setObject(QQ q){
this.q=q;
}
public QQgetObject(){
return q;
}
}
class GenericDemo{
publicstatic void main(String[] args){
Utils<Worker>u=new Utils<Worker>();
u.setObject(newWorker());
Workw=u.getObject();
}
}
以上事例是:泛型类定义的泛型在整个类中有效。如果北方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定。
泛型方法
为了让不同方法可以操作不同类型,而且类型还不确定,呢么可以将泛型定义在方法上。
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
泛型定义在方法上时要放在返回值前面,修饰符后面。
示例:
class Demo<t>{
publicvoid show(T t){
System.out.println(“show:”+t);
}
public<Q> void print(Q q){
System.out.println(“print”+9);
}
publicstatic <w> void method(W t){
Systm.put.println(“method:”+t);
}
}
class GenericDemo4{
publicstatic void main(String[] args){
Demo<String>d=new Demo<String>();
d.show(“haha”);
d.print(5);
d.print(“hehe”);
Demo.method(“hahahh”);
}
}
泛型定义在接口上。
interface Inter<T>
{
voidshow(T t);
}
/*//实现方法一:知道操作什么对象
class InterImpl implementsInter<String>
{
publicvoid show(String t)
{
System.out.println("show:"+t);
}
}
*/
//实现方法二:不知道操作什么对象
class InterImpl<T> implementsInter<T>
{
publicvoid show(T t)
{
System.out.println("show:"+t);
}
}
class GenericDemo5
{
publicstatic void main(String[] args)
{
InterImpl<Integer>i = new InterImpl<Integer>();
i.show(4);
//InterImpli = new InterImpl();
//i.show("haha");
}
}
泛型限定
<?>:通配符或占位符。
泛型的限定:
? extends E :为上限定—可以接收E类型或E类型的子类型。
? super E:为下限定——可以接收E类型或E的父类型。
例一:<?>
class GenericDemo{
publicstatic void main(String[] args){
ArrayList<String>al=new ArrayList<String>();
al.add(“abc1”);
al.add(“abc2”);
ArrayList<Integer> al1=new ArrayList<Integer>();
al1.add(4);
al1.add(0);
}
publicstatic void printColl(ArrayList<?> al){// <?>不知道要传入什么类型对象,
//但什么类型都能接收,相当于占着位置
//此处也可写publicstatic <t> void printColl(ArrayList<T> al){
//这样写他可以做到:Tt=it.next();t.toString();而<?>不行。还不能使用类型特有方法。
for(Iterator<?>it=al.iterator();it.HasNext();){
System.out.println(it.next());
}
}
}
例二:只接收父类及其子类
class Person{
Person(Stringname){
this.name=neme;
}
publicSreing getName(){
returnname();
}
}
class Student extends Person{
Student(String name){
super(name);
}
}
class GenericDemo6
{
publicstatic void main(String[] args)
{ArrayList<Person> al = new ArrayList<Person>();
al.add(newPerson("abc1"));
al.add(newPerson("abc2"));
al.add(newPerson("abc3"));
ArrayList<Student> al1 = newArrayList<Student>();
al1.add(newStudent("abc--1"));
al1.add(newStudent("abc--2"));
al1.add(newStudent("abc--3"));
printColl(al1);printColl(al)
}
publicstatic void printColl(Collection<? extends Person> al)
{
Iterator<?extends Person> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
};
Map概述
Map集合:该集合存储键值对,一对一对的存储,而且保证建的唯一性。
1、 添加
a) put(K key,V value);
b) putAll(Map<? extendsK,?extends V> m);
2、 删除
a) clear();
b) remove(Object key);
3、 判断
a) containsValue(Object value);
b) containsKey(Object key);
c) isEmpty();
4、 获取
a) get(Object key);
b) size();
c) values();//获取map集合中所有的值,并返回Collection对象。
d) entrySet();
e) keyset();
Map|--Hashtable
|--HashMap
|--TreeMap
Map子类对象特点
Hashtable:的底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。
HashMap:的底层是哈希表数据结构,允许使用null键null值,该集合是不同步的。jdk1.2开始。效率高。其他功能与Hashtable相同。
TreeMap:底层是二叉树结构,线程不同步,可以用于给Map集合中的键进行排序。
Map的共性方法
可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断。
在添加元素时,如果出现添加相同的键值,那么后添加的值会覆盖原有键值对应的值。
Map-keySet
Set<K> keyset:将Map中所有的键存入到Set集合。因为Set具备迭代器,所以可以迭代方式取出所有的键,再根据get方法获取每一个键对应的值。
示例:
import java.util.*;
publicclassMapDemo2 {
publicstaticvoid main(String[] args) {
Map<String,String>map=newHashMap<String,String>();
map.put("02","zhangsan2");
map.put("3", "zhangsan3");
map.put("01", "zhangsan1");
map.put("04", "zhangsan4");
//先获取map集合的所有键的Set集合,keySet();
Set<String>keySet=map.keySet();
//有了Set集合。就可以获取其迭代器。
Iterator<String>it=keySet.iterator();
while(it.hasNext()){
Stringkey=it.next();
//有了键可以通过map集合的get方法获取其对应的值。
Stringvalue=map.get(key);
System.out.println("key:"+key+",value:"+value);
}
}
}
Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
Map-entrySet
2,Set<Map.Entry<k,v>>entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry
Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。
关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。
示例:
import java.util.*;
publicclassMapDemo2 {
publicstaticvoid main(String[] args) {
Map<String,String>map=newHashMap<String,String>();
map.put("02","zhangsan2");
map.put("3", "zhangsan3");
map.put("01", "zhangsan1");
map.put("04", "zhangsan4");
//将Map集合中的映射关系取出。存入到Set集合中。
Set<Map.Entry<String,String>> entrySet=map.entrySet();
Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while(it.hasNext()){
Map.Entry<String,String> me=it.next();
Stringkey=me.getKey();
Stringvalue=me.getValue();
System.out.println("key:"+key+",value"+value);
}
}
}
注意:一般和Hash…(哈希表)有关的集合在其存放的对象的类里一般要覆写hashCode和equals方法。
一般和Tree…(二叉树)有关的集合,在其存放的对象的类里一般要继承Comparable并覆写compareTo方法。或写个比较,在用到时,创建集合对象时传入构造方法中。
扩展题:
捷答一:
/*
map扩展知识。
map集合被使用是因为具备映射关系。
"yureban" Student("01" "zhangsan");
"yureban"Student("02" "lisi");
"jiuyeban""01" "wangwu";
"jiuyeban""02" "zhaoliu";
一个学校有多个教室。每一个教室都有名称。
*/
import java.util.*;
class MapDemo31
{
publicstaticvoid main(String[] args)
{
HashMap<String,HashMap<String,String>>czbk = newHashMap<String,HashMap<String,String>>();
HashMap<String,String>yure = newHashMap<String,String>();
HashMap<String,String>jiuye = newHashMap<String,String>();
czbk.put("yureban",yure);
czbk.put("jiuyeban",jiuye);
yure.put("01","zhagnsan");
yure.put("02","lisi");
jiuye.put("01","zhaoliu");
jiuye.put("02","wangwu");
//遍历czbk集合。获取所有的教室。
Iterator<String>it = czbk.keySet().iterator();
while(it.hasNext())
{
StringroomName = it.next();
HashMap<String,String>room = czbk.get(roomName);
System.out.println(roomName);
getStudentInfo(room);
}
getStudentInfo(jiuye);
getStudentInfo(yure);
}
publicstaticvoidgetStudentInfo(HashMap<String,String> roomMap)
{
Iterator<String>it = roomMap.keySet().iterator();
while(it.hasNext())
{
Stringid = it.next();
Stringname = roomMap.get(id);
System.out.println(id+":"+name);
}
}
}
解答二:
import java.util.*;
class Student1{
private String id;
private String name;
Student1(Stringid,String name){
this.name=name;
this.id=id;
}
public String toString(){
returnid+"...."+name;
}
}
publicclassMapDemo3 {
publicstaticvoid demo() {
HashMap<String,List<Student1>>czbk=newHashMap<String,List<Student1>>();
List<Student1>reyu=newArrayList<Student1>();
List<Student1>jiuye=newArrayList<Student1>();
czbk.put("yureban",reyu);
czbk.put("jiuyeban",jiuye);
reyu.add(new Student1("01","zhangsan"));
reyu.add(new Student1("02","lisi"));
jiuye.add(new Student1("01","zhaoliu"));
jiuye.add(new Student1("02","wangwu"));
Iterator<String>it=czbk.keySet().iterator();
while(it.hasNext()){
StringroomName=it.next();
List<Student1>room=czbk.get(roomName);
getInfos(room);
}
}
privatestaticvoidgetInfos(List<Student1> room) {
Iterator<Student1>it=room.iterator();
while(it.hasNext()){
Student1s=it.next();
System.out.println(s);//此处打印student的对象,打印的是对象的地址,因为打印地址要调用toString方法,所以上面覆写了toString这里写s与写s.toString 一样。
}
}
publicstaticvoid main(String args[]){
demo();
}
}
什么时候用Map集合呢?
当数据之间存在着映射关系时就要先想Map集合。
Map集合被使用是因为其具备映射关系。
------- android培训、java培训、期待与您交流! ----------详细请查看:http://edu.csdn.net