黑马程序员_集合框架2

时间:2023-02-18 20:48:25

------- android培训java培训、期待与您交流! ---------- 

 

Map集合

1.Map子类对象的特点:

|--HashTable:顶层是哈希表数据结构,是线程同步的,不可以存储null键,null

|--HashMap:底层是哈希表数据结构,是线程不同步的,可以存储null键,null

|--TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序

2.MapSet很像,Set底层就是使用了Map集合。

3.Map集合和Collection集合的不同之处:

Collection一次存入一个元素,Map一次存入一对元素

Collection是单列集合,Map是双列集合

Map中数据之间存在映射关系

Map中常用方法:

1.添加

putkeyvalue):当存储的键相同时,新值会替换老值,并将老值返回,如果见没有重复,返回null

void putAllMap):一次性添加多对元素

2.删除

void clear():清空集合

value removekey):删除指定键

3.判断

boolean isEmpty():集合是否为空

boolean containsKeykey):是否包含指定键

boolean containsValuevalue):是否包含指定值

4.取出

int size():返回集合的长度

value getkey):通过指定键获取对应的值,通过返回null来判断

Collection values():获取map集合中的所有值

map集合的两种取出方式:

1Set<k>keySet:将map中所有的键存入到Set集合。因为set具备迭代器。

       所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。

importjava.util.*;

class MapDemo1

{

       publicstatic void main(String[] args)

       {

              Map<String,String>map = new HashMap<String,String>();

              map.put("01","lisi");

              map.put("02","wangwu");

              map.put("03","zhangsan");

              map.put("04","zhaoliu");

Set<String> keySet = map.keySet();//map集合中的键都取出存放在set

Iterator<String> it = keySet.iterator();//获取迭代器,迭代set集合

while(it.hasNext())

{

              String key =it.next();//用迭代的方式取出所有的键

              String value  = map.get(key);//根据get方法,获取每一个键对应的值

              System.out.println("key:"+key+",value:"+value);

}

}

}

2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry

Entry其实就是Map中的一个static内部接口。

--->为什么要定义在内部呢?

因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。

importjava.util.*;

class MapDemo2

{

       publicstatic void main(String[] args)

       {

              Map<String,String>map = new HashMap<String,String>();

              map.put("1","zhangsan1");

              map.put("2","zhangsan2");

              map.put("3","zhangsan3");

             

              //通过entrySet方法获得map集合中的映射关系,并存入到set集合中

Set<Map.Entry<String,String>>entrySet = map.entrySet();

//获取迭代器,迭代set集合

              Iterator<Map.Entry<String,String>>it = entrySet.iterator();

              while(it.hasNext())

              {

                     //用迭代的方式取出每一对映射的关系,存入到mapentry

Map.Entry<String,String>me = it.next();

                     Stringkey = me.getKey();//通过getKey方法获取键

                     Stringvalue = me.getValue();//通过getValue方法获取值

                     System.out.println(key+":"+value);

              }

       }

}

补充知识点:HashMapTreeMap存取数据的原理:

HashMap:存储一个键值对的时候,先会调用键对象的hashCode()方法得到哈希值,然后在集合中查找是否有哈希值相同的键对象。如果没有哈希值相同的键对象,直接将键值对存入。如果有哈希值相同的键对象,逐个和这些键对象进行equals()方法比较,比较的结果为false就将键值对存入;比较的结果为true,则用新的值覆盖原有值。

TreeMap:在存储键值对的时候,会调用键对象的compareTo()方法和集合中其他的键对象进行比较,根据比较结果以二叉树形式存储。如果TreeMap创建的时候在构造函数中传入了比较器(有时可以用匿名内部类的形式)的话,那么在比较的时候以比较器为主。这里我们需要清楚的知道的就是:存储自定义的对象的时候,我们可以用自然顺序的方式,还可以用比较器的方式:

自然顺序:让自定义的类实现Comparable接口,重写ComparaTo()方法。

比较器:写一个类然后让其实现Comaparator接口,然后重写Compare()方法。

小总结:

Array就是数组结构,有角标,查询速度很快

Link就是链表结构,增删速度快,而且有特有方法,addFirst(),addLast()。removeFirst(),removeLast(),getFirst(),getLast();

hash就是哈希表,就要想到唯一,就要想到存入的元素必须覆盖hashCodeequals方法

Tree就要想到二叉树,要想到比较:

比较的两种方式:

一个是Comparable:覆盖CompareTo方法

一个是Comparator:覆盖Compare方法

集合的使用规则:

