java-集合框架
数组与集合
平时我们在存储数据时,一般都是选择数组形式进行存储,如:
数组虽然存取效率高,但使用时容量固定,只适合基本数据类型的存取
集合存取效率上有一定的牺牲,集合容量大小可以根据实际需求进行改变,提供丰富的存取方法,适合成为对象的“容器”
集合框架图
Collection接口
Collection就像是集合框架的根,它为集合提供添加删除等操作,继承自Iterable,说明此集合可以使用迭代器遍历。
包含方法:
- 获取集合大小:size()
- 判断集合是否为空:isEmpty()
- 判断集合中是否包含指定元素:contains(Object o)
- 返回集合中所有元素的数组: toArray()
- 向集合中添加元素:add(E e)
- 移除集合中指定元素 remove(Object o)
- 是否包含指定集合的所有元素 containsAll(Collection<?> c)
- 将指定集合添加到本集合: addAll(Collection<? extends E> c)
- 如果指定集合中的元素在此集合也存在,则删除 removeAll(Collection<?> c)
- 移除此集合中所有元素void clear()
- 将指定对象与此集合进行比较以获得相等性 equals(Object o)
- 返回集合的哈希值 hashCode()
set接口
特点:
- 扩展Collection接口
- 不允许重复元素
- 没有排序
- 允许一个null值
- 对add()、元素的equals()和hashCode()方法添加了限制
- HashSet是其实现类
List接口
特点
- 扩展了Collection接口
- 具有顺序的集合
- 元素可以通过其整型下标访问
- 可以包含重复元素
方法分类
- 定位方法:
get()、set()、add()、remove()、addAll() - 搜索方法:
indexOf()和lastIndexOf() - ListIterator方法:
listIterator()和subList()
List实现类
- ArrayList类:
由一个数组后推而成,查询快,增删慢 - LinkedList类:
由一个双向链表后推而成,查询慢,增删快 - Vector:
实现可变长度的对象数组,组件可以使用整型下标访问,线程安全
什么是重复
public boolean equals(Object obj)
- 指示某个其他对象是否与此对象“相等”。
- 注意:当此方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
public int hashCode()
- set实现不重复判断思路
- 添加一个新的元素时,分别调用每个对象的hashCode方法,保存成功添加的hashCode值,以便快速查找对应的元素
- 当出现一个新的元素与set中已有元素的hashCode值相同
- 调用新元素的equals方法进行逻辑判断,返回true,认为重复,添加不成功
- equals返回false,认为不重复,添加成功
- hashcode不同,直接添加新元素
Iterator迭代器
对集合进行迭代的迭代器
- 迭代器代替了java Collection Framework中的Enumeration.
包含方法如下:
- boolean hashNext()
如果仍有元素可以迭代,则返回true - Object next()
返回迭代的下一元素 - boolean remove()
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用next只能调用一次此方法。
双向迭代方式
- boolean hashNext()
- Object next()
- boolean hasPrevious()
- Object previous()
- boolean remove()
Map接口
关键字唯一
- 将键映射至值的对象
- 每个键最多都只能映射至一个值
重要方法
- 基本操作
put()、get()、remove()、containsKey()、containsValue()、size()和isEmpty() - 批操作
putAll()和clear() - 集合视图
keySet()、values()和entrySet()
Map.entry
特点:
- 集合元素实现的接口
- 实体,包含键值对
包含方法:
- getKey(),得到实体的键
- getValue(),得到实体的值
- setValue(Object o),修改实体的值
Map实现类
HashMap
非线程安全(非同步),效率高
HashTable
线程安全(同步),效率不如HashMap
- Map遍历方式
1.普遍使用,二次取值通过Map.keySet遍历key和value:
for(String key : map.keySet()){
System.out.println("key="+key+"and value" + map.get(key));
}
2.通过Map.entrySet使用iterator遍历key和value:
Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String,String> entry = it.next();
System.out.println("key="+entry.getKey() + "and value+" + entry.getValue());
)
3.推荐,尤其是容量大时,通过Map.entrySet遍历key和value:
for(Map.Entry<String,String> entry : map.entrySet()){
System.out.println("key=" + entry.getKey() + "and value=" + entry.getValue());
}