------- android培训、java培训、期待与您交流! ----------
泛型
1.JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
2.好处
(1)将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。提高了程序的安全性,将运行期遇到的问题转移到了编译期。
(2)避免了强制转换麻烦,优化了程序设计。
3.泛型格式:通过<>来定义要操作的引用数据类型。
4.什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
5.泛型在类上定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
6.为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
7.特殊之处:
静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
8.什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。
9.泛型中“?”代表通配符。也可以理解为占位符。
10.泛型的限定;
上限:?extends E可以接收E类型或者E的子类型。
下限:?super E可以接收E类型或者E的父类型。
示例
泛型定义在类上
classUtils<QQ>
{
private QQ q;
public void setObject(QQ q)
{
this.q = q;
}
public QQ getObject()
{
return q;
}
}
泛型定义在方法上
classDemo<T>
{
public void show(T t)
{
System.out.println("show:"+t);
}
public static <W> void method(W t)//静态方法
{
System.out.println("method:"+t);
}
}
泛型定义在接口上
interfaceInter<T>
{
void show(T t);
}
classInterImpl<T> implements Inter<T>
{
public void show(T t)
{
System.out.println("show:"+t);
}
}
Map集合
1. Map与Collection在集合框架中属并列存在。该集合存储键值对。一对一对往里存。而且要保证键的唯一性。Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素。
2.Map集合常用的类Hashtable,HashMapTreeMap。
(1)Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
(2)HashMap:底层是哈希表数据结构,允许使用 null值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
(3)TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
3.Map集合常用的方法
(1)添加
put(K key, V value)
putAll(Map<? extends K,?extends V> m)
(2)删除
clear()移除所有映射关系
remove(Object key)
(3)判断。
containsValue(Object value)
containsKey(Object key)
isEmpty()是否包含包含键-值映射关系。
(4)获取
get(Object key)
size()
values()
entrySet()返回此映射中包含的映射关系的Set视图。
keySet()返回此映射中包含的键的Set视图。
4.Map和Set很像。Set底层就是使用了Map集合。
5.map集合的两种取出方式:
(1)Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
(2)Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry,Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。
6.map集合被使用是因为具备映射关系。
示例:学生Student,地址String。学生属性:姓名,年龄。每一个学生都有对应的归属地。注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
(1)描述学生。
(2)定义map容器。将学生作为键,地址作为值。存入。
(3)获取map集合中的元素。
importjava.util.Comparator;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
importjava.util.TreeMap;
classStudent implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Student s)
{
int num = new Integer(this.age).compareTo(newInteger(s.age));
if(num==0)
returnthis.name.compareTo(s.name);
return num;
}
public int hashCode()
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw newClassCastException("类型不匹配");
Student s = (Student)obj;
return this.name.equals(s.name)&& this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}
classStuNameComparator implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
int num =s1.getName().compareTo(s2.getName());
if(num==0)
return newInteger(s1.getAge()).compareTo(new Integer(s2.getAge()));
return num;
}
}
class StudentDemo
{
public static void main(String[] args)
{
TreeMap<Student,String> tm = newTreeMap<Student,String>(new StuNameComparator());
tm.put(newStudent("bcdi3",23),"nanjing");
tm.put(newStudent("lisi1",21),"beijing");
tm.put(newStudent("aloi4",24),"wuhan");
tm.put(new Student("lisi1",21),"tianjin");
tm.put(newStudent("des2",22),"shanghai");
/*Set<Map.Entry<Student,String>>entrySet = tm.entrySet();//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);
}*/
Set<Student> keySet =tm.keySet();//keyset()取出方式
Iterator<Student> it =keySet.iterator();
while(it.hasNext())
{
Student stu = it.next();
String addr= tm.get(stu);
System.out.println(stu+":::"+addr);
}
}
}
------- android培训、java培训、期待与您交流! ----------