javaSE复习(3)(集合框架)

视频出处 提取码: bwm8
ArrayList在前面提及了一部分 视频已经放了进去
个人感觉讲的还可以 但是这个部分比较需要实际的编程经验,需要有集合框架的思想才更好用

随看随记

  • idea中的for 和itergor遍历的快捷键
  • 集合不存储基本类型 只存储引用类型
  • 引用类型不要写== 要用equals
  • 两个对象的哈希值相同 equals不一定是true 两个对象的equals相同 其哈希值必须相同

集合 Collection

在这里插入图片描述

  • list接口存储的是 有序可重复 set接口存储的是 无序不可重复
  • Collection< E > coll = new ArrayList< E >();
  • Collection 是一个接口 通常使用多态来调用或创建ArrayList和LinkedList类来调用方法
  • Collection接口的常用方法
    • 返回true coll.add(e); 在集合中添加一个指定的引用数据类型的对象
    • 无返回值 coll.clear(); 清空集合中的所有元素
    • 返回布尔值 coll.contains(object obj);判断集合中是否有该元素,如果有则返回true,如果没有则返回false 注意: coll.contains(7); coll.contains(“7”); 注意格式不同也会返回false
    • 返回布尔值 coll.remove(object obj);判断集合中是否有该元素,如果有则删除第一个该元素并返回true,如果没有则返回false 注意: 格式和大小写也会区分
    • 返回是Object[] coll.toArray(); 将集合中的元素转成该类型的数组 因为不确定是什么类型 所以其返回是Object类型的数组

集合的遍历

迭代器遍历 Iterator接口 util包中的迭代器

  • Collection有接口定义的方法,因此通过调用ArrayList对象的iterator()方法可以多态创建Iterator接口对象 Collection< E > coll = new ArrayList< E >(); Iterator< E > it = coll.iterator(); 这几个泛型一定不要忘记
  • 常用方法
    • 返回boolean it.hasNext(); 是否存在下一个元素,如果存在则返回true,否则返回false
    • 返回E it.next(); 返回下一个元素
    • 当使用迭代器遍历一个集合时,代码如下所示
Iterator<Integer> it = collection.iterator();
        while (it.hasNext()) {
            int e = it.next();
            System.out.println(e);
        }
  • 迭代器开始时指针在-1位置 运行hasNext不会移动指针但是会看0位置是否有元素 当程序运行到next() 时 其指针才会移动并取出元素在这里插入图片描述

  • 一个迭代器对象只能遍历一次集合,即使是遍历同一个集合也需要再创建一个新的迭代器。

增强for循环遍历集合

  • for(数据类型 变量名 : 数组或集合){ }
  • 其本质是将容器中的元素赋值给for中的遍历对象 当修改对象时容器里的元素的内容没有被改变
  • 好处:代码简单方便容器遍历 弊端:由于没有索引不能操作容器里的元素
  • 一般只使用其去遍历

泛型

java是伪泛型 是在jdk中编译是进行检验 在.class文件中是没有泛型的

  • 带有泛型的类 ArrayList< E > iterator< E > 等
  • 带有泛型方法
    • 返回指定类型的数组 coll.toArray(T[] array) 将coll集合中的元素转化到array数组中 并返回array数组
      在这里插入图片描述
  • 泛型的通配符 “?”
    在这里插入图片描述
    ?作为通配符可以匹配所有的数据类型 和cmd中的*效果是一样的
  • 泛型的限定
    • 上限限定
      • ?extend E 可以传递E和它的子类对象
    • 下限限定
      • ?super E 可以传递E和它的父类对象
  • 找的一点资料 先放到这里 后面有别的需要在百度

List接口

