• 泛型

  • 特别的,使用集合时一般使用接口编程,即使用接口多态来实现

  • 相关方法

  • 大类 Collection ( 接口)

  • boolean add 方法

    • 添加元素地址
  • void clear 方法

    • 清空集合
  • boolean contains()

    • 是否包含某元素
    • 对于引用判断调用要判断是否包含的对象的equals方法
      • 要求重写equals方法
  • boolean remove

    • 删除元素
    • 也是调用equals方法
  • boolean isEmpty()

    • 判断是否为空集
  • int size()

    • 长度
  • to Array()

    • 转换为数组
  • 子接口 List

    • add 方法有重载,可以有在指定下标加元素的方法

    • get 根据下标获取元素 (Object)

    • indexOf() lastIndexOf 第一次出现的索引与最后一次出现的索引

    • remove() 删去某下标元素

      • 遍历时若使用get ,则可以一边遍历一边改
    • set(n, 元素) 将索引为n的改为 元素

    • ArrayList

      • 初始长度为10,改为当存入第一个元素时才赋予初始长度10
      • 超过十,每加一次元素会扩容1.5倍
      • 有传参集合的构造方法
  • 迭代器

  • 使用 Interator it = c. iteraior(); 来返回迭代器

  • 初始迭代器指向第一个元素之前的位置,

  • 使用

while(it.hasNext())
{
Object obj = it.next();   //返回下一个元素,注意这个方法返回值为Object
							//可能涉及类型转换
 
Syetem.out.println(obj);   //任意操作
}
  • 来迭代遍历集合
  • 迭代器自身有remove方法(删除目前返回的元素),用于在迭代时删除元素而不破坏集合结构(使用集合的remove),导致迭代出错
  • 迭代器要在集合结构改变完成后再获取,否则异常(这解释了remove的方法出错原因)
  • 集合工具类

  • java.util.Collections 集合工具类
  • 线程安全

  • 使用 Collections.synchronizedList(list); 可将list集合(假设是非线程安全的) 转换为线程安全的,同时有各个集合对应的方法
  • 排序

  • 使用 Collections.sort() 但是参数必须是List集合,若是Set集合要先转换成List集合(将set作为参数传进List实现类的构造方法)
    • 另一大类Map

      • key 与 value 都是Object
      • 但是 set (属于Collection)

        • HashSet
          • 底层实现是map(的key)
          • 使用add方法时,其实是调用 map.put() 将值添加到 key 部分
          • 迭代器或foreach遍历
        • TreeSet
          • 自动排序(树结构存放时排序)
      • 常用方法
        • map.put(K key, V value)  //加键值对
          map.get(Object key)  //通过key获取value
          void clear //清空Map
          boolean containKey(Obejct Key) //判断是否有Key,与下面方法同调用equals方法
          map.containValue(Object value) //判断是否有value 
          boolean isEmpty()   //判断是否为空
            
            
          Set<K> keySet()  //获取所有的键
          {
            //用于遍历Map
            Set<Integer> keys = map.keySet();//返回所有key
            
            Iterator<Integer> it = keys.iterator();  //返回迭代器
            while(it.hasNext())
            {
              Integer key = it.next();  //一开始指向第一个元素之前的地方
              Srring value = map.get(key); //获得value
              //输出等操作
            }
          }
           
           
           
          V remove(K key)  //删除键值对
          int size()  // 获取键值对个数
          Collection<V> values()  //获取所有的value
            
            
          map.entrySet()  //返回一个Set<Map.Entry<K, V>>
          {
          	/*
              	静态内部类,但是有键值对
                  用法(遍历Map)
               */
                  Set<Map.Entry<Integer, String>> set  = map.entrySet();
                  //遍历Set
            		Iterator<Map.Entry<Integer, String>> it = set.iterator();
            		while(it.hasNext())
                  {
                    Map.Entry<Integer, String> entry = it.next();
                    Integer key = entry.getKey(); //该类实现了相关方法
                    String value = entry.getValue();
                   //输出等操作
                  }
          }
           
          //遍历相关
          //使用foreach
          for(E a: collevtion)  //map的遍历要转为set
          {
            //操作
          }
      • HashMap

        collapsed:: true
        • 链表与数组结合体
        • map.put(k, v) 方法实现
            1. 新生成一个node对象
            1. 调用hashCode方法得到hash值,通过Hash算法得出将hash值转换成数组索引
            • 此时注意,hash值相同则数组下标一定相同,不同却不一定不同,称为 “哈希碰撞”
            1. 在该位置比较,如果空,就直接加进数组,如果不空,就equals对比找相同k,找不到就新加,找到了就替换 v
        • map.get(k) 方法实现
          • 类似词典 logseq.order-list-type:: number
          • 先用hashCode方法得到hash值,转为数组下标 logseq.order-list-type:: number
          • 空就放回NULL logseq.order-list-type:: number
          • 不空就逐个equals k, 找到就返回 value,否则NULL logseq.order-list-type:: number
        • 初始化容量

          • 初始为16
          • 默认加载因子 为 0.75
            • 数组到0.75就开始扩容(2倍)
        • 重写hashCode和equals方法

          • 对于自己新建类,要求重写equals方法和hashCode让存放在HashMap时符合需求
          • 要求,equals成立,hashCode要相等
          • 用IDE生成(一些情况下,equals方法重写完毕时,调用判断是否equals的属性的hashcode一般是相等的 (例如String)
          • 这点在HashSet和HashMap都有要求
        • 新特性

          • JDK8后,当单向链表元素大于8,转换成红黑树,当小于6,再变回单向链表
        • HashTable

          • HashMap对于key和value有null(空指针)的处理,可以有一个空指针(key)
          • HashTable则不行
        • Properties

          • 底层是HashMap
          • key与value都是字符串,称为属性类
          • 线程安全
      • TreeSet

        • 无序,自动排序(升序),等同于TreeMap的key部分
          • 底层是TreeMap TreeMap底层是二叉树
        • 排序
          • 要实现Comparale接口,并提供比较规则(自建类的话)
            • Comaprable可以使用泛型 具体实现为
              • class Saber implements Comparable<Saber>
            • 使用时会调用实现的Comparable的comparableTo的方法进行比较
              • 通过返回值 >0 , < 0 , =0
            • 不灵活,类本身实现接口要求比较方法改动较少
          • 使用比较器实现(灵活可多个)
            • 实现导自 java.util.Comparator 接口,通过return值排序
            • 因为该接口时函数式接口,可以用lambda表达式或内部类
            • 使用时当成参数传入TreeSet的构造方法
        • 内部实现为自平衡二叉树
          • 遍历使用Iterator遍历(iterator每次中序的取出元素)