泛型和hashmap,treemap
泛型的使用是在jdk5.0之后加入的,其作用是在编译器编译程序前给虚拟机规定当前对象可以编译通过的类型,如果传进的是非指定的对象,那么编译器就会报错,泛型在编译通过之后不会在运行的程序上体现出来,相当于被擦除了。
首先,先介绍泛型在集合中对象加入时的应用。
1泛型在创建集合上的适用
public class Demo{
public static void main(String[] args){
TreeSet<String> ts=new TreeSet<String>();
ts.add("abc");
ts.add("bcd");
ts.add("cde");
}
}
上面程序中在创建集合时就直接以<String> 定义了该集合只能加入字符串,这样就能保证集合里的都是同一类型的对象,这也往往是我们创建集合时所希望看到的。其他几种集合泛型的应用都是一致的。
当有二个不同的集合需要往一个选择器里传入数据时,并且传入的数据类型是未知的,这时需要在接受对象的放上加上通配符:
代码:
public void print(Collection<?> c){
for (Iterator<?> iterator = c.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
}
这时遍历集合里对象的方法,可接受不同类型集合的传入数据
2泛型在使用选择器时的应用
TreeSet<String> ts=new TreeSet<String>(new MyComparator());
这里提一点,选择器是在当对象没有重写compareTo方法,而且无法重写,或者我们不想要对象已经重写的compareTo方法,需要自己的时使用。
上面程序语句中就是在创建集合时加入了选择器,并且加了泛型String,这样选择器就知道哪种类型的对象可以进来。这样的操作可以免去编写选择器时对象的强制转型。
3泛型在类 方法 静态方法上以及接口上的应用
类:
public class New1 {
public static void main(String[] args) {
New001<String> n=new New001<>();
n.print("nihao");
n.print(111);
}
}
class New001<Q>{
public void print(Q q){
System.out.println(q);
}
}
上面是New001是一个泛型类,类型为Q变量,本类中并没有规定泛型的具体类型,确定是在创建对象的时候,New001<String>这里就确定了泛型的类型,下面传进的数据类型只能是String类型。
方法和静态方法:
public <M>void print02(M m){
System.out.println(m);
}
方法上的泛型主要应用在这样的情况下:当你的方法的类型是不确定的,或者说和类上的类型不是一致的,就需要在方法上定义泛型。
静态方法的泛型必须是定义在方法上,原因是静态方法随着类的加载而加载,对象还没创建之前类上的泛型还没加载,如果静态方法的泛型定义在类上,那么静态方法中传入的对象就没意义了。
HashMap和treeMap
hashMap的底层和hashset的底层是一样的,唯一不同的是,hashmap里的对象不是单一的对象,而是有一个键,一个值对应起来的形式存在集合里。
关于hash集合中自定义对象hashcode和equals方法的重写和hashmap是一致的,不做总结了。treeMap也是如此
这里主要总结hashmap和treeMap主要方法上的使用
这二种集合的对象是不能直接从集合中迭代出来,遍历对象的方式有二种。
第一种:将集合中键的值用keyset取出来放入一个人set集合中,再通过遍历这个set集合得到key对象的遍历,再由get(key)来获取到values的对象遍历。
代码体现:
TreeMap<String, Integer> tm=new TreeMap<String, Integer>();
tm.put("dai", 1);
tm.put("aong", 3);
tm.put("bng", 2);
Set<String> s=tm.keySet();
for (Iterator<String> iterator = s.iterator(); iterator.hasNext();) {
Object obj=iterator.next();
System.out.println(obj);
System.out.println(tm.get(obj));
}
第二种是需要用到treemap的方法entrySet,将包含映射关系的键值存入set集合,这里的对象类型为Map.entry,这是map的一个内部类,存入set集合的对象的类型书写为set<Map.entry<xxx,xxx>>,
代码体现如下:
public class New1 {
public static void main(String[] args) {
Teacher01 t1=new Teacher01("张三", 11);
Teacher01 t2=new Teacher01("王五", 13);
Teacher01 t3=new Teacher01("李四", 12);
TreeMap<Teacher01, String> tm=new TreeMap<Teacher01, String>();
tm.put(t1, "上海");
tm.put(t2, "北极");
tm.put(t3, "城都");
Set<Map.Entry<Teacher01, String>> s=tm.entrySet();
for (Iterator<Entry<Teacher01, String>> iterator = s.iterator(); iterator.hasNext();) {
Entry<Teacher01, String> e=iterator.next();
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
}
Tacher01是一个实现comparable接口,重写compareTo方法的类。
Hashmap和treemap的区别就在于底层的对象存放形式,方法上并没有区别,只需将teacher01类重写equals方法即可。