一、概述

JAVA的集合框架中定义了一系列的类,这些类都是存储数据的容器。与数组、StringBuffer(StringBuilder)相比,它的特点是:

1.用于存储对象。

2.集合长度可变。

3.不可以存储基本数据类型。

比较三种容器的特点:

数组必须存放同一种元素。
StringBuffer必须转换成字符串才能使用,如果想拿出单独的一个元素几乎不可能。
数据有很多使用对象存,对象有很多,使用集合存。

集合容器因为内部的数据结构不同有多种具体容器,不断的向上抽取就形成了集合框架。
框架的顶层就是Collection接口。

二、Collection接口

Set接口和List接口都实现了Collection接口,因此很明显的,Collection接口中存放的是Set接口和List接口的共性内容。

Collection接口中的方法:

1.添加。

 boolean add(E e)
          确保此 collection 包含指定的元素(可选操作)。
 boolean addAll(Collection<? extends E> c)
          将指定
collection 中的所有元素都添加到此 collection 中(可选操作)。

其中,参数E可暂时理解为Object(实际上在JDK1.4之前使用的一直都是Object)。

2.删除

 boolean remove(Object o)
          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
 boolean removeAll(Collection<?> c)

          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
 void clear()
          移除此 collection 中的所有元素(可选操作)。

3.判断

 boolean contains(Object o)
          如果此 collection 包含指定的元素,则返回 true
 boolean containsAll(Collection<?> c)

          如果此 collection 包含指定 collection 中的所有元素,则返回 true
 boolean isEmpty()
          如果此 collection 不包含元素,则返回 true

4.获取。

 int size()
          返回此 collection 中的元素数。
Iterator<E> iterator()
          返回在此 collection 的元素上进行迭代的迭代器。

5.其它

 boolean retainAll(Collection<?> c)
          仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
 Object[] toArray()
          返回包含此 collection 中所有元素的数组。
<T>
T[]
toArray(T[] a)

          返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

这是比较常用的方法,还有一些继承的方法等略。

以上方法比较常用的还是存和取的方法。

6.代码示例:

  1. package p01.BaseCollectionDemo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.Iterator;
  6. public class CollectionDemo01 {
  7. public static void main(String args[])
  8. {
  9. //show1();
  10. //show2();
  11. //show3();
  12. //show4();
  13. show5();
  14.  
  15. }
  16. private static void show5() {
  17. /*
  18. * 演示retainAll、toArray方法
  19. */
  20. Collection coll=new ArrayList();
  21. coll.add("abc1");
  22. coll.add("abc2");
  23. coll.add("abc3");
  24. coll.add("abc4");
  25. System.out.println(coll);
  26. Collection coll1=new ArrayList();
  27. coll1.add("abc1");
  28. coll1.add("abc3");
  29. coll1.add("abc4");
  30. coll1.add("abc8");
  31. System.out.println(coll1);
  32.  
  33. System.out.println(coll.retainAll(coll1));
  34. System.out.println(coll);//与removeAll相反,只取相同的部分
  35.  
  36. }
  37. private static void show4() {
  38.  
  39. /*
  40. * 演示size、Iterator
  41. */
  42. Collection coll=new ArrayList();
  43. coll.add("abc1");
  44. coll.add("abc2");
  45. coll.add("abc3");
  46. coll.add("abc4");
  47. System.out.println(coll);
  48. System.out.println(coll.size());
  49. for(Iterator it=coll.iterator();it.hasNext();)
  50. {
  51. System.out.println(it.next());
  52. }
  53. }
  54. private static void show3() {
  55. /*
  56. * 演示contains、containsAll、isEmpty方法
  57. */
  58. Collection coll=new ArrayList();
  59. coll.add("abc1");
  60. coll.add("abc2");
  61. coll.add("abc3");
  62. coll.add("abc4");
  63. System.out.println(coll);
  64. Collection coll1=new ArrayList();
  65. coll1.add("abc5");
  66. coll1.add("abc6");
  67. coll1.add("abc7");
  68. coll1.add("abc8");
  69. System.out.println(coll1);
  70.  
  71. coll.addAll(coll1);
  72. System.out.println(coll);
  73.  
  74. System.out.println(coll.containsAll(coll1));
  75. System.out.println(coll.contains("abc1"));
  76. coll.remove("abc1");
  77. System.out.println(coll.contains("abc1"));
  78.  
  79. coll.clear();
  80. System.out.println(coll.isEmpty());
  81.  
  82. }
  83. private static void show2() {
  84. /*
  85. * 演示remove、removeAll、clear方法
  86. */
  87. Collection coll=new ArrayList();
  88. coll.add("abc1");
  89. coll.add("abc2");
  90. coll.add("abc3");
  91. coll.add("abc4");
  92. System.out.println(coll);
  93. Collection coll1=new ArrayList();
  94. coll1.add("abc5");
  95. coll1.add("abc6");
  96. coll1.add("abc7");
  97. coll1.add("abc8");
  98. System.out.println(coll1);
  99.  
  100. coll.addAll(coll1);
  101. System.out.println(coll);
  102.  
  103. coll.removeAll(coll1);
  104. System.out.println(coll);
  105.  
  106. coll.remove("abc1");
  107. System.out.println(coll);
  108.  
  109. coll.clear();
  110. System.out.println("打印集合元素:"+coll);
  111. }
  112. public static void show1()
  113. {
  114. /*
  115. * 演示add、addAll
  116. */
  117. Collection coll=new ArrayList();
  118. coll.add("abc1");
  119. coll.add("abc2");
  120. coll.add("abc3");
  121. coll.add("abc4");
  122. System.out.println(coll);
  123. Collection coll1=new ArrayList();
  124. coll1.add("abc5");
  125. coll1.add("abc6");
  126. coll1.add("abc7");
  127. coll1.add("abc8");
  128. System.out.println(coll1);
  129.  
  130. coll.addAll(coll1);
  131. System.out.println(coll);
  132. }
  133. }

三、迭代器。

1.遍历。

框架中有一个很重要的接口Iterator,使用这个接口可以遍历框架中其它所有的容器。在Collection接口中有一个方法为

 boolean removeAll(Collection<?> c)
          移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

使用这个方法可以得到实现了Iterator接口的对象,使用这个对象的hasNext方法以及Next方法就可以得到容器中所有的对象。

 boolean hasNext()
          如果仍有元素可以迭代,则返回 true
 E next()

          返回迭代的下一个元素。

两种遍历的方式很像,但是又有些不同,推荐使用第一种。

  1. package p01.BaseCollectionDemo;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.Iterator;
  6.  
  7. public class IteratorDemo {
  8.  
  9. public static void main(String[] args) {
  10. Collection coll=new ArrayList();
  11. coll.add("abc1");
  12. coll.add("abc2");
  13. coll.add("abc3");
  14. coll.add("abc4");
  15.  
  16. Demo01(coll);
  17. Demo02(coll);
  18.  
  19. }
  20.  
  21. private static void Demo02(Collection coll) {
  22. Iterator it=coll.iterator();
  23. while(it.hasNext())
  24. {
  25. System.out.print(it.next()+" ");
  26. }
  27. System.out.println();
  28. }
  29.  
  30. private static void Demo01(Collection coll) {
  31. for(Iterator it=coll.iterator();it.hasNext();)
  32. {
  33. System.out.print(it.next()+" ");
  34. }
  35. System.out.println();
  36. }
  37.  
  38. }

分析:第一种方式遍历集合的特点就是遍历完成之后迭代器对象会随着for循环结束而在内存中被清除;而第二种方式虽然达到了遍历的效果,但是循环结束之后迭代器所占用的内存并没有被释放,浪费了一部分内存。

2.迭代原理

由于每一种容器内部的数据结构可能都不同,只是用一种接口怎么才能达到遍历个各种容器的目的呢?

分析:容器内部都维护着一个实现了Iterator接口的对象,每个对象在容器内部的操作均不同(它们仅操作本类内部的成员),但是提供了同样的遍历方法:hasNext和Next,通过这两个方法,就可以得到容器内所有的对象了。也就是说Iterator对象必须依赖于具体的容器,因为每一种容器的数据结构都不相同。对于使用容器者而言,具体的实现并不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。Iterator接口也就是对所有Collection容器进行元素取出的公共接口。

通过查看源码即可证明:

Collection接口中声明了抽象方法iterator。

ArrayList则重写了这个方法:

我们比较在意的是Itr这个类,这个类通过返回类型可以得知是实现了Iterator接口的类:

由此,可以发现Itr类是ArrayList类的内部类。不仅ArrayList类,其它在Collection集合中的类都是这种实现方法。

四、List和Set概述。

List:列表。元素可以重复,有序(存入和取出有特定的顺序)。

Set:集合。元素不允许重复,无序(有时候有序,特别是经过特殊处理的时候比如在TreeSet中更是如此)。

注意:元素是否允许重复是List和Set的最大区别。

【JAVA集合框架之List与Set】的更多相关文章

  1. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  2. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  3. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  4. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  5. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

  6. 22章、Java集合框架习题

    1.描述Java集合框架.列出接口.便利抽象类和具体类. Java集合框架支持2种容器:(1) 集合(Collection),存储元素集合 (2)图(Map),存储键值对.

  7. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  8. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  9. Java集合框架

    集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...

  10. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

随机推荐

  1. Android圆角矩形创建工具RoundRect类

    用于把普通图片转换为圆角图像的工具类RoundRect类(复制即可使用): import android.content.Context; import android.graphics.Bitmap ...

  2. CCF 模拟D 动态规划

    http://115.28.138.223:81/view.page?opid=4 这道题写的我醉醉的,想建一棵指定深度的树最后统计满足条件的个数 居然没去考虑这样必然超时!!!代码写的也是醉了,把没 ...

  3. U盘安装ubuntu server 14.04

    U盘安装ubuntu server 14.04 U盘安装ubuntu server 14.04 1.制作启动u盘 2.开始安装 1 将u盘插入主机,重启后从u盘启动 2 选择语言(随便挑,随便选),我 ...

  4. c_水程序

    * ** This program reads input lines from the standard input and prints ** each input line, followed ...

  5. 代码高亮插件SyntaxHighlighter

    http://alexgorbatchev.com/SyntaxHighlighter/download/

  6. 1.8---字符串是否是旋转而成(CC150)

    答案:利用了XY , YX中第一个XYXY包含了第二个 public class Solution{ public static void main(String[] args){ System.ou ...

  7. PE355

    似乎我和lyx讨论过这题..? LP可解决..(~0.8s)

  8. Selenium FF WebDriver 遍历所有链接(另类爬虫)

    请看这个页面,我想要找到某个公告的内容,必须一个一个打开链接,尼玛好多啊. 于是,我机智的使用selenium打开每一个链接,然后把公告内容写入txt 那需要做一下步奏 1.依次打开一个公告 2.切换 ...

  9. XP共享连接数限制

  10. Divide and conquer:Median(POJ 3579)

        快速求两数距离的中值 题目大意:给你一个很大的数组,要你求两个数之间的距离的中值 二分法常规题,一个pos位就搞定的事情 #include <iostream> #include ...