集合(单列)

Iterable

  Collection

    List  :1、元素有索引;2、允许重复;3、元素有序;

      ArrayList  :数组结构,所有元素都有索引,元素都是连续的内存空间;

            :查询快;增删慢(增删一个元素将会影响所有元素索引)

      LinkedList   :链表结构,由链子连接起来的一堆节点(上一个节点地址值、本节点值、下一个节点地址值)

               :查询慢;增删快。

      Vector    :线程安全。

    Set  :1、元素无索引;2、不许重复;3、元素无序;

      AbstractSet

        TreeSet  :实现排序

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。
obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。
如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0
定制排序
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

      HashSet  :哈希表结构;1、不能保证元素的排列顺序,顺序有可能发生变化;2、 不是同步的;3、集合元素可以是null,但只能放入一个null;(底层基于HashMap实现)

              HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等
              注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回                                                   true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

        LinkedHashSet  :哈希表和链表结构的结合;底层基于LinkedHashMap实现;

              LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存                                                       的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
                                                 LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

(接口抽象类实现类)


LinkedList 特有功能api:

  

void addFirst(E e)
void addLast(E e)
E getFirst()
E getLast()
E removeFirst()
E removeLast()

ListIterator && Iterator &&Iterable的区别:

  Iterator迭代器包含的方法有:

    hasNext():如果迭代器指向位置后面还有元素,则返回 true,否则返回false

    next():返回集合中Iterator指向位置后面的元素

    remove():删除集合中Iterator指向位置后面的元素

  ListIterator迭代器包含的方法有:

      add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前

    hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回 true,否则返回false

    hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false

    next():返回列表中ListIterator指向位置后面的元素

    nextIndex():返回列表中ListIterator所需位置后面元素的索引

    previous():返回列表中ListIterator指向位置前面的元素

    previousIndex():返回列表中ListIterator所需位置前面元素的索引

    remove():从列表中删除next()或previous()返回的最后一个元素(有点拗口,意思就是对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除ListIterator指向位置前面的元素)

    set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e

  Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的。able结尾的表示 能...样,可以做...。
  Iterator:   在英语中or 结尾是都是表示 ...样的人 or ... 者。如creator就是创作者的意思。这里也是一样:iterator就是迭代者,我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是Iterator接口规范的。

一.相同点

都是迭代器,当需要对集合中元素进行遍历不需要干涉其遍历过程时,这两种迭代器都可以使用。

二.不同点

1.使用范围不同,Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。

2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。

3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。

4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。

以上所述是小编给大家介绍的JAVA中ListIterator和Iterator详解与辨析(推荐),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!


当对集合进行迭代的时候如果要对集合进行删除或者修改,需要使用迭代器来删除或者修改,不能通过集合来删除或修改,会发生并发修改异常ConcurrentModificationException,这是 因为在底层基本上Collection采用size属性来维护自已的状态,而Iterator采用cursor来来维护自已的状态。

当size出现变化时,cursor并不一定能够得到同步,除非这种变化是Iterator主动导致的。

 1 public static void main(String args[]) {
 2     List<String> famous = new ArrayList<String>();
 3     famous.add("liudehua");
 4     famous.add("madehua");
 5     famous.add("liushishi");
 6     famous.add("tangwei");
 7     for (String s : famous) {
 8         if (s.equals("madehua")) {
 9             famous.remove(s);
10         }
11     }
12 }

从上面的代码可以看到当Iterator.remove方法导致ArrayList列表发生变化时,他会更新cursor来同步这一变化。但其他方式导致的ArrayList变化,Iterator是无法感知的。ArrayList自然也不会主动通知Iterator们,那将是一个繁重的工作。Iterator到底还是做了努力:为了防止状态不一致可能引发的无法设想的后果,Iterator会经常做checkForComodification检查,以防有变。如果有变,则以异常抛出,所以就出现了上面的异常。

 如果对正在被迭代的集合进行结构上的改变(即对该集合使用add、remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModificationException异常被抛出).