当存储的是一个元素的时候就用Collection,当存储的对象之间存在映射关系时,就使用Map集合

保证唯一,就用Set。不保证唯一,就用List

HashMap练习:

 需求:每一个学生都有一个归属地,学生Student,地址String,学生属性:

姓名,年龄

注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。

步骤:1.描述学生。

     2.定义map容器,将学生作为键,地址作为值传入。

     3.获取map集合中的元素。

相关代码如下:

 

importjava.util.*;

class Student implements Comparable<Student>

{

       privateString name;

       privateint age;

       Student(Stringname,int age)

       {

              this.name= name;

              this.age= age;

       }

      

       public intcompareTo(Student s)

       {

              intnum = new Integer(this.age).compareTo(new Integer(s.age));

              if(num==0)

                     returnthis.name.compareTo(s.name);

              returnnum;

       }

       public inthashCode()

       {

              returnname.hashCode()+age*34;

       }

       publicboolean equals(Object obj)

       {

              if(!(objinstanceof Student))

                     thrownew ClassCastException("类型不匹配");

              Students = (Student)obj;

              returnthis.name.equals(s.name) && this.age==s.age;

       }

       publicString getName()

       {

              returnname;

       }

       public intgetAge()

       {

              returnage;

       }

       publicString toString()

       {

              returnname+":"+age;

       }

}

class HashMapTest

{

       publicstatic void main(String[] args)

       {

              HashMap<Student,String>hm = new HashMap<Student,String>();

              hm.put(newStudent("zhangsan",12),"北京");

              hm.put(newStudent("lisi",24),"上海");

              hm.put(newStudent("lisi",24),"青岛");

              hm.put(newStudent("wangwu",34),"北京");

              //第一种取出方式 keySet

              Set<Student>keySet = hm.keySet();

              Iterator<Student>it = keySet.iterator();

              while(it.hasNext())

              {

                     Studentstu = it.next();

                     Stringaddr = hm.get(stu);

                     System.out.println(stu+".."+addr);

              }

              //第二种取出方式 entrySet

              Set<Map.Entry<Student,String>>entrySet = hm.entrySet();

              Iterator<Map.Entry<Student,String>>iter = entrySet.iterator();

             

              while(iter.hasNext())

              {

                     Map.Entry<Student,String>me = iter.next();

                     Studentstu = me.getKey();

                     Stringaddr = me.getValue();

                     System.out.println(stu+"........."+addr);

              }

       }

}

TreeMap练习:

需求:对学生对象的年龄进行升序排序:

importjava.util.*;

class Student implements Comparable<Student>

{

       privateString name;

       privateint age;

       Student(Stringname,int age)

       {

              this.name= name;

              this.age= age;

       }

       public intcompareTo(Student s)

       {

              intnum = new Integer(this.age).compareTo(new Integer(s.age));

              if(num==0)

                     returnthis.name.compareTo(s.name);

              returnnum;

       }

       public inthashCode()

       {

              returnname.hashCode()+age*34;

       }

       publicboolean equals(Object obj)

       {

              if(!(objinstanceof Student))

                     thrownew ClassCastException("类型不匹配");

              Students = (Student)obj;

              returnthis.name.equals(s.name) && this.age==s.age;

       }

       publicString getName()

       {

              returnname;

       }

       public intgetAge()

       {

              returnage;

       }

       publicString toString()

       {

              returnname+":"+age;

       }

}

 

class StuNameComparator implementsComparator<Student>

{

       public intcompare(Student s1,Student s2)

       {

              intnum = s1.getName().compareTo(s2.getName());

              if(num==0)

                     returnnewInteger(s1.getAge()).compareTo(newInteger(s2.getAge()));

 

              returnnum;

       }

}

class TreeMapTest

{

       publicstatic void main(String[] args)

       {

              TreeMap<Student,String>tm = new TreeMap<Student,String>(new StuNameComparator());

              tm.put(newStudent("zhangsan",12),"北京");

              tm.put(newStudent("lisi",24),"上海");

              tm.put(newStudent("lisi",24),"青岛");

              tm.put(newStudent("wangwu",34),"北京");

              Set<Map.Entry<Student,String>>entrySet = tm.entrySet();

              Iterator<Map.Entry<Student,String>>it = entrySet.iterator();

              while(it.hasNext())

              {

                     Map.Entry<Student,String>me = it.next();

                     Studentstu = me.getKey();

                     Stringaddr = me.getValue();

                     System.out.println(stu+":::"+addr);

              }

       }

}

------- android培训java培训、期待与您交流! ----------