Collection子接口:List接口
List接口概述:
1、 鉴于Java中数组用来储存数据的局限性,我们通常使用List来替代数组。
2、 List集合类中元素有序、其可重复,集合中的每个元素都有其对应的顺序索引。
3、 List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
4、 JDK API中List接口的实现类常用的有:ArrayList、LinkedList、Vector。
List的接口方法:
List除了从Collection集合继承的方法外,List集合里添加了一些根据索引类操作集合元素的方法。
1、 Void add(int index,Object ele):在index位置插入ele元素
2、 Boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来。
3、 Object get(int index):获取指定Index位置的元素。
4、 Int indexOf(Object obj):返回在集合中首次出现的位置。
5、 Int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置。
6、 Object remove(int index):移除指定Index位置的元素,并返回此元素。
7、 Object set(int index,Object ele):设置指定Index为的元素为ele。
8、 List subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的子集合。
List实现类之一:ArrayList
ArrayList是List接口的典型实现类、主要实现类
本质上,ArrayList是对象引用的一个“变长”数组
AR人List的JDK1.8之前与之后的实现区别?
JDK1.7:ArrayList像饿汉式,直接创建一个初始容量为10的数组。
JDK1.8:ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个初始容量为10的数组。
List实现类之二:LinkedList
在对于要频繁的插入或者删除元素的操作,建议使用LinkedList类,这个类方法,效率会高。
LinkedList:双向链表,内部没有声明数组,而是定义了Node类型的first和last,
用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。
Node除了保存数据,还定义了两个变量:
Prev变量记录前一个 元素的位置
Next变量记录下一个元素的位置
List 实现类之三:Vector
Vector是一个古老发集合了。在JDK1.0就有了。它大多数操作与ArrayList相同,区别之处就在于Vector是线程安全的。
在各种list中最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList要慢,所以尽量避免使用。
ArrayList和LinkedList的异同:
他们二者都是线程不安全,相对线程安全的Vector,执行效率高。
此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问Get和Set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作Add(特指插入)和remove,LinkedList是比较占优势的,因为和ArrayList相对比,LinkedList不需要移动数据。
ArrayList和Vector的区别:
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类,因此开销就是要比ArrayList大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是用Vector,因为同步完全可以由程序员自己来控制。Vector
每次扩容请求其大小的2倍空间,ArrayList是1.5倍。Vector还有一个子类Stack。
Vector新增方法:
Collection子接口之二:Set接口
Set实现类之一:HashSet
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除 性能。
HashSet具有以下特点:
(1)、不能保证元素的排列顺序
(2)、HashSet不是线程安全的、
(3)、集合元素可以的Null。
HashSet集合判断两个元素相等的标准:两个对象可以通过hasgCode()方法来比较相等,并且两个对象的equals()方法返回值也相等。
对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等的规则。即:“相等的对象必须具有相等的散列码”。
在HashSet中添加元素的过程:
当向HasSet集合中存入一个元素,HashSet会调用该对象hashCode()方法来得到该对象的hashCode值,然后根据hashCode值,通过某种散列函数决定该对象在HasSet底层数组中的储存位置,(这个散列函数会与底层数组的长度相计算得到在 数组中的下标,并且这种散列函数计算还尽可能保证能均匀存储元素,越是散列分布, 该散列函数设计的越好)
如果两个元素的hashCode()值相等,会再继续调用equals方法,如果equals方法结果 为true,添加失败;如果为false,那么会保存该元素,但是该数组的位置已经有元素了, 那么会通过链表的方式继续链接。
如果两个元素的equals()方法返回true,但他们的hashCode()返回值不相等,hashSet将会把他们储存在不同的位置,但依然可以添加成功。