目录
集合体系
Java集合可分为Collection和Map两种体系。
Collection接口
单列数据,定义了存取一组对象的方法的集合。
其中List为元素有序,可重复的集合,如ArrayList,LinkedList,TreeSet
Set为元素无序,不可重复的集合,如HashSet,LinkedHashSet,TreeSet
Map接口
双列数据,保存具有映射关系"key-value对"的集合,如:HashMap,LinkedHashMap,TreeMap,Hashtable,Preperties
Collection接口里的方法
addAll()
把另一个Collection里存储的对象加进该Collection。
retain()
获取当前集合和coll1集合的交集,并返回给当前集合。
hashcode()
返回当前对象的哈希值
集合->数组
toArray()
数组->集合
调用Arrays类的静态方法Arrays.asList()
集合元素的遍历
Iterator对象称为迭代器,主要用于遍历Collection集合中的元素。
iterator()
返回Iterator接口的实例,用于遍历集合元素,每次调用都会产生一个新的iterator对象。
遍历
Iterator iterator = coll.iterator();
//方式一
for(int i=0;i<coll.size();i++){
sout(iterator.next());
}
//方式二
while(iterator.hasNext()){
sout(iterator.next());
}
remove()
内部定义了remove(),可以在遍历的时候删除集合的元素。
如果还未调用next()或在上一次调用next()方法之后已经调用了remove方法,再调用remove都会报错。
foreach循环
for(Object obj:coll){
sout(obj);
}
List接口
JDK API中LIst接口的实现类常用的有:ArrayList,LinkedList和Vector
ArrayList,LinkedList和Vector三者异同
相同点:三个类都实现了List接口,存储数据的特点相同,都是存储有序可重复的数据。
不同点:ArrayList作为List接口的主要实现类,线程不安全,故而效率高,底层使用Object[]存储。
LinkedList:对于频繁的插入和删除操作,使用此类效率比ArrayList高,底层使用双向链表存储
Vector是比较早的实现类,线程安全,所以效率比较低。
List里自己定义的方法
addAll(int index,Collection col)
从index位置开始将col中的所有元素添加进来。
set(int index,Object obj)
设置指定index位置的元素为obj
subList(int fromIndex,int toIndex)
返回从fromIndex到toIndex位置的子集合
Set接口
Set接口没有额外定义新的方法,使用的都是Collection中声明过的方法。
实现类
HashSet:作为Set接口的主要实现类,线程不安全,可以存储null值
linkedHashSet:作为HashSet的子类,遍历其内部数据时可以按照添加的顺序去遍历。
TreeSet:可以按照添加对象的指定属性进行排序。
无序性
不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
不可重复性
保证添加的元素按照equals()判断时,不能返回true,即相同的元素只能添加一个。
Set添加元素的过程(以HashSet为例)
- 加入向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为索引位置),判断数组此位置上是否已经有元素。
- 如果此位置上没有其它元素,则元素a添加成功。
- 如果此位置上有其它元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值
- 如果hash值不相同,则元素a添加成功,如果hash值相同,进而需要调用元素a所在类的equals()方法。
- equals()返回true,元素a添加失败,返回false的话元素a添加成功。
HashSet底层
数组+链表的结构
HashCode()和equals()的重写
对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则,即“相等的对象必须具有相等的散列码”
LinkedHashSet
作为HashSet的子类,在添加数据的同时,还维护了两个变量,记录此数据前一个和后一个数据。
优点:对比较频繁的遍历操作,LinkedHashSet好于HashSet。
TreeSet
向TreeSet中添加的数据,要求是相同类的对象。
采用红黑树的存储结构。
自然排序(实现comparable接口)
可以按照对象的指定属性进行排序。
比较是否相同,用CompareTo()比较是否返回0
定制排序(comparator)
Comparator com = new Comparator(){
@Override
public int compare(Object o1,Object 02){
return 0;
}
};
TreeSet set = new TreeSet(com);