Java集合框架Map和泛型

   Map集合

  1.特点:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

  2.常用方法:

  1.添加:v put(k key , v value); 将数据以键值对的方式存进集合中。

  void putAll(Map<? extends k,? extends v> m) ;从指定映射中将所有映射关系复制到此映射中

  2.删除:void clear(); 清空集合

  v remove(Object key); 将集合中的元素以键的形式移除。

  3.判断:containsKey(Object key) 判断集合中是否有key。如果有,则返回true。

  contaninValue(Object value) 判断集合中是否有value

  4.查询:get(Object key);

  size();

  values();

  entrySet();

  keySet();

  Map有三个常见子类:

  |—Hashtable:此类实现一个哈希表,该哈希表将映射到相应的值。任何非null对象都可以用作键或值。该集合是线程同步的。 Jdk1.0 效率低

  |–HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。 Jdk1.2 效率高

  |–TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

  和Set很像。

  其实Set底层就是使用了Map集合。

  注:如果添加相同的键,那么后添加的值会覆盖原来键对应值。

  map集合的两种取出方式:

  1.keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所以可以用迭代的方式取出所有的键,在根据get方法。获取每一个键对应的值。

  Map集合的取出原理:将map集合转成set集合。再通过迭代器取出。

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

  Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。

   为何要定义在其内部呢?

    原因:

  a.Map集合中存的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。

  b.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。

  

  package Collection;

  import java.util.HashMap;

  import java.util.Iterator;

  import java.util.Set;

  import java.util.Map.Entry;

  public class HashMapDemo {

  /**

  * @param args

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  entrySetMethod();

  }

  //利用keySet这个方法取出map集合中的值。

  public static void keySetMethod(){

  //创建一个HashMap集合,并添加了泛型。键值都是String类型的。

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

  hm.put(“01″,”zhangsan01”);

  hm.put(“02″,”zhangsan02”);

  hm.put(“03″,”zhangsan03”);

  hm.put(“04″,”zhangsan04”);

  Set<String> keyset = hm.keySet();

  for(Iterator<String> it =erator();it.hasNext();){

  String key =it.next();

  String value = hm.get(key);

  System.out.println(“key: “+key+” “+”value:”+value);

  }

  }

  public static void entrySetMethod(){

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

  hm.put(“01″,”zhangsan01”);

  hm.put(“02″,”zhangsan02”);

  hm.put(“03″,”zhangsan03”);

  hm.put(“04″,”zhangsan04”);

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

  for(Iterator<Entry<String, String>> it =erator();it.hasNext();){

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

  System.out.println(en.getKey()+” “+en.getValue());

  }

  }

  }

    Map练习

  1.描述学生。

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

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

  

  package Collection;

  import java.util.HashMap;

  import java.util.Iterator;

  import java.util.Map;

  import java.util.Set;

  public class MapTest {

  /**

  * @param args

  */

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  entrySet();

  }

  //第一种取出方式keySet();

  public static void keySet(){

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

  hm.put(new Students(“lisi1”,21), “beijing”);

  hm.put(new Students(“lisi1”,21), “tianjing”);

  hm.put(new Students(“lisi4”,33), “nanjing”);

  hm.put(new Students(“lisi8”,44), “ganzhou”);

  hm.put(new Students(“lisi5”,80), “hengyang”);

  Set<Students> keyset =hm.keySet();

  for(Iterator<Students> it = erator();it.hasNext();){

  Students key =it.next();

  String addrv =hm.get(key);

  System.out.println(key+”:::”+addrv);

  }

  }

  public static void entrySet(){

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

  hm.put(new Students(“lisi1”,21), “beijing”);

  hm.put(new Students(“lisi1”,21), “tianjing”);

  hm.put(new Students(“lisi4”,33), “nanjing”);

  hm.put(new Students(“lisi8”,44), “ganzhou”);

  hm.put(new Students(“lisi5”,80), “hengyang”);

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

  for(Iterator<Map.Entry<Students, String>> it =erator();it.hasNext();){

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

  Students s = entry.getKey();

  String addr = entry.getValue();

  System.out.println(s+”:::”+addr);

  }

  }

  }

    泛型

    泛型概述

  在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

  类的后面跟着<E>这样的标识,如ArrayList<E>,这个<E>就代表泛型,E就是泛型类型,表示ArrayList集合里面只能存储E类型的元素。

  其本质就是实现参数化类型,也就是说所操作的数据类型被指定为一种类型。

  好处:

  1、将运行时期出现的问题ClassCastException转移到了编译时期,方便程序员解决,让运行时期问题减少。

  2、避免了强制转换麻烦。

  示例

  

  import java.util.*;

  class GenericDemo{

  public static void main(String[] args){

  //定义了一个String类型的数组列表

  ArrayList<String> al = new ArrayList<String>();

  al.add(“abc002”);

  al.add(“abc013”);

  al.add(“abc256”);

  al.add(“abc028”);

  //al.add(4);//al.add(new Integer(5));

  //迭代器要使用泛型

  Iterator<String> it = erator();

  while(it.hasNext()){

  String s = it.next();

  System.out.println(s);

  }

  }

  }

  /*

  结果

  abc002

  abc013

  abc256

  abc028

  */

   泛型使用

  泛型格式:通过<>来定义要操作的引用数据类型。

  在使用java提供的对象时,什么时候使用泛型呢?

  通常在集合框架中创建,只要见到<>就要定义泛型。

  其实<>就是用来接收类型的,当使用集合时,

  将集合中要存储的数据类型作为参数传递到<>中即可。

  示例

  

  import java.util.*;

  class TreeSetTest{

  public static void main(String[] args){

  TreeSet<String> ts = new TreeSet<String>(new LenComparator());

  ts.add(“abcd”);

  ts.add(“cc”);

  ts.add(“cba”);

  ts.add(“z”);

  ts.add(“a”);

  ts.add(“sdcvrt”);

  Iterator<String> it = erator();

  while(it.hasNext()){

  String s = it.next();

  System.out.println(s);

  }

  }

  }

  //自定义比较器,实现Comparator接口并使用泛型

  class LenComparator implements Comparator<String> {

  public int compare(String s1,String s2){

  /*

  //升序

  int num = new Integer(s1.length()pareTo(new Integer(s2.length()));

  if(num==0)

  return pareTo(s2);

  return num;

  */

  //降序

  int num = new Integer(s2.length()pareTo(new Integer(s1.length()));

  if(num==0)

  return pareTo(s1);

  return num;

  }

  }

  /*

  结果

  sdcvrt

  abcd

  cba

  cc

  z

  a

  */

  泛型类

  什么时候定义泛型类?

  当类中要操作的引用数据类型不确定的时候,

  早期定义Object来完成扩展。

  现在定义泛型来扩展。

  

  class Worker{}

  class Student{}

  //泛型以前的做法

  class Tool{

  private Object obj;

  public void setObject(Object obj){

  this.obj = obj;

  }

  public Object getObject(){

  return obj;

  }

  }

  //泛型类

  class Utils<QQ>{

  private QQ q;

  public void setObject(QQ q){

  this.q = q;

  }

  public QQ getObject(){

  return q;

  }

  }

  class GenericDemo{

  public static void main(String[] args){

  Utils<Worker> u = new Utils<Worker>();

  u.setObject(new Worker());

  Worker w = u.getObject();

  /*

  Tool t = new Tool();

  t.setObject(new Worker());

  Worker w = (Worker)t.getObject();

  */

  }

  }

  泛型方法

  为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将

  泛型定义在方法上。

  

  class Demo{

  //类型定义在方法上

  public <T> void show(T t){

  System.out.println(“show:”+t);

  }

  public <Q> void print(Q q){

  System.out.println(“print:”+q);

  }

  }

  class GenericDemo{

  public static void main(String[] args){

  Demo d = new Demo();

  d.show(5);

  d.show(new Integer(5));

  d.show(“haha”);

  d.print(8);

  d.print(new Integer(5));

  d.print(“heihei”);

  }

  }

  /*

  结果

  show:5

  show:5

  show:haha

  print:8

  print:5

  print:heihei

  */

  静态方法泛型

  特殊之处:

  静态方法不可以访问类上定义的泛型。

  如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。

  

  class Demo<T>{

  //show()方法的类型由类的类型决定

  public void show(T t){

  System.out.println(“show:”+t);

  }

  //print()方法的类型由自己决定

  public <Q> void print(Q q){

  System.out.println(“print:”+q);

  }

  //静态方法泛型

  public static <W> void method(W w){

  System.out.println(“methld:”+w);

  }

  }

  class GenericDemo{

  public static void main(String[] args){

  Demo<String> d = new Demo<String>();

  d.print(8);

  d.print(new Integer(5));

  d.print(“heihei”);

  d.show(“haha”);

  //d.show(5);

  thod(“Hello”);

  }

  }

  /*

  结果

  print:8

  print:5

  print:heihei

  show:haha

  methld:Hello

  */

  泛型限定

  上限:<? extends E> 可以接受E类型或者E的子类型。

  下限:<? super E> 可以接收E类型或者E的父类型。

  import java.util.*;

  class Person{

  private String name;

  Person(String name){

  this.name=name;

  }

  public String getName(){

  return name;

  }

  }

  class Student extends Person{

  Student(String name){

  super(name);

  }

  }

  class GenericDemo{

  public static void main(String[] args){

  ArrayList<Person> arr1 = new ArrayList<Person>();

  arr1.add(new Person(“Person01”));

  arr1.add(new Person(“Person02”));

  arr1.add(new Person(“Person03”));

  ArrayList<Student> arr2 = new ArrayList<Student>();

  arr2.add(new Student(“Student01”));

  arr2.add(new Student(“Student02”));

  arr2.add(new Student(“Student03”));

  printColl(arr2);

  }

  public static void printColl(ArrayList<? extends Person> arr1){

  //泛型限定在Person或者Person的子类,就是继承Person类

  Iterator<? extends Person> it = erator();

  while(it.hasNext()){

  System.out.println(it.next().getName());

  }

  }

  }

  /*

  结果

  Student01

  Student02

  Student03

  */

  泛型扩展

  泛型限定是用于泛型扩展用的。

  

  import java.util.*;

  class GenericDemo{

  public static void main(String[] args){

  //指定为Student类型,传递一个比较器

  TreeSet<Student> ts = new TreeSet<Student>(new Comp());

  ts.add(new Student(“Student01”));

  ts.add(new Student(“Student05”));

  ts.add(new Student(“Student09”));

  ts.add(new Student(“Student08”));

  Iterator<Student> it = erator();

  while(it.hasNext()){

  System.out.println(it.next().getName());

  }

  //指定为Worker类型,传递一个比较器

  TreeSet<Worker> wo = new TreeSet<Worker>(new Comp());

  wo.add(new Worker(“Worker01”));

  wo.add(new Worker(“Worker05”));

  wo.add(new Worker(“Worker09”));

  wo.add(new Worker(“Worker08”));

  wo.add(new Worker(“Worker07”));

  Iterator<Worker> it1 = erator();

  while(it1.hasNext()){

  System.out.println(it1.next().getName());

  }

  }

  }

  /*

  //学生比较器

  class StudentComp implements Comparator<Student>{

  public int compare(Student s1,Student s2){

  return s1.getName(pareTo(s2.getName());

  }

  }

  //工人比较器

  class WorkerComp implements Comparator<Worker>{

  public int compare(Worker s1,Worker s2){

  return s1.getName(pareTo(s2.getName());

  }

  }

  //对上面两个比较器进行优化如下,指定为父类型Person

  */

  class Comp implements Comparator<Person>{

  public int compare(Person s1,Person s2){

  //return s1.getName(pareTo(s2.getName());//正序打印

  return s2.getName(pareTo(s1.getName());//倒序打印

  }

  }

  class Person{

  private String name;

  Person(String name){

  this.name = name;

  }

  public String getName(){

  return name;

  }

  public String toString(){

  return “person:”+name;

  }

  }

  class Student extends Person{

  Student(String name){

  super(name);

  }

  }

  class Worker extends Person{

  Worker(String name){

  super(name);

  }

  }

  /*

  结果

  Student09

  Student08

  Student05

  Student01

  Worker09

  Worker08

  Worker07

  Worker05

  Worker01

  */

没有绝望的处境,只有对处境绝望的人。

Java集合框架Map和泛型

相关文章:

你感兴趣的文章:

标签云: