JavaSE之集合

集合

定义

  • 集合是一个容器,是用来储存和获取数据的。
  • 它一般用于储存对象
  • 长度可变

集合类体系结构图

集合类体系图.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的遍历

两种遍历

  • 键找值:
    1. 获取所有键的集合
    2. 遍历键的集合,获取每一个键
    3. 根据键去找值
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);
    }
}
  • 键值对对象找键和值
    1. 获取所有键值对的对象
    2. 遍历所有键值对对象的集合
    3. 根据键值对来获取键和值
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("---------");
        }
    }

你可能感兴趣的:(JavaSE之集合)