容器(有序,无序,键值对)
9.1 泛型Generics
我们一般通过“容器”来容纳和管理数据。
我们第七章所学的数组就是一种容器,可以在其中放置对象或基本类型数据。
数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。
数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。比如:我们在一个用户管理系统中,要把今天注册的所有用户取出来,那么这样的用户有多少个?我们在写程序时是无法确定的。因此,在这里就不能使用数组。
我们需要一种更强大、更灵活、容量随时可扩的容器来装载我们的对象。 这就是我们今天要学习的容器,也叫集合(Collection)。
9.1.1 自定义泛型
我们可以在类的声明处增加泛型列表,如:<T,E,V>,字符可以是任何标识符,一般采用这3个字母。
泛型类的声明
class MyCollection<E> {// E:表示泛型;
Object[] objs = new Object[5];
public E get(int index) {// E:表示泛型;
return (E) objs[index];
}
public void set(E e, int index) {// E:表示泛型;
objs[index] = e;
}
}
泛型E像一个占位符一样表示“未知的某个数据类型”,我们在真正调用的时候传入这个“数据类型”。
泛型类的应用
public class TestGenerics {
public static void main(String[] args) {
//String就是实际传入的数据类型
MyCollection<String> mc = new MyCollection<String>();
mc.set("aaa", 0);
mc.set("bbb", 1);
String str = mc.get(1); //加了泛型,直接返回String类型,不用强制转换
System.out.println(str);
}
}
9.1.2 容器中使用泛型
容器相关类都定义了泛型,在使用容器类时都要使用泛型,在容器的存储数据、读取数据时都避免了大量的类型判断,非常便捷。
泛型类在集合中的使用
public class Test {
public static void main(String[] args) {
//List、Set、Map、Iterator都是与容器相关的接口
List<String> list = new ArrayList<String>();
Set<Man> mans = new HashSet<Man>();
Map<Integer, Man> maps = new HashMap<Integer, Man>();
Iterator<Man> iterator = mans.iterator();
}
}
Collection、List、Set、Map、Iterator接口都定义了泛型