容器概念
容器(Collection):用来装其它对象的对象,比如数组。
数组优势:是一种简单的线性序列,效率高。数组劣势:不灵活,容量需要事先定义好。
容器的内容:
(Map:存储键值对)
泛型概念
泛型(Generics)是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。泛型的本质是“数据类型的参数化”。我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调入泛型是必须传入实际类型。
如果不用泛型,功能实现的代码如下:
/**
* 测试没有泛型的情况,注意内部是Object对象
*/
public class TestGeneric {
public static void main(String[] args) {
MyCollection mc=new MyCollection();
mc.set("jack", 0);
mc.set(123, 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,E,V>。代码如下:
/**
* 测试泛型
*/
public class TestGeneric {
public static void main(String[] args) {
MyCollection<String> mc=new MyCollection<>(); //这里的<E>相当于实参
mc.set("Jack", 0);
String b=mc.get(0); //不需要强制转换了
}
}
class MyCollection<E>{ //这里的<E>相当于形参
Object[] objs=new Object[5];
public void set(E obj,int index) {
objs[index]=obj;
}
public E get(int index) {
return (E)objs[index];
}
}
容器中使用泛型
示例:泛型类的在集合中的使用:
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接口都定义了泛型,如下所示:
public interface List<E> extends Collection<E>{
-------------------------------------------------
public interface Set<E> extends Collection<E>{
-------------------------------------------------
public interface Map<K,V>{
-------------------------------------------------
public interface Collection<E> extends Iterable<E>{
-------------------------------------------------
public interface Iterator<E>{
因此,我们在使用这些接口及其实现类时,都要使用泛型。
来源:CSDN
作者:叶孤橙呀
链接:https://blog.csdn.net/weixin_42497188/article/details/104258278