栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录
  • 集合体系
    • 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

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
	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);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860076.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号