#####################################基本概念#####################################
数组就是一种容器,可以在其中放置对象或基本类型数据
数组的优势:是一种非常简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的;
数组的劣势:不灵活,容量需要事先定义好,不能随着需求的变化而扩容。
所以我们需要功能更加强大的容器!请看下图
首先我们可以看到,这里面有几个接口,第一个接口叫Collection,容器在英文中就是Collection,或者翻译为集合
Map是存放键值对的,它的实现就是HashMap;
#######################################泛型#######################################
泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合;
一个容器里面可以放多种肉,但是取出很麻烦,取出来还得判断是什么肉,傻傻分不清~~
那么,正规的厨房怎么做呢?
正规的厨房会在旁边贴上一个标签,表明里面全是羊肉,泛型就是起这样的作用,相当于就是给容器贴上一个标签;
泛型的本质就是数据类型的参数化,我们可以把泛型理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型;
下面来测试一下泛型,下面是没有加泛型的 ??简单程序??
public class TestGeneric {
public static void main(String[] args) {
MyCollection mc=new MyCollection();
mc.set("韩一狗", 0);
mc.set(9999, 1);
Integer a=(Integer)mc.get(1);
String b=(String)mc.get(0);
}
}
class MyCollection{
Object[] objs=new Object[5];
public void set(Object obj,int index)
{
objs[index]=obj;
}
public Object get(int index)
{
return objs[index];
}
}
泛型一般定义是三个字符,在类的后面加 <T OR E OR V>,下面是添加泛型之后的代码
public class TestGeneric {
public static void main(String[] args) {
MyCollection<String> mc=new MyCollection<String>(); //String相当于实参
mc.set("韩一狗", 0);
mc.set("9999", 1);
String b=mc.get(0);
}
}
class MyCollection<E>{ //E相当于形参
Object[] objs=new Object[5];
public void set(E e,int index)
{
objs[index]=e;
}
public E get(int index)
{
return (E)objs[index]; //强转一下
}
}
也就是说,泛型就是类型,加了泛型之后相当于把类型检查做到编译器这里,提前做了,使得程序更加稳定,可读性更强,以后会经常看到!!!E代表后期传的类型,仅此而已。
9.1.2 容器中使用泛型
List属于java.util里面,打开List的源码:
public interface List<E> extends Collection<E> {
}
里面加了泛型,同时其实现类ArrayList里面也添加了泛型;