------- android培训、java培训、期待与您交流! ----------
泛型
JDK1.5后出现的新特性,用于解决安全问题,是一个安全机制。在集合中常见,见到<>就要定义泛型,<>就是用来接收类型的。
格式:通过<>来定义要操作的引用数据类型。
如:ArrayList<String> al=new ArrayList<String>();
好处:1,将运行时出现的问题ClassCastException转移到编译时期,方便程序员解决问题,让运行事情问题减少,安全。
2,避免了强制转换的麻烦。
定义泛型的情况:当类中要操作的引用数据类型不确定时。泛型可以定义在类上,也可以定义在方法上。
早期定义Object来完成扩展。现在定义泛型来完成扩展。
演示:
class GenericTest
{
public static void main(String[] args)
{
//ArrayList a1=new ArrayList();
ArrayList<String> a1=new ArrayList<String>();//加泛型后,没有了编译时出现的安全提示
a1.add("abc001");
a1.add("abc021");
a1.add("abc301");
//a1.add(4);//如果不加泛型,异常不会出现在编译时期
Iterator<String> it=a1.iterator();
while(it.hasNext())
{
String s =it.next();//加泛型后避免了强制转换
System.out.println(s+":"s.length());
}
}
}
泛型限定
对于一个范围内的一类事物,可以通过泛型限定的方式定义,有两种方式:
1,? extends E:可接收E类型或E类型的子类型;称之为上限。
如:ArrayList<? extends Number>x = new ArrayList<Integer>();
2,? super E:可接收E类型或E类型的父类型;称之为下限。
Map集合
特点:该集合存储键值对,而且保证键的唯一性。一个映射不能包含重复的键,每个键最多只能映射到一个值。
Map集合共性方法:
1、添加
put(K key,V value);//添加元素。
voidputAll(Map <? extends K,? extends V> m);//添加一个集合
2、删除
clear();//清空
Vremove(Object key);//删除指定键值对
3、判断
containsKey(Objectkey);:判断键是否存在
containsValue(Objectvalue):判断值是否存在
isEmpty();:判断是否为空
4、获取
Vget(Object key);:通过键获取对应的值
size();:获取集合的长度
value();:获取Map集合中所以得值,返回一个Collection集合
entrySet();:
将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry
keySet();:
将map中所有的键存入到set集合。因为set具备迭代器。所以可以通过迭代方式取出所以键的值,再通过get方法。获取每一个键对应的值。
Map集合的子类
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。
|--HashMap:底层是哈希表数据结构。允许使用null键null值,该集合是不同步的。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。
map集合的取出原理:将map集合转成set集合,再通过迭代器取出。
结合两种取出方式练习:
/*
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。
思路:1、描述学生类
2、定义一个Map集合,存储学生对象和地址值
3、获取Map中的元素
*/
import java.util.*;
//描述学生类
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age) //构造函数
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
//覆盖hashCode
public int hashCode()
{
return name.hashCode()+age*34;
}
//复写equals,比较对象内容
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
//复写compareTo,以年龄为主
public int compareTo(Student c)
{
int num=new Integer(this.age).compareTo(new Integer(c.age));
if(num==0)
{
return this.name.compareTo(c.name);
}
return num;
}
//复写toString,自定义输出内容
public String toString()
{
return name+"..."+age;
}
}
class HashMapTest
{
public static void main(String[] args)
{
HashMap<Student,String > hm=new HashMap<Student,String >();
hm.put(new Student("stylekai",25),"shanghai");
hm.put(new Student("mango",23),"shenzhen");
hm.put(new Student("joseph",22),"guangzhou");
hm.put(new Student("melon",24),"beijing");
keyset(hm);
}
public static void keyset(HashMap<Student,String> hm)
{
Iterator<Student> it=hm.keySet().iterator(); //keySet取出方式
while(it.hasNext())
{
Student s=it.next();
String addr=hm.get(s);
System.out.println(s+":"+addr);
}
}
}
需求:对学生对象的年龄进行升序排序
因为数据是以键值对形式存在的,所以要使用可以排序的Map集合:TreeMap。
//编译时要先编译上例中的Student类。
import java.util.*;
class TreeMapTest
{
public static void main(String[] args)
{
TreeMap<Student,String> tm=new TreeMap<Student,String>();
tm.put(new Student("stylekai",25),"shanghai");
tm.put(new Student("mango",23),"shenzhen");
tm.put(new Student("joseph",22),"guangzhou");
tm.put(new Student("melon",24),"beijing");
//entrySet取出方式
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();
Student stu=me.getKey();
String addr=me.getValue();
System.out.println(stu+"==="addr);
}
}
}