如果使用迭代器自己的remove方法,那么这个迭代器就仍然是合法的。


Collections集合工具类常用api示例

 1 public class CollectionsTest {
 2 
 3     public static void main(String[] args) {
 4         List<Integer> list = new ArrayList<Integer>();
 5         list.add(34);
 6         list.add(55);
 7         list.add(56);
 8         list.add(89);
 9         list.add(12);
10         list.add(23);
11         list.add(126);
12         System.out.println(list);
13 
14         //对集合进行排序
15         Collections.sort(list);
16         System.out.println(list);
17 
18         //对集合进行随机排序
19         Collections.shuffle(list);
20         System.out.println(list);
21 
22         //获取集合最大值、最小值
23         int max = Collections.max(list);
24         int min = Collections.min(list);
25         System.out.println("Max:" + max + " Min: " + min);
26 
27         List<String> list2 = Arrays.asList("Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday".split(","));
28         System.out.println(list2);
29 
30         //查找集合指定元素,返回元素所在索引
31         //若元素不存在,n表示该元素最有可能存在的位置索引
32         int index1 = Collections.binarySearch(list2, "Thursday");
33         int index2 = Collections.binarySearch(list2, "TTTTTT");
34         System.out.println(index1);
35         int n = -index2 - 1;
36 
37         //查找子串在集合中首次出现的位置
38         List<String> subList = Arrays.asList("Friday,Saturday".split(","));
39         int index3 = Collections.indexOfSubList(list2, subList);
40         System.out.println(index3);
41         int index4 = Collections.lastIndexOfSubList(list2, subList);
42         System.out.println(index4);
43 
44         //替换集合中指定的元素,若元素存在返回true,否则返回false
45         boolean flag = Collections.replaceAll(list2, "Sunday", "tttttt");
46         System.out.println(flag);
47         System.out.println(list2);
48 
49         //反转集合中的元素的顺序
50         Collections.reverse(list2);
51         System.out.println(list2);
52 
53         //集合中的元素向后移动k位置,后面的元素出现在集合开始的位置
54         Collections.rotate(list2, 3);
55         System.out.println(list2);
56 
57         //将集合list3中的元素复制到list2中,并覆盖相应索引位置的元素
58         List<String> list3 = Arrays.asList("copy1,copy2,copy3".split(","));
59         Collections.copy(list2, list3);
60         System.out.println(list2);
61 
62         //交换集合中指定元素的位置
63         Collections.swap(list2, 0, 3);
64         System.out.println(list2);
65 
66         //替换集合中的所有元素,用对象object
67         Collections.fill(list2, "替换");
68         System.out.println(list2);
69 
70         //生成一个指定大小与内容的集合
71         List<String> list4 = Collections.nCopies(5, "哈哈");
72         System.out.println(list4);
73 
74         //为集合生成一个Enumeration
75         List<String> list5 = Arrays.asList("I love my country!".split(" "));
76         System.out.println(list5);
77         Enumeration<String> e = Collections.enumeration(list5);
78         while (e.hasMoreElements()) {
79             System.out.println(e.nextElement());
80         }
81     }
82 }
View Code

Comparable&& Comparetor  比较器

Comparable 是给要排序的实体本身实现的接口,而 Comparator 则是第三方。

比如:类 A 实现了 Comparable 接口,表示它可以和另一个 A 比较来达到排序的目的。
但,假设用户想点击按钮“按名字排序”,之后他又想“按QQ号排序”,这样的需求我们用 Comparable 是无法同时满足两种情况的,那么我们就需要第三方 Comparator,当我们在使用 Collections.sort() 方法时传递这个 Comparator 让它来排序。因此 Comparable 里面的方法只需要 1 个参数,因为另一个参数就是这个 A 类实例自己,而 Comparator 需要 2 个参数,它是第三方比较器,接收 2 个参数。

原文地址:https://www.cnblogs.com/laodang/p/9853589.html