------- android培训 java培训、期待与您交流! ----------
一、集合的概念
什么是集合:集合是容器,长度可变,可以储存任意类型的对象。
如果储存的是基本数据类型,内部会自动转换为包装类。
集合与数组的区别:
数组:长度固定 可以存储基本数据类型,也可以存储对象 存储的对象要是同一类型的
集合:长度不固定 只能存储对象 可以存储任意类型的对象(一般都会存储同一类型)
二、集合分类
collection: 一次储存一个对象,单列集合
List 有索引,可重复
ArrayList: 数组实现,查找快,增删慢
LinkedList:链表实现,增删快,查找慢
Vector 数组实现,线程安全
Set 无索引,去重复
HashSet 使用哈希算法去重复,效率高,但无序
LinkedHashSet 使用哈希算法去重复, 效率高,并且保留存储顺序 是HashSet的子类。
TreeSet 使用二叉树去重复,可以自定义元素存储的顺序
map: 一次储存两对象,键值对集合
HashMap 使用哈希算法去重复,效率高,但无序
LinkedHashMap 使用哈希算法去重复, 效率高,并且保留存储顺序
TreeMap 使用二叉树去重复,可以自定义元素存储的顺序
Hashtable 类似HashMap, 线程安全, 效率略低, 不允许null键和null值
Properties Hashtable的子类, 用来操作配置文件
三、集合的方法
add(); 向集合中添加元素
addAll(); 向集合中添加另一个集合所有的元素
remove(); 删除集合中指定的元素
removeAll() 删除两个集合的交集
retainAll() 保留两个集合的交集
clear(); 移除集合中所有的元素
contains() 判断集合中是否包含这个元素
containsAll() 判断集合中是否包含另一个集合中所有元素
isEmpty() 判断集合是否为空
equals() 判断两个元素是否相等
size() 获取集合中的长度
hashCode() 获取哈希值
iterator() 获取迭代器
toArray() 获取集合转化为的数组
四、集合的循环遍历
collection:
List 因为List有索引,所以比Set多一个for循环遍历 注:只有List增册改查,因为有索引
for循环: 从0循环到集合的size()-1, 每次获取其中一个
迭代器: 通过iterator()方法得到迭代器, 调用hasNext()和next()方法进行迭代
增强for循环: for (类型 变量名 : 容器) { 循环体 }
Set
迭代器: 通过iterator()方法得到迭代器, 调用hasNext()和next()方法进行迭代
增强for循环: for (类型 变量名 : 容器) { 循环体 }
Map:
keySet(): 得到所有的键组成的Set, 遍历Set得到每一个键, 然后再分别获取值
entrySet(): 得到所有的Entry组成的Set, 遍历Set得到每一个Entry, 再分别getKey()和getValue()
五、集合循环遍历中的删除
a.for循环: 删除时由于后面的元素会向前移动, 所以删除之后循环变量要--
b.迭代器: 要删除元素时必须使用Iterator中的remove()否则会抛出异常
c.增强for循环: 不能删除
六、HashSet
1.HashSet原理
我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低
哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
如果没有哈希值相同的对象就直接存入集合
如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较
比较结果为false就存入, true则不存
2.将自定义类的对象存入HashSet去重复
类中必须重写hashCode()和equals()方法
hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
equals(): 属性相同返回true, 属性不同返回false
七.TreeSet
1.特点
TreeSet是用排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
2.使用方式
a.自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象强转成Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator, 那么TreeSet就不会按照自然顺序排序了
add()方法内部会自动调用Comparator接口中compare()方法排序
c.两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator