一、List接口方法
1.add(int index,Object ele):将ele插入到下标为index处,下标从0开始。
2.addAll(int index,collection eles):从index处将所有的collection插入。
addAll(collection e):默认从尾端插入。
3.int indexOf(Object o):返回o在集合中首次出现的位置,返回int型,没有返回-1.
4.int lastIndexOf(Object obj):返回obj的最后一个位置。
5.Object remove(int index):移除指定index位置的元素,并返回次元素。
remove(Object obj):移除obj元素,返回boolean。
6.set(int index,Object obj)将index处的元素改为obj。
7.List sublist(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的子集合。
二、总结ArrayList常用方法
1.增:add(Object ele);末尾插入
2.删:remove(int index)
3.改:set(int index,Object obj)
4.查:get(int index)
5.插:add(int index,Object ele)
6.长度:size()
7.遍历:①Iterator迭代器②增强for循环代器③普通循环
三、Set接口
1.特点
无序的、不包含相同的元素。添加两个相同的元素到set会操作失败。
2.set接口框架结构
HashSet、LinkedHashSet、TreeSet。
HashSet:作为Set接口的主要实现类,线程不安全的,可以存储null值。
LinkedHashSet:作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历。
TreeSet:底层使用红黑树,可以按照添加对象的指定属性,进行排序。
3.无序、不可重复的理解
①无序性:
Set接口中无额外定义的方法,与Collection中方法一致。
无序性不等于随机性。以HashSet为例:存储的数据在底层数组中并非按照数组索引的顺序添加。根据哈希值来确定位置。
存储位置不是连续的。
②不可重复性
保证添加的元素按照equals()判断时,不能返回true。即相同的元素只能添加一个。
4.Set存储过程以HashSet为例
我们向HashSet中添加元素a,首先调用元素a所在类的HashCode方法,计算元素a的哈希值,接着通过某种算法计中的算出在HashSet底层数组中的存放位置(即索引位置),判断数组此位置上是否已经有元素,如果此位置上没有其他元素,则元素a就添加在该位置,并且添加成功。如果有其他元素在该位置上或存在以链表形式存储的多个元素,则依次比较元素a与其他元素的hash值,如果hash值不同,则添加成功。如果hash值相同,进而调用元素a所在类的equals方法;如果equals返回true,表明有相同的元素,则添加失败;返回false,则成功。
注:HashSet在数组中是以链表形式存储数据的。数组+链表存储数据
JDK7:新的元素a放在数组中,由新的元素指向旧的元素。
JDK8:旧的元素在数组中,指向新的元素。
7上8下。
总结
Set中增加的元素与所在类中一定要重写HashCode()与equals()方法。重写的HashCode与equals要一致。即相等的对象必须具有相等的三列码。Object类中的hashCode()方法计算两个内容相等的元素会得到不同的HashCode值,因此要重写HashCode。
四、LinkedHashSet
按照添加的顺序来遍历。依然是无序存储。
LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个元素和后一个元素。
优点:经常遍历的话比HashSet要快。
五、TreeSet
1.向TreeSet中添加的数据要求是相同类的对象。
2.两种排序方式:自然排序与定制排序。
自然排序:
TreeSet中判断元素是否一样,要用当前元素所在类中的compareTo()相等返回0,而不再是equals()方法。
定制排序:
Comparator com = Comparator(){
实现compare();
}
TreeSet set = new TreeSet(com);
compare与compareTo返回值类型为int。1:表示01>02;2:表示01=02;3:表示01<02
六、总结
1.集合Collection中存储的是自定义类的对象,需要重写equals()方法。
List:equals();
Set: HashSet与LinkedHashSet:equals(),HashCode();
TreeSet:compareTo()/compare();
2.ArrayList、LinkedList、Vector异同点?
相同点:都实现了List接口,存储有序的、可重复的数据。
不同点:ArrayList底层使用数组实现,线程不安全;扩容时是1.5倍,经常用。
LinkedList:底层用链表实现,线程不安全。
Vector:底层用数组实现,线程安全;扩容时2倍;不常用。
3.Collection常用方法
增:add(Object obj);
删:remove(int index)/remove(Object obj);
改:set(int index,Object obj);
查:get(int index);
插:add(int index,object ele);
长度:size();
遍历:Iterator()、foreach、for