一、对集合进行循环 (foreach 迭代、数组下表)
ArrayList:无序(没有任何规律) 【 数组下表 > foreach 迭代 】
LinkList: 有序 ( 前后有节点 ) 【 foreach 迭代 > 数组下表】
注释:因为迭代器 foreach 会判断有没有下一个元素 类似 a.hasenext() , 所以更适合有序的集合遍历
二、对集合进行 插入、删除、修改操作
删除、插入 使用 LinkList
修改 使用 ArrayList
原因:在进行删除、插入操作时,LinkList 只需要改变指针指向的位置即可,
而 ArrayList 插入时,需要将每个元素后移一位,即都copy了一遍 放在被插入元素后面,同理删除会前移一位 也会都copy
一 遍,故频繁的删除 插入不适合用 ArrayList
在进行修改 操作时, 因为要定为元素的位置,此时涉及遍历元素,所以 ArrayList 会更好些
三、进行 List 集合 排序(Comparable、Comparator)
实体类:
自定义 比较器:
测试类 代码块:
注解:Comparable接口可以作为实现类的默认排序算法,Comparator接口则是一个类的扩展排序工具
实现了Comparable接口的类 表明自身是可以比较的,有了比较才能进行排序,而Comparator接口是一个工具类接口,它的名字(比较器)也已经表明了它的作用:用作比较,它与原有类的逻辑没有关系,只是实现两个类的比较逻辑,从这方面来说,一个类可以有很多的比较器,只要有业务需求就可以产生比较器,有比较器就可以产生N多种排序,而Comparable接口的排序只能说是实现类的默认排序算法,一个类稳定、成熟后其compareTo方法基本不会变,也就是说一个类只能有一个固定的、由compareTo方法提供的默认排序算法
四、 集合 运算(并集、交集、差集)
以最原始的 list1的值为准线,5条执行结果分别是:
A,B,C,D,A
A
B
B
B,C,D,A
五、 集合大家族 总结
Java中的集合类实在是太丰富了,有常用的ArrayList、HashMap,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap,有阻塞式的ArrayBlockingQueue,也有非阻塞式的PriorityQueue等,整个集合大家族非常庞大,可以划分以下几类:
(1)、List:实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack,其中ArrayList是一个动态数组,LinkedList是一个双向链表,Vector是一个线程安全的动态数组,Stack是一个对象栈,遵循先进后出的原则。
(2)、Set:Set是不包含重复元素的集合,其主要实现类有:EnumSet、HashSet、TreeSet,其中EnumSet是枚举类型专用Set,所有元素都是枚举类型;HashSet是以哈希码决定其元素位置的Set,其原理与HashMap相似,它提供快速的插入和查找方法;TreeSet是一个自动排序的Set,它实现了SortedSet接口。
(3)、Map:Map是一个大家族,他可以分为排序Map和非排序Map,排序Map主要是TreeMap类,他根据key值进行自动排序;非排序Map主要包括:HashMap、HashTable、Properties、EnumMap等,其中Properties是HashTable的子类,它的主要用途是从Property文件中加载数据,并提供方便的操作,EnumMap则是要求其Key必须是某一个枚举类型。
Map中还有一个WeakHashMap类需要说明, 它是一个采用弱键方式实现的Map类,它的特点是:WeakHashMap对象的存在并不会阻止垃圾回收器对键值对的回收,也就是说使用WeakHashMap装载数据不用担心内存溢出的问题,GC会自动删除不用的键值对,这是好事。但也存在一个严重的问题:GC是静悄悄的回收的(何时回收,God,Knows!)我们的程序无法知晓该动作,存在着重大的隐患。
(4)、Queue:对列,它分为两类,一类是阻塞式队列,队列满了以后再插入元素会抛出异常,主要包括:ArrayBlockingQueue、PriorityQueue、LinkedBlockingQueue,其中ArrayBlockingQueue是一个以数组方式实现的有界阻塞队列;另一类是非阻塞队列,无边界的,只要内存允许,都可以持续追加元素,我们经常使用的是PriorityQuene类。
还有一种队列,是双端队列,支持在头、尾两端插入和移除元素,它的主要实现类是:ArrayDeque、LinkedBlockingDeque、LinkedList。
(5)、数组:数组与集合的最大区别就是数组能够容纳基本类型,而集合就不行,更重要的一点就是所有的集合底层存储的都是数组。