一、容器
容器,顾名思义就是用来装东西的一个东西,稍微官方一点就是用来存储对象的一个对象。
数组就是一个容器,但是我们在使用数组的时候会发现数组有着它的优势,也有它的缺点。
数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。
数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。比如,当你需要存储一个不清楚大小的数据时,数组就不太好用了。
所有我们就需要一个容量可以随时根据你所需要的容量来变换的容器来装载我们的对象,于是我们就要用到容器了。
容器也叫做集合(collection),以下是容器的接口层次图:
二、泛型
泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历时不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。
泛型的本质就是“数据类型的参数化”。 我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
简单来讲,泛型就是在容器上面贴一个标签,使这个人容器只能装载标签上写的类型的对象。
加泛型前,一个容器可以随便放什么类型的对象,就像这样:
用代码来说,就是这样:
public class TestGeneric {
public static void main(String[] args) {
MyCollection col=new MyCollection();
col.set("fkds", 1);
col.set(123, 2);
String a=(String) col.get(1);
Integer b=(Integer) col.get(2);
System.out.println(a);
System.out.println(b);
}
}
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];
}
}
输出结果为
这里我们把MyCollection这个容器就设为数组容器,没有加泛型,我们发现可以存任何类型的对象,但是我们发现我们取的时候就很麻烦,要定义取的对象的类型
然后我们将泛型加上
然后我们在代码上也加上泛型
我们发现我们想把其他类型的对象加进我们的容器时,编译器就报错了,说明我们定了什么类的泛型,我们的容器就只能装载这类的对象,我们把它改过来
public class TestGeneric {
public static void main(String[] args) {
MyCollection<String> col=new MyCollection<>();
col.set("fkds", 1);
col.set("jdggds", 2);
System.out.println(col.get(1));
System.out.println(col.get(2));
}
}
class MyCollection<T>{
Object[] objs=new Object[5];
public void set(T t,int index) {
objs[index]=t;
}
public T get(int index) {
return (T)objs[index];
}
}
运行结果
这里我们发现,我们取容器中的对象时,不用定义类型,可以直接拿出来用。
当然,这里我们是为了解释才用代码自己写了一个MyCollection容器,其实容器相关的类都定义了泛型,他的底层代码就直接写好了那些存取过程,我们直接拿过来用就行了,下面我们用list来使用泛型:
public class TestList {
public static void main(String[] args) {
List<String> c=new ArrayList<>();
c.add("fsdaf");//在c容器中加一个对象
System.out.println(c);
}
}
运行结果
list是容器的相关接口,一里面就介绍。
三、Collection接口
Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。
下面是Collection接口中定义的方法:
下面我们来运用一下
public class TestList {
public static void main(String[] args) {
Collection<String> c=new ArrayList<>();
c.add("fsdaf");//在c容器中加一个对象
c.add("ff");
System.out.println(c);
System.out.println(c.size());//c容器中的对象数量
System.out.println(c.contains("ff"));//查询c容器中是否有“ff”这个对象
Object[] s=c.toArray();//装出一个s数组,就是把c里面的对象拿出来,放到s数组中
System.out.println(s);
c.remove("ff");//将"ff"对象从c中移除,就是删除他存在c中的地址
System.out.println(c);
}
}
运行结果
还有一些其他的方法我们学其他接口时在讲。
感谢阅读
这是我自学Java基础,在b站看高淇老师的视频后一些理解,其中有一部分也是引用了老师的东西,如果我的理解有错误希望可以提出,一起进步。