第十四天总结:
1.泛型
ClassCastException类型转换异常
泛型是自JDK1.5之后为了解决安全问题推出的新机制
好处:
a把运行时候出现的ClassCastException问题转移到了编译时期,那么问题就不会暴露在运行端口了。
b避免了类型强制转换的麻烦
泛型的表现形式:
ArrayList<T> al=new ArrayList<T>();//T指定了存元素的类型
在API中,所有带有<>的类或者方法都需要用到泛型
泛型类:
可以将要操作的引用类型作为参数传递到<>当中,类名后
当类中药操作的引用数据类型不确定的时候,使用泛型类
泛型方法:
当方法错做的引用卡类型不确定,而且每一个方法错做的类型有可能不一致,那么我们把<>转移到函数的返回值类型的前面,泛型方法通常使用在静态函数上
如果方法是静态的,那么就不需要创建对象就能运行静态方法,所以此时就不能用泛型类,而是在静态方法的返回值类型前加泛型
在new对象的时候,等号两边的泛型所指定的类型必须是一致的
在API中,比如TreeSet的构造方法中,可以对类型参数传递进行一个范围的控制,? extends E就表示传递的要么是E类型的对象,或者E类型的子类对象,限定了上限,还有一种? super E这
个表示传递的要么是E类型的对象,或者是E类型的父类对象,限定了下限。
2.Map集合
Map<k,v>
Map采用了是键值对的存储方式,其中K表示键的类型,V代表值的类型。这个集合中的的键和值是一一对应的映射关系,并且键是唯一的,他不具备迭代方法
Map有两个常用的集合类,一个HashMap,一个是TreeMap
HashMap:线程是不安全的,替换了Hashtable,可以存入空键和空值,
Hashtable:线程是安全的,效率比较低,不可以存入空键和空值
TreeMap:线程不安全,可以对键排序
Map集合的取元素方法:
原理:通过将Map的方法,将Map集合转换成Set集合,在通过Set集合中的迭代器对元素进行取出
keySet()方法返回值类型是set,是把所有的键提取出来存放到set集合当中。而set集合是可以用迭代的
get(key)方法是通过键获得值
entrySet()返回的是一个实体,返回的是Map集合中的键值对的关系给取出来了,存放在Set集合当中,他取出的对象类型是Map.Entry<K,V>类型,这是个静态内部接口
values()方法是获取Map中的值存到Colletction集合当中
/*
演示Map集合的一般方法和取元素方式
*/
import java.util.*;
class test4
{
public static void main(String[] args)
{
HashMap<Student,String> hm=new HashMap<Student,String>();
hm.put(new Student("张三",30),"北京");
hm.put(new Student("李四",24),"上海");
hm.put(new Student("王五",22),"西安");
hm.put(new Student("赵六",28),"南京");
hm.put(new Student("周七",22),"北京");
hm.put(new Student("张三",20),"北京");
hm.put(new Student("张三",30),"北京");
//取出Map集合中的元素的三种方式
//方式1,利用keySet方法取出键
Set<Student> s=hm.keySet();
for (Iterator<Student> it=s.iterator();it.hasNext();)
{
Student stu=it.next();
String adr=hm.get(stu);
System.out.println(stu.getName()+"//"+stu.getAge()+"///"+adr);
}
//方式2,利用entrySet方法取键和值的关系
Set<Map.Entry<Student,String>> s1=hm.entrySet();
for (Iterator<Map.Entry<Student,String>> it=s1.iterator();it.hasNext() ; )
{
//获得键值关系的对象
Map.Entry<Student,String> me=it.next();
//下面是Map.Entry这个静态内部接口中的取键和取值方法
Student stu1=me.getKey();
String adr1=me.getValue();
System.out.println(stu1.getName()+"------"+stu1.getAge()+"-------"+adr1);
}
//方式3,通过values方法获取值
Collection<String> coll=hm.values();
for (Iterator<String> it=coll.iterator();it.hasNext() ; )
{
System.out.println("地址:"+it.next());
}
}
}
class Student
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int hashCode()
{
return name.hashCode()+age*38;
}
public boolean equals(Object o)
{
Student s=(Student)o;
return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}