Collection集合
Coeclltion集合为一个接口,List和Set接口继承了该Coeclltion。
List有实现类ArrayList、LinkedList和Vector。
Set有实现类HashSet和接口SortedSet,TreeSet类实现了接口SortedSet。
集合只能存储引用类型,如果在集合中add基础类型时会自动装箱。
关系图为下:
- List接口:有序、有下标、元素可重复。
- Set接口:无序、无下标、元素不能重复。
标题Collection集合中的遍历:
- 1、使用增强for
- 2、使用迭代器Iterator(迭代器重不能用Collection的方法)
标题List集合中的遍历:
-
1、使用for
-
2、使用增强for
-
3、使用迭代器
-
4、使用列表迭代器ListIterator,比普通的迭代器多增加了前后遍历的方法和get下标。
ArrayList(1.2加入)
数组结构实现,查询快、增删慢,运行效率快,线程不安全。
删除操作中使用匿名对象,需要重写equals方法
ArrayList遍历:
- 1、迭代器
- 2、列表迭代器
ArrayList源码部分解析
- 默认容量DEFAULT_CAPACITY=10
- 存放元素的数组elemtData
- 实际元素个数size
- 扩容机制为扩容为原来的1.5倍
Vector(1.0加入)
数组结构实现,查询快、增删慢,运行效率慢,线程安全。
Vector遍历
- 使用枚举器(1.2之前)
LinkedList
链表结构实现,增删快、查询慢。(双向链表)
LinkedList遍历
- 1、使用for遍历
- 2、使用增强for
- 3、使用迭代器
- 4、使用列表迭代器
ArrayList和LinkedList的区别
ArrayList是数组结构,数据区域连续,LinkedList是双向链表结构,数据不连续。
Set集合
Set的遍历:
- 1、使用增强for
- 2、使用迭代器
HashSet
- 基于HashCode计算元素的存放位置。
- 当存入元素时的哈希码相同时,会调用equals方法进行确认,如结果为true,则拒绝后者存入。(注意:新建实例化对象时,就算对象内数据相同,哈希码计算会不同)
- HashSet存储结构为哈希表(数组+链表+红黑树)
HashSet的遍历:
- 1、使用增强for
- 2、使用迭代器
HashSet存储过程: - 1、根据hashcode计算保存位置,如果差位置为空,则直接保存;如果不为空,则执行第二步。
- 2、第二步再执行equals方法,如果结果为true,则认为元素重复,否则形成链表。
重写HashCode方法时:
- 1、可以使用质数相加可以减少散列冲突。
- 2、使用质数31可以增加执行效率31x i=(i<<5)- i。
简单重写hashCode
另一种重写hashCode
TreeSet
TreeSet:
- 基于排列顺序实现元素不重复。
- 实现了Sorted接口,对集合元素自动排序。
- 元素对象的类型必须实现Comparable接口,指定排序规则。
- TreeSet存储结构为红黑树。
- TreeSet存储对象要实现Comparable接口,compareTo()返回为0则认为是重复元素。此外还可以不实现Comparable接口而是在创建实例化对象时使用比较器comparator。
实现Comparable接口:
用comparator比较器: