集合
定义
- 集合是一个容器,是用来储存和获取数据的。
- 它一般用于储存对象
- 长度可变
集合类体系结构图
集合类体系图.png
- Collection :单列集合顶层接口
- List:Collection的子接口,其中储存的元素可重复,取出元素的顺序和储存元素的顺序一致。
- Set : Collection的子接口 , 元素不能重复,取出和存入不保证一致
- ArrayList :List的实现类,底层是数组结构,查询快,增删慢
- LinkedList:List的实现类,底层是链表结构,查询慢,增删快
Collection集合的成员方法
- boolean add(E e); //添加元素
- boolean remove(Object o) ; //从集合中删除元素
- void clear() ; //清空集合中的元素
- boolean contains(Object o) ; //判断集合中是否存在指定的元素
- boolean isEmpty(); //判空
- int size(); // 集合的长度,也就是元素的个数
Collection遍历
- 迭代器遍历
迭代器Iterator成员方法:
- hasNext(); //判断是否有下一个可迭代的元素
- next(); //返回迭代的下一个元素
例子
public class Demo{
public static void main(String[] args){
//创建集合对象
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
//迭代器
//返回的是迭代器接口的实现类的对象
Iterator it = c.iterator();
//相当于复制集合c一份
//判断是否有下一个元素
while(it.hasNext()){
//返回下一个元素
String s = it.next();
System.out.println(s);
}
}
}
List集合
特点:
- 有序
- 可重复
成员方法
- E get(int index):获取指定位置的元素
- E set(int index,E element):修改指定位置的元素
List集合遍历
例一:(使用普通for循环):
List list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
for(int x=0; x
使用增强for循环
List list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
for(String s : list){
System.out.println(s)
}
并发修改异常产生的原因及解决方案
举例:
Iterator it = list.iterator();
while(it.hasNext()){
String s = it.next();
if(s.equals("world")) {
list.add("javaee");
}
}
报错:
java.util.ConcurrentModificationException
并发修改异常
产生原因
迭代器依赖于集合而存在,在判断成功后,集合中添加了新的元素,而迭代器并不知道,也就是两者不一致,所以就报错了。
解决方案
- 通过迭代器修改集合中的元素
- 不使用迭代器,使用集合遍历,使用集合添加
Set集合
特点
- 元素不重复
- 无序
- 具体实现类:HashSet
保证元素唯一性原理
简单来说,就是通过HashCode()和equals() 这两个判断。所以使用HashSet储存对象,想要保证元素的唯一性,就必须重写hashCode()和equals()方法。
Map集合
- 键值对集合
- 一个映射不能包含重复的键
- 每个键最多只能映射到一个值上
Map集合的成员方法
- V put(K key,V value):添加元素
- V remove(Object key):根据键删除键值对元素
- void clear():移除所有的键值对元素
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Object value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
- int size():返回集合中的键值对的对数
Map的遍历
两种遍历
- 键找值:
- 获取所有键的集合
- 遍历键的集合,获取每一个键
- 根据键去找值
public static void main(String[] args){
Map map = new HashMap<>();
map.put("001","张三");
map.put("002","李四");
map.put("003","王五");
//获取所有键的集合
Set set = map.keySet();
//遍历键的集合,获取到每一个键
for (String key : set){
//根据键去找值
String value = map.get(key);
System.out.println(key+"---"+value);
}
}
- 键值对对象找键和值
- 获取所有键值对的对象
- 遍历所有键值对对象的集合
- 根据键值对来获取键和值
public static void main(String[] args){
Map map = new HashMap<>();
map.put("001","张三");
map.put("002","李四");
map.put("003","王五");
//获取所有的键值对对象
Set> set = map.entrySet();
//遍历键值对对象的集合,得到每一个键值对对象
for(Entry me : set){
//获取键
String key = me.getKey();
//获取值
String value = me.getValue();
}
}
集合嵌套
- 需求:ArrayList集合嵌套HashMap集合并遍历。
public static void main(String[] args){
//创建集合
ArrayList> array = new ArrayList<>();
//创建套内的HashMap集合1
HashMap hm1 = new HashMap<>();
hm1.put("001","张三");
hm1.put("002","李四");
hm1.put("003","王五");
array.add(hm1);
//创建套内的HashMap集合2
HashMap hm2 = new HashMap<>();
hm2.put("aaa","赵六");
hm2.put("bbb","钱七");
array.add(hm2);
//创建套内的HashMap集合3
HashMap hm3 = new HashMap<>();
hm3.put("a01","陈九");
hm3.put("a02","温十");
hm3.put("a03","梁十一");
array.add(hm3);
//使用键值对对象遍历
for(HashMap one : array){
Set> set = one.entrySet();
for(Entry two : set){
String key = two.getKey();
String value = two.getValue();
System.out.println(key+"---"+value);
}
System.out.println("-----------");
}
}
//使用键找值
for(HashMap one : array) {
Set set = one.keySet();
for(String key : set) {
System.out.println(key+"---"+one.get(key));
}
System.out.println("----");
}
- 需求:HashMap集合嵌套ArrayList集合并遍历。
public static void main(String[] args) {
HashMap> hm = new HashMap<>();
ArrayList array1 = new ArrayList<>();
array1.add("张三");
array1.add("李四");
array1.add("王五");
hm.put("北京",array1);
ArrayList array2 = new ArrayList<>();
array2.add("赵六");
array2.add("孙七");
array2.add("陈八");
hm.put("上海",array2);
ArrayList array3 = new ArrayList<>();
array3.add("梁九");
array3.add("温十");
array3.add("其华");
hm.put("广州",array3);
//使用键值对对象取值
Set>> set = hm.entrySet();
for(Entry> one : set) {
String key = one.getKey();
System.out.println(key);
ArrayList value = one.getValue();
for(String s : value) {
System.out.println("\t"+s);
}
System.out.println("-----------------");
}
//使用键取值
Set keySet = hm.keySet();
for(String s : keySet) {
System.out.println(s);
ArrayList arrayList = hm.get(s);
for(String s1 : arrayList) {
System.out.println(s1);
}
System.out.println("---------");
}
}