Java-集合框架

集合框架

1. 集合的概念

  • 概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。

  • 集合和数组的区别

    1. 数组长度固定,集合长度不固定。

    2. 数组可以存储基本类型和引用类型,集合只能存储引用类型。

  • 位置:java.util.*;

2. Collection接口

  • 特点:代表一组任意类型的对象,无序、无下标、不能重复。

  • 方法:

     boolean add(Object obj);        //添加一个对象
     boolean addAll(Collection c); //将一个集合中的所有对象添加到此集合中
     void clear(); //清空此集合中的所有对象
     boolean contains(Object o); //检查此集合中是否包含o对象
     boolean equals(Object o); //比较此集合是否与指定对象相等
     boolean isEmpty(); //判断此集合是否为空
     boolean remove(Object o); //在此集合中移除o对象
     int size(); //返回此集合中的元素个数
     Object[] toArray(); //将此集合转换成数组
  • 迭代器:

     Collection collection = new ArrayList();
     collection.add("红");
     collection.add("蓝");
     collection.add("绿");
     Iterator it = collection.iterator();
     /**
      * hasNext(); 如果仍有元素迭代,则返回true
      * next(); 返回迭代的下一个元素
      * remove();
      */
     while (it.hasNext()){
      System.out.println(it.next());
     }

     

 

3. List

  • 特点:有序、有下标、元素可以重复。

  • 方法

     void add(int index, Object o);          //在index位置插入对象o
     boolean addAll(int index, Collection); //将一个集合元素添加到此集合中的index位置
     Object get(int index); //返回集合中指定位置的元素
     List subList(int fromIndex, int toIndex);//返回fromIndex和toIndex之间的集合元素ArrayList

ArrayList

  • 数组结构实现,查询快、增删慢。

  • JDK1.2版本,运行效率快、线程不安全。

  •  ArrayList arrayList = new ArrayList<>();
  • 源码分析:

    • DEFAULT_CAPACITY = 10;默认容量

      • 注意:如果没有向集合中添加任何元素时,容量0;添加一个元素后,容量10;每次扩容大小是原来的1.5倍

    • elementData存放元素数组

    • size实际元素个数

    • add()添加元素

Vector

  • 数组结构实现,查询快、增删慢。

  • JDK1.0版本,运行效率慢、线程安全。

LinkedList

  • 链表结构实现,增删快、查询慢。

4. 泛型

  • Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。

  • 常见形式有泛型类、泛型接口、泛型方法。

  • 语法:

    • <T,...>称为类型占位符,表示一种引用类型。

  • 好处:

    • 提高代码的重用性。

    • 防止类型转换异常,提高代码的安全性。

  • 泛型接口:

    • 语法:接口名<T>

    •  public interface MyInterface<T>{
        T method(T t);
       }
       
       public class MyGeneric implements MyInterface<String>{
       
       }
       //接口实现类泛型
       public class MyGeneric<T> implements MyInterface<T>{
       
       }
    • 注意:不能泛型静态常量

  • 泛型方法:

    • 语法:<T>返回值类型

    •  public <T> void method(T t){
       
       }
       
       public <T> T method(T t){
        return t;
       }
  • 泛型集合:

    • 概念:参数化 类型、类型安全的集合,强制集合元素的类型必须一致。

    • 特点:

      • 编译时即可检查,而非运行时抛出异常。

      • 访问时,不必类型转换(拆箱)。

      • 不同泛型之间引用不能相互赋值,泛型不存在多态。

5. Set

  • Set子接口:

    • 特点:无序,无下标、元素不可重复。

    • 方法:全部继承自Collection中的方法。

HashSet

  • 基于HashCode是实现元素不可重复。

  • 当存入元素的哈希码相同时,会调用equals进行确认,如结果为ture,则拒绝后者存入。

  • 存储结构:哈希表(数组+链表+红黑树)。

  • 存储过程:

    • 根据HashCode,计算保存位置,如果此位置为空,则直接保存,如果不为空执行第二步。

    • 再根据equals方法,如果equals方法为true,则认为是重复,否则形成链表。

TreeSet

  • 基于排列顺序实现元素不重复。

  • 实现了SortedSet接口,对集合元素自动排序。

  • 元素对象的类型实现Comparable接口,指定排序规则。

  • 通过CompareTo方法确定是否为重复元素。

  • 存储结构:红黑树

  • 使用TreeSet保存数据

    • 要求:元素必须要实现Comparable接口,并重写compareTo方法,方法返回值为0,认为是重复元素。

  • Comparator:实现定制比较(比较器)

    •  //创建集合,并指定比较规则
       TreeSet<T> obj = new TreeSet<T>(new Comparator<T>(){
        @Override
        public int compare(T t1,T t2){
        return ;
        }
       });

6. Map

image-20220404193051104

  • 特点:

    • 用于存储任意键值对(Key-Value)

    • 键:无序、无下标、不允许重复(唯一)

    • 值:无序、无下标、允许重复

  • 方法:

     V put(K key, V value)       //将对象存入到集合中,关联键值。key重复则覆盖原值。
     Object get(Object key) //根据键获取对应的值
     Set<K> //返回多有key
     Collection<V> values() //返回包含所有值的Collection集合
     Set<Map.Entry<K,V>> //键值匹配的Set集合
  • 遍历:

    //1.使用keySet();
    Set<T> keyset = map.keySet();
    //或
    for(T key : map.keySet()){

    }
    //2.使用entrySet()方法
    Set<Map.Entry<T,T>> entries = map.entryset();
    for(Map.Entry<T,T> entry : entries){
    entry.getKey();
    entry.getValue();
    }
    //entrySet效率高于keySet

HashMap

  • JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value。

  • 存储结构:哈希表(数组+链表+红黑树)

  • 使用key可hashcode和equals作为重复

  • 源码分析总结:

    • HashMap刚创建时,table时null,为了节省空间,当添加第一个元素时,table容量调整为16

    • 当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后大小为原来2倍。目的减少调整元素的个数。

    • jdk 1.8 当每个链表长度大于8,并且元素个数大于等于64时,会调整为红黑树,目的提高执行效率。

    • jdk 1.8 当链表长度小于6时,调整成链表。

    • jdk 1.8以前,链表是头插入, jdk 1.8以后是尾插入。

Hashtable

  • JDK 1.0版本,线程安全 ,运行效率慢;不允许null作为key或是value

Properties

  • Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。

TreeMap

  • 实现了SortedMap接口(是Map的子接口),可以对key自动排序。

 

Collections工具类

  • 概念:集合工具类,定义了除了存取以外的集合常用方法。

  • 方法:

    public static void reverse(List<?> list)	//反转集合中元素的顺序
    public static void shuffle(List<?> list) //随机重置集合元素的顺序
    public static void sort(List<T> list) //升序排序(元素类型必须实现Comparable接口)

 

总结

  • 集合的概念:

    • 对象的容器,和数组类似,定义了对多个对象进行操作的常用方法。

  • List集合:

    • 有序、有下标、元素可以重复。(ArrayList、LinkedList、Vector)

  • Set集合:

    • 无序、无下标、元素不可重复。(HashSet、TreeSet)

  • Map集合:

    • 存储一对数据,无序、无下标、,键不可重复,值可重复。(HashMap、TreeMap、HashTable)

  • Collections:

    • 集合工具类,定义除了存储以外的集合常用方法。

posted @ 2022-04-16 17:32  _Kalfin  阅读(38)  评论(0)    收藏  举报