本周我主要学习的是泛型与容器,主要内容有:类型参数,泛型类、泛型方法和接口,泛型通配符、列表接口List,集合接口Set及映射接口Map。
一、泛型
- 泛型的实质就是将数据的类型参数化,通过为类、接口及方法设置类型参数来定义泛型。
1.泛型类
- 泛型类的定义:[修饰符] class 类名<T>
public class App11_1 <T>{
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj){
this.obj=obj;
}
- 在使用泛型定义的类创建对象时,即在泛型实例化时,可以根据不同的需求给出类型参数T的具体类型。而在调用泛型类的方法传递或返回数据类型时可以不用进行类型转换,而是直接用T作为类型来代替参数类型或返回的类型。
2.泛型方法
- 泛型方法的定义[public] [static] <T>返回值类型 方法名 (T参数)
public class App11_2 {
public static void main(String[]args){
Integer[]num={1,2,3,4,5};
String[]str={"h","c","huang"};
App11_2.<Integer>display(num);
App11_2.<String>display(str);
}
public static<T>void display(T[]list){
for(int i=0;i< list.length;i++)
System.out.print(list[i]+" ");
System.out.println();
}
}
3.类型通配符
- 在定义泛型对象的方法或实例化泛型对象时,若还不能确定泛型T的类型实参,就可以使用通配符"?"代替确定的泛型数据类型。通配符的主要作用有3方面:一是在创建一个泛型类对象时限制该泛型类的实参类型必须继承某个类或实现某个接口;二是用在方法的参数中,限制传入不想要的类型实参;三是用于创建可重新赋值但不可修改其内容的泛型对象。
- 用通配符"?"创建的对象只能获取或删除其中的信息,但不能对其加入新的信息。
二、容器类
1.列表接口List<E>
- 实现List<E>接口的类主要有两个:链表类LinkedList<E>和数组列表ArrayList<E>,它们都是线性表。
- LinkedList<E>链表类采用链表结构保存对象,这种结构向链表中任意位置插入、删除元素时不需要移动其他元素,链表的大小是可以动态增大或减小的,但不具随机存取特性。
- ArrayList<E>数组列表类使用一维数组实现List<E>,该类实现的是可变数组,允许所有元素,包括null。具有随机存取特性,插入、删除元素时需要移动其他元素,当元素很多时插入、删除操作的速度较慢。在向ArrayList<E>中添加元素时,其容量会自动增大,但不能自动缩小,但可以使用trimToSize()方法将数组的容量减小到数组列表的大小。
2.集合接口Set<E>
- 实现Set<E>接口的两个主要类是哈希集合类HashSet<E>及树集合类TreeSet<E>。
- HashSet<E>根据哈希码来确定元素在集合中的存储位置,因此可以根据哈希码快速地找到集合中的元素。
- TreeSet<E>的工作原理与HashSet<E>相似,但TreeSet<E>增加了一个额外的步骤,以保证集合中的元素总是处于有序状态。
3.映射接口Map<K,V>
- Map<K,V>中每个键都是唯一的,且每个键最多只映射一个值。
- Map<K,V>是基于哈希表的HashSet<E>接口的实现类,允许使用null值和null键,但必须保证键的唯一性,HashMap是无序的。
- TreeMap类中的映射关系存在一定的顺序,不允许键的对象是null。TreeMap是有序的。