Java集合可以分为Collection与Map两个体系

  • Collection接口:单列集合,用来存储一个个的对象

    • list接口:存储有序的,可以重复的数据 “动态数组。也需要重写equals方法

      • ArrayList:作为List接口的主要实现类;线程不安全,效率高;底层使用Object[] elementtype存储
      • LinedList:对于频繁的插入,删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
      • Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementtype存储
    • Set接口:存储无序的,不可重复的数据(无序性:不是随机存储,存储的数据不是按照添加的顺序存储在底层数组,而是根据数据的哈希值。 不可重复性:包子添加的元素按照equals判断时,不能返回true,相同的元素只能有一个)
      要求:向Set中添加的数据,其所在的类一定要重写hashCode()和equals()

      • HashSet. 底层:数组+链表的结构。作为set接口的主要实现类;线程不安全的;可以存储null值
        添加元素的过程,以hashset为例:
        我们向HAshset中添加元素a,首先调用a所在类的HashCode()方法,计算出a的哈希值,此哈希值可以通过某种算法计算出其在HASHSET底层数组中的存放位置(即索引位置),判断数组此位置上是否有其他元素:
        如没有,则添加成功------>情况1
        如果有其他元素b,则比较二者的哈希值
        如果二者的哈希值不相同,则元素a添加成功------>情况2
        如果哈希值相同,今儿调用a所在类的equals方法:
        equals方法返回true,元素a添加失败
        equals方法返回false,元素a添加成功------>情况3
        对于情况23而言:元素a与已经存在指定索引位置上数据以链表的方式存储
        jdk7:元素a放到数组中,指向原来的元素
        jdk8:原来的元素放在数组中,指向元素a

      • LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历
        在添加数据的同时,每个数据还维护了两个引用,记录次数据前一个数据和后一个数据,对于频繁的遍历操作,LinkedHashSet效率高于HashSet

      • TreeSet:同一个类new的才能放进去 可以按照添加对象的指定属性,进行排序 红黑树(自然排序和定制排序)自然排序(实现COmparato接口),比较两个对象是否相同的标准为:ComparaTo()返回0,不再是equals()

  • Map接口:双列集合,用来存储(key-value)对的数据

    • HashMap:作为主要的实现类;线程不安全,效率高;存储null的key和value

      • LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序来实现遍历
        原因:在原有的HAshmap底层结构基础上,添加了一堆指针,指向前一个和后一个。对于频繁的遍历操作,此类执行效率高于hashmap
        • TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序底层使用红黑树
    • Hashtable:古老的实现类;线程安全,效率低;不能存储null的key和value
      Properties:常用来处理配置文件。key和value都是String型
      HashMap的底层:数组➕链表(jdk7及之前) 数组+链表+红黑树(jdk8)

      • Map结构的理解:
        Map 的key:无序的,不可重复的,使用set存储所有的key。---->key所在的类要重写equals和hashcode
        Map的value:无序的,可重复的,使用Collection存储所有的value---->value所在的类要重写equals
        一个键值对:key-value构成了一个entry对象
        Map的entry:无序的,不可重复的,使用set存储所有的entry

迭代器遍历list
Interator<integer> interator=list.iterator();
while(iterator.hasNext()){
int stuSoce=iterator.next();
System.out.println(stuScore);
}</integer>

ArrayList,LinkedList,Vector 的异同
同:都是实现了list接口,存储数据的特点相同:存储有序的,可重复的数据
不同: