集合进阶
- 集合进阶
- Collection
- Collection集合常用方法
- Collection集合的遍历
- Iterator中的常用方法
- 集合的使用步骤
- List集合概述和特点
- List集合的特点
- List集合的特有方法
- 并发修改异常
- ListIterator 列表迭代器
- 常用方法
- 增强for循环
- 数据结构
- 栈
- 队列
- 数组
- 链表
- Set集合
- Set特点
- 实现类
- HashSet
- 哈希值
- HashSet集合特点
- HashSet保证元素唯一性的原因
- 哈希表
- LinkedHashSet集合概述及特点
- TreeSet概述和特点
- 自然排序Comparable的使用
- 比较器Comparator的使用
集合进阶
Collection
Interface Collection
是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现,通过子接口(如Set和List)实现
Collection<String> c=new ArrayList<String>();
//添加
c.add("我");
c.add("想");
c.add("你");
Collection集合常用方法
Collection集合的遍历
Iterator迭代器,集合的专用遍历方式
在java.util下
Iterator<E> iterator() 返回此集合中元素的迭代器,通过集合的iterator()方法得到,依赖集合而存在
Iterator中的常用方法
E next():返回迭代器中的下一个元素
boolean hasNext():如果还有元素返回true
集合的使用步骤
List集合概述和特点
在java.util下
1、List集合是有序集合也称序列,用户可以精确控制列表中每一个元素的插入位置,可以通过整数索引访问元素,并搜索列表中的元素
2、与Set集合不同,允许重复
List集合的特点
1、有序:存储和取出元素的顺序一致
2、可重复:存储的元素可以重复
List集合的特有方法
并发修改异常
ConcurrentModificationException
产生原因:迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中,判断预期修改值与实际修改至不一致
解决方案:用for循环遍历,然后用集合对象做相应的操作即可
ListIterator 列表迭代器
在java.util下
常用方法
函数名 | 作用 |
---|---|
E next() | 返回迭代器中的下一个元素 |
boolean hasNext() | 如果迭代器有更多元素返回true |
E previous() | 返回列表中的上一个元素 |
boolean hasPrevious() | 如果此列表在迭代器相反方向遍历有更多的元素,返回true |
void add(E e) | 将指定元素插入列表 |
ListIterator不会产生并发修改异常,在添加是会把实际修改次数赋值给预期修改次数
增强for循环
增强for:简化了数组和Collection集合的遍历
实现Iterable接口的类允许其对象车各位增强型for语句的目标
是JDK5之后出现的,内部原理是Iterator迭代器
格式如下:
for(元素类型 变量名:数组或者Collection集合){
//代码块
}
数据结构
栈
先进后出
队列
先进先出
数组
ArrayList
1.查询:通过索引定位,查询任意数据的耗时相同,查询速度快
2.删除:删除数据是后面的每个数据会前移,删除效率低
3.添加:添加位置后的每个数据后移,添加效率低
链表
LinkList
链表增删快,查询慢
特有功能
Set集合
在java.util下,是个接口,extends Collection<E>
Set特点
1.不包含重复元素
2.不能用for遍历
3.是接口不能实例化
实现类
HashSet
不对迭代顺序作保证
哈希值
JDK根据地址或者字符串或者数字算出来的int值
Object类中 public int hashCode() 可以获得对象的哈希值
同一个对象多次调用此方法,返回的哈希值是相同的
默认情况下,不同对象的哈希值是不同的
通过方法重写,不同对象的哈希值可以相同
HashSet集合特点
- 底层数据结构是哈希表
- 对接的迭代顺序不做保证,不保证存取和取出的顺序一致
- 没有带索引的方法所以不能使用普通的for循环遍历
- 没有重复元素
HashSet保证元素唯一性的原因
hashCode()和equals()保证了元素的唯一性
哈希表
JDK8之前底层采用的是数组+链表实现的
JDK8之后长度比较长时底层实现了优化
存储元素时,先计算哈希值,如果位置为空则直接插入,否则插入链表,插入时检查链表中是否有哈希值一样的,如果一样比较内容,相同则不插入
注:用HashSet存储对象避免相同对象存入可以重写hashCode()和equals()自动生成即可
LinkedHashSet集合概述及特点
在Java.util包下,继承自HashSet,实现了Set接口
特点
- 哈希表和链表实现的Set接口,具有可预测的迭代次序
- 由链表保证元素有序,存入和取出的顺序一致
- 由哈希表保证元素唯一,没有重复元素
TreeSet概述和特点
在Java.util包下,间接实现Set接口
特点
- 元素有序,不是指存储和取出的顺序,而是按照一定的规则进行排序,具体方法取决于构造方法:
TreeSet():根据元素的自然排序进行排序
TreeSet(Comparator comparator):根据比较去进行排序 - 没有带索引的方法,不能使用for进行遍历
- 由于是Set集合,不包含重复元素
存储的是引用类型,不能用基本类型,得用包装类
自然排序Comparable的使用
- 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
- 自然排序,就是让所属的类实现Comparable接口,重写comparaTo(T o)方法
- 重写时,要注意排序规则的主要条件和次要条件来写
比较器Comparator的使用
- 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
- 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
- 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
如下可用匿名内部类
TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num=s1.getAge()-s2.getAge();
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});