Java集合框架 Map和泛型
http://www.zftb.cn  发布时间:2015-04-05 12:48 来源:一起学编程网 浏览:加载中

 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 =keyset.iterator();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 =entry.iterator();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 = keyset.iterator();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 =entryset.iterator();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 = al.iterator();

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 = ts.iterator();

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()).compareTo(new Integer(s2.length()));

if(num==0)

return s1.compareTo(s2);

return num;

*/

//降序

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

if(num==0)

return s2.compareTo(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);

d.method("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 = arr1.iterator();

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 = ts.iterator();

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 = wo.iterator();

while(it1.hasNext()){

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

}

}

}

/*

//学生比较器

class StudentComp implements Comparator<Student>{

public int compare(Student s1,Student s2){

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

}

}

//工人比较器

class WorkerComp implements Comparator<Worker>{

public int compare(Worker s1,Worker s2){

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

}

}

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

*/

class Comp implements Comparator<Person>{

public int compare(Person s1,Person s2){

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

return s2.getName().compareTo(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

*/

 

如果你有好的win10资讯或者win10教程,以及win10相关的问题想要获得win10系统下载的关注与报道。
欢迎加入发送邮件到657025171#qq.com(#替换为@)。期待你的好消息!