容器
在开发中一般使用容器来容纳和管理数据。
泛型Generics:
泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合。在使用了泛型的集合中,遍历是不必进行强制类型转换。jdk提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。
泛型的本质就是“数据类型的参数化”。我们可以把“泛型”理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型
自定义泛型:
我们可以在类的声明处增加泛型列表,如:<T,E,V>。此处,字符可以是任何标识符,一般采用这3个字母。
泛型E像一个占位符一样表示“位置的某个数据”,在真正调用时候将传入这个“数据类型”
class MyCollection<E>{
Object[] objs=new Objs[5];
public E get(int index){
return (E) objs[index];
}
public void set(E e,int index){
objs[index]=e;
}
}
public class TestGenerics{
public static void main(String[] args)
{
MyCollectio<String>mc=new MyCollection<String>();
mc.set("aaa",0);
mc.set("bbb",1);
String str=mc.get(1);//加了泛型,直接返回String类型,不用强制转换。
System.out.println(str);
}
}
容器中使用了泛型
容器相关类都定义了泛型,我们在开发和工作中,在使用了容器类时都避免了大量类型判断,非常便捷。
Collection接口
Collection表示一组对象,他是集中、收集的意思。colllection集团口的两个子接口是list、Set接口。
Collection接口中方法的定义:
list特点和常用的方法:
有序:List中每个元素都有索引表及。可以根据元素的索引标记(在List中的位置)访问元素。从而精确控制这些元素。
可重复:List允许加入重复的元素,更确切的讲。List通常允许满足e1.equals(e2)的元素重加入容器。
list接口方法:
ArrayList特点和底层实现:
ArrayList底层是用数组实现的存储,特点:查询效率高,增删效率低,线程不安全。(我们一般使用他)源码如下:
我们可以看出ArrayList底层使用Object数组来储存元素数据。所有的方法,都围绕这个核心Object数组来展开。
数组的长度有限,而ArrayList是可以存放任意数量的对像,长度不受限制,是通过定义新的更大的数组,将就数组中的内容拷贝到新数组中,源码如下:
LinkedList特点和底层实现:
LinkedList底层用双向链表实现存储,特点:查询效率低,增删效率高,线程不安全。
双向链表也叫双链表,是链表的一种,他的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点,所以,从双线链表中的任意一个结点开始,都可以很方便的找到所有节点。结构图:
特点:LinkList在内部采用的是双向链表是实现的,插入与删除元素的速度快,随机访问速度则较慢。LinkedList单独具有addFirst()、addLast()、getFirst()、getLast()、removeFirst、removeLast()方法,这些方法使得LinkedList可以作为堆栈,队列和双向队列来使用。这些方法彼此之间只是名称有些差异,或者只存在比较小的差异,以使得这些名字在特定用法的上下环境中更加适用(特别是在Queue中)。同样,LinkedList也是线程不安全。
栈通常是先进后出的容器,将元素插入到列表的头部。LinkedList具有能够直接实现栈功能的方法,因此可以直接将LinkedList作为栈来使用
源码:
vector向量:
Vector底层是用数组实现的List,相关的方法都加了同步检查,因此”线程安全,效率低“,比如,indexOf()方法就增加了synchronized同步标记
代码:
总结:
需要使用线程安全时,用Vector
不存在线程安全问题时,并且查抄较多用ArrayList(一般使用他)
不存在线程安全时,增加或产出较多哟个LinkedList。