java学习日记18,集合之Collection接口

集合与数组

集合、数组都是对多个数据进行存储操作的结构,简称Java容器。

数组存储数据的不足:
①数组一旦初始化,其长度就不可更改了;
②数组提供的方法非常有限,不便于对数据进行增加、删除、插入等操作,效率较低;
③数组只能确定其长度,对实际元素的个数的获取没有现成的方法或属性可用;
④数组存储数据的特点:有序,可重复,无法满足无序、不可重复的数据的需求。

为了弥补这些弊端,就有了集合。
集合可分为Collection与Map两大类:
Collection接口:单列数据,定义了存取一组对象的方法的集合,包括List与Set。
Map接口:双列数据,保存具有映射关系“key-value对”的集合。

Collection接口:单列集合,用来存储一个一个的对象

一、List接口

存储有序的、可重复的数据 ---->“动态”数组,替换原有的数组。
|----ArrayList:作为List接口的主要实现类:线程不安全的,效率高;底层使用Object[] elementData存储。
|----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高,底层使用双向链表存储。
|----Vector:作为List接口的古老实现类:线程安全的,效率低;底层使用Object[] elementData存储。
在这里插入图片描述

二、Set接口

存储无序的、不可重复的数据
|----HashSet;作为Set接口的主要实现类,线程不安全的;可以存储null值。
|----LinkedHashSet:作为HashSet的子类;遍历其内部顺序时,可以按照添加的顺序遍历。
|----TreeSet:可以按照添加对象的指定属性,进行排序。

以HashSet为例说明:
1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值。

2.不可重复性:保证添加的元素按照equals()判断时,不能返回true,即:相同的元素只能添加一个。

要求:向Set中添加的数据对应的类一定要重写equals()方法和hashCode()方法。
重写的equals()和hashCode()尽量保持一致性:相等的对象必须具有相等的散列码。

添加元素的过程:以HashSet为例:
1、我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,
此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置,判断数组此位置上是否已有元素:
①如果此位置上没有其他元素,则元素a添加成功;—>情况1
②如果此位置上有其他元素(或者以链表形式存在的多个元素),则比较元素a与元素b的hash值:
① 如果hash值不相同,则元素a添加成功;—>情况2
②如果hash值相同,则需要调用元素a 所在类的equals()方法:
equals()返回true,元素a添加失败;
equals()返回false,元素啊添加成功。---->情况3

对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。
JDK7:元素a放到数组中,指向原来的元素;
JDK8:原来的元素在数组中,指向元素a;

遍历操作

① 使用迭代器Iterator

Iterator iterator = coll.iterator();
//hasNext():判断是否还下一个元素
while(iterator.hasNext()){
    //next():①指针下移 ②将下移以后集合位置上的元素返回
    System.out.println(iterator.next());
}

② foreach循环(增强for循环)
//for(集合元素的类型 局部变量 : 集合对象)

for(Object obj : coll){
    System.out.println(obj);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值