Java集合(Collection接口,List,Set)

集合体系

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为例)

  1. 加入向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为索引位置),判断数组此位置上是否已经有元素。
  2. 如果此位置上没有其它元素,则元素a添加成功。
  3. 如果此位置上有其它元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值
  4. 如果hash值不相同,则元素a添加成功,如果hash值相同,进而需要调用元素a所在类的equals()方法。
  5. 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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值