三大特点 : 有序 索引 可重复

  • 抽象方法 (带有索引的都是List的特有方法)以arrayList为例
    • 继承Collection的方法
      • 返回true arrayList.add(obj); 在集合中添加一个引用数据类型的对象
      • 返回int arrayList.size(); 搁到整个集合的长度并返回
      • 返回boolean arrayList.remove(obj); 如果存在obj则删除第一次出现的obj对象并返回true,不存在则返回false
    • List 的特有方法
      • 无返回值 arrayList.add(index,e); 在集合中在第index索引出添加一个e
      • 返回E arrayList.set(index, e); 将原集合中的第index索引的对象替换为e 返回值是原来该索引的对象
      • 返回E arrayList.remove(index); 将原集合中的第index索引的对象删除 返回值是原来该索引的对象
      • 返回E arrayList.get(index); 得到集合中的第index个元素并返回
  • 迭代器并发异常 java.util.ConcurrentModificationException 在使用迭代器进行遍历时不允许修改集合的长度 包括add添加元素 和 remove 去除元素

ArrayList 数组集合

与上面差不多 就不写了

LinkedList 链表集合

  • 特有方法
    • 无返回值 link.clear(); 清空链表
    • 返回Boolean link.isEmpty(); 判断链表是否为空 是返回true 不是返回false
    • 添加元素
      • 无返回值 link.addFirst(e) 在链表的开始添加e元素
      • 无返回值 link.addLast(e) 在链表的结尾添加e元素 其与add方法是一样的,但是add方法返回true
    • 得到元素
      • 返回E link.getFirst() 返回链表中的第一个元素
      • 返回E link.getLast() 返回链表中的最后一个一个元素
      • 注意: 当链表被clear();后还会出现异常 java.util.NoSuchElementException异常,元素不存在异常,为了提高其健壮性需要加判断 !link.isEmpty() 或 link.size()!=0
      • 在这里插入图片描述

Set接口

无序 不重复 无索引 只能通过迭代器或增强for 其遍历方法与arrayList都相同

HashSet 哈希表

哈希表是链表数组结合体
哈希表判断的存储过程 假设adc和abc的哈希值是相等的
在这里插入图片描述

  • 当使用哈希表进行存储时 可能会需要重写其hashCode() 和equals() 方法 可以idea直接生成、
  • LinkedHashSet 链表哈希表 存储顺序和去除顺序是相同的
  • 是否存在相同元素的判断
    • ArrayList使用contains(obj)方法判断是否存在重复元素
    • HashSet使用add(e) 或contains(obj)方法来判断是否有重复元素 add可以是因为有重复元素是不会添加的 contains() 是通过hashCode()和equals()方法来判断是否相同

Map(K,V)类 键值对

当自定义对象做键时,要保证保证键的唯一性,需要对hashCode() 和 equals()及进行重写
HashMap允许存储null键 null值 但是Hashtable不允许 其余除了线程以外都一样
在这里插入图片描述

foreach不能遍历map 通过set遍历map

  • 常用方法
    • 增/改 返回null或覆盖之前的值Value map.put(key,val) 当key相同value不同时 , value会被覆盖 当value不同key相同时 会新建一个新的对象 把key想成自变量 value想成因变量 一个自变量只能对应一个因变量,一个因变量可以对应多个自变量 类比Collection中的add(index,e)方法
    • 删 返回null或删除之前的值Value map.remove(key) 取出对应的键值对 如果没有则返回null 类比arrayList中的remove(index)方法
    • 取 返回对应的value map.get(key) 取出对应的value值 如果没有则返回null 类比arrayList中的get(index)方法
    • 返回key的set集合 set=map.keySet(); 取出所有的key值并存储在集合中
    • 返回entry的set链表 entry=map.entrySet(); 每一对键值对作为entry对象存入set集合中
  • map的遍历方法
		//创建一个hashMap对象
		Map<String, Integer> map = new HashMap<String, Integer>();
		/*省略了向键值对里添加值的操作*/
        //通过keySet的迭代器遍历
        Set<String> stringSet = map.keySet();
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            System.out.println(key + "....." + map.get(key));
        }

        //通过keySet的foreach遍历
        for (String keySet : map.keySet()) {
            System.out.println(keySet + "....." + map.get(keySet));
        }

        //通过entrySet的迭代器遍历
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, Integer> next = entryIterator.next();
            System.out.println(next.getKey() + "....." + next.getValue());
        }

        //通过entrySet的foreach遍历
        for (Map.Entry<String, Integer> entry :  map.entrySet()) {
            System.out.println(entry.getKey() + "....." + entry.getValue());
        }

注意:

  1. Map也是一个抽象类 需要通过其子类HashMap进行多态创建对象
  2. 通过keySet遍历时其遍历的对象类型是Key的数据类型而不是键值对类型 类似一个函数通过自变量来求得因变量的值
  3. entry是一个类中类 其遍历的对象类型是Entry< K , V >数据类型 ,通过entry.getKey() 和 entry.getValue() ;两个方法来获取其中的key 和 value

可变参数

其在之前的基础篇已经学过了 javaSE复习(1)

集合操作的工具类 Collections

都是静态方法

  • 无返回值 Collection.sort(list) 对集合进行排序 对针对字符串进行排序的时候时对照每个字母的ASCII码
    在这里插入图片描述

  • 返回E Collection.binarySearch(list) 对有序列表进行二分查找

  • 返回Collection Collection.shuffle(list) 对集合进行随机排序

集合嵌套的四种写法

Map<String,String> javase = new HashMap<String,String>();
        Map<String,String> javaee = new HashMap<String,String>();
        Map<String,Map<String,String>> czbk = new HashMap<String,Map<String, String>>();
        javase.put("001","张三");
        javase.put("002","李四");
        javaee.put("003","王五");
        javaee.put("004","赵六");
        czbk.put("javaSE",javase);
        czbk.put("javaEE",javaee);
        printByForeach(czbk);
        System.out.println("============================");
        printByForeachEntry(czbk);
        System.out.println("============================");
        printByiterator(czbk);
        System.out.println("============================");
        printByiteratorEntry(czbk);


    }
    public  static void printByForeach (Map<String,Map<String,String>> czbk){
        for (String s : czbk.keySet()) {
            System.out.println(s+":");
            for (String s1 : czbk.get(s).keySet()) {
                System.out.println("学号:"+s1+"   姓名:"+czbk.get(s).get(s1));
            }
        }
    }

    public  static void printByiterator (Map<String,Map<String,String>> czbk){
        Set<String> stringSet = czbk.keySet();
        Iterator<String> stringIterator = stringSet.iterator();
        while (stringIterator.hasNext()) {
            String key1 =  stringIterator.next();
            System.out.println(key1+":");
            Set<String> stringSet1 = czbk.get(key1).keySet();
            Iterator<String> stringIterator1 = stringSet1.iterator();
            while (stringIterator1.hasNext()) {
                String key2 =  stringIterator1.next();
                System.out.println("学号:"+key2+"   姓名:"+czbk.get(key1).get(key2));
            }

        }
    }

    public  static void printByForeachEntry (Map<String,Map<String,String>> czbk){
        for (Map.Entry<String, Map<String, String>> stringMapEntry : czbk.entrySet()) {
            System.out.println(stringMapEntry.getKey()+":");
            for (Map.Entry<String, String> stringStringEntry : stringMapEntry.getValue().entrySet()) {
                System.out.println("学号:"+stringStringEntry.getKey()+"   姓名:"+stringStringEntry.getValue());

            }
        }
    }
    public  static void printByiteratorEntry (Map<String,Map<String,String>> czbk){
            Iterator<Map.Entry<String,Map<String,String>>> entryIterator = czbk.entrySet().iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, Map<String, String>> className =  entryIterator.next();
            System.out.println("班级" + className.getKey());

            Iterator<Map.Entry<String,String>> stringStringIterator = className.getValue().entrySet().iterator();
            while (stringStringIterator.hasNext()) {
                Map.Entry<String,String> classCont =  stringStringIterator.next();
                System.out.println("学号 " + classCont.getKey()+"姓名 " + classCont.getValue());
                classCont.getKey();
                classCont.getValue();
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值