- 集合体系
- Collection接口
- Map接口
- Collection接口里的方法
- addAll()
- retain()
- hashcode()
- 集合->数组
- 数组->集合
- 集合元素的遍历
- iterator()
- 遍历
- remove()
- foreach循环
- List接口
- ArrayList,LinkedList和Vector三者异同
- List里自己定义的方法
- addAll(int index,Collection col)
- set(int index,Object obj)
- subList(int fromIndex,int toIndex)
- Set接口
- 实现类
- 无序性
- 不可重复性
- Set添加元素的过程(以HashSet为例)
- HashSet底层
- HashCode()和equals()的重写
- LinkedHashSet
- TreeSet
- 自然排序(实现comparable接口)
- 定制排序(comparator)
Java集合可分为Collection和Map两种体系。
Collection接口单列数据,定义了存取一组对象的方法的集合。
其中List为元素有序,可重复的集合,如ArrayList,LinkedList,TreeSet
Set为元素无序,不可重复的集合,如HashSet,LinkedHashSet,TreeSet
双列数据,保存具有映射关系"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;iremove()sout(iterator.next()); } //方式二 while(iterator.hasNext()){ sout(iterator.next()); }
内部定义了remove(),可以在遍历的时候删除集合的元素。
如果还未调用next()或在上一次调用next()方法之后已经调用了remove方法,再调用remove都会报错。
for(Object obj:coll){
sout(obj);
}
List接口
JDK API中LIst接口的实现类常用的有:ArrayList,LinkedList和Vector
ArrayList,LinkedList和Vector三者异同相同点:三个类都实现了List接口,存储数据的特点相同,都是存储有序可重复的数据。
不同点:ArrayList作为List接口的主要实现类,线程不安全,故而效率高,底层使用Object[]存储。
LinkedList:对于频繁的插入和删除操作,使用此类效率比ArrayList高,底层使用双向链表存储
Vector是比较早的实现类,线程安全,所以效率比较低。
从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添加成功。
数组+链表的结构
HashCode()和equals()的重写对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则,即“相等的对象必须具有相等的散列码”
LinkedHashSet作为HashSet的子类,在添加数据的同时,还维护了两个变量,记录此数据前一个和后一个数据。
优点:对比较频繁的遍历操作,LinkedHashSet好于HashSet。
向TreeSet中添加的数据,要求是相同类的对象。
采用红黑树的存储结构。
可以按照对象的指定属性进行排序。
比较是否相同,用CompareTo()比较是否返回0
Comparator com = new Comparator(){
@Override
public int compare(Object o1,Object 02){
return 0;
}
};
TreeSet set = new TreeSet(com);



