集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放。Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对集合进行遍历。

  集合的长度是可变的,用来存放对象的引用。常见的集合类有List集合、Set集合、Map集合。

一.集合类接口

  以下接口的常用方法有很多,这里只提其中重要的几个方法,其它方法在使用时可参照API。

  1. List接口

  List是列表类型,以线性方式存储对象,自身的方法都与索引有关,个别常用方法如下。

方法 返回值 功能描述
add(int index, Object obj) void 用来向集合中的指定索引位置添加对象,集合的索引位置从0开始,其他对象的索引位置相对向后移一位
set(int index, E element) Object 用指定元素替换列表中指定位置的元素,返回以前在指定位置的元素
indexOf(Object obj) int 返回列表中对象第一次出现的索引位置,如果集合中不包含该元素则返回-1
lastIndexOf(Object obj) int 返回列表中对象最后一次出现的索引位置,如果集合汇总不包含该元素则返回-1
listIterator() ListIterator 用来获得一个包含所有对象的ListIterator迭代器

  下面举一个实例,看看如何创建并添加修改集合元素。

  1. import java.util.Iterator;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4.  
  5. public class CollectionDemoList {
  6.  
  7. public static void main(String[] args) {
  8. String aString = "A", bString = "B", cString = "C", dString = "D", eString = "E";
  9.  
  10. List<String> list = new LinkedList<>(); // 创建list集合对象
  11. list.add(aString); // 向集合中添加元素
  12. list.add(bString);
  13. list.add(eString);
  14. // 输出语句,用迭代器
  15. Iterator<String> iter = list.iterator(); // 创建集合迭代器
  16. while(iter.hasNext()) { // 遍历集合中的元素
  17. System.out.print(iter.next() + " ");
  18. }
  19.  
  20. System.out.println(); // 换行
  21. list.set(1, cString); // 将索引位置1的对象修改为对象bString
  22. Iterator<String> it = list.iterator();
  23. while(it.hasNext()) {
  24. System.out.print(it.next() + " ");
  25. }
  26. }
  27.  
  28. }

  上述代码中,add()方法用于向集合中添加元素,set()方法用于修改集合中的元素,迭代器用于遍历集合中的元素并输出(会在下面的内容中涉及)。运行结果如下:

  

  其中创建List集合对象时,“<>”中是集合汇总元素的类型,如上方的String表示集合中的元素由String字符串构成。因为List是一个接口,所以new的是接口的实现类,在Eclipse中光标放在List上按Ctrl+T就可以看见List接口的所有实现类了。

  2. Set接口

  Set接口常用方法如下。

方法 返回值 功能描述
add(Object obj) boolean 若集合中尚存在未指定的元素,则添加此元素
addAll(Collection col) boolean 将参数集合中所有元素添加到集合的尾部
remove(Object obj) boolean 将指定的参数对象移除
clear() void 移除此Set中的所有元素
iterator() Iterator 返回此Set中的元素上进行迭代的迭代器
size() int 返回此Set集合中的所有元素数
isEmpty() boolean 如果Set不包含元素,则返回true

  下面看一个例子,用addAll()方法把List集合对象存入到Set集合中并除掉重复值。

  1. import java.util.ArrayList;
  2. import java.util.HashSet;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Set;
  6.  
  7. public class CollectionDemoSet {
  8.  
  9. public static void main(String[] args) {
  10. List<String> list = new ArrayList<>(); // 创建List集合对象
  11. list.add("dog");
  12. list.add("cat");
  13. list.add("fish");
  14. list.add("cat"); //重复值
  15.  
  16. Set<String> set = new HashSet<>(); // 创建List对象集合
  17. set.addAll(list); // 将List集合对象添加到Set集合中
  18. Iterator<String> it = set.iterator();
  19. while(it.hasNext()) {
  20. System.out.print(it.next() + " ");
  21. }
  22. }
  23.  
  24. }

  同理,创建Set对象集合时,Set是一个接口,new的是接口的实现类。运行结果如下:

  

  由于Set集合中的对象是无序的,遍历Set集合的结果与插入Set集合的顺序并不相同。

  3. Map接口

  Map接口提供了将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射一个值。Map接口同样提供了clear()、isEmpty()、size()等方法,还有一些常用方法如下。

方法 返回值 功能描述
put(key k, value v) Object 向集合中添加指定的key与value的映射关系
get(Object key) boolean 如果存在指定的键对象,则返回该对象对应的值,否则返回null
values() Collection 返回该集合中所有值对象形成的Collection集合

  下面看一个例子。

  1. import java.util.HashMap;
  2. import java.util.Map;
  3.  
  4. public class MapDemo {
  5.  
  6. public static void main(String[] args) {
  7. Map<String, String> map = new HashMap<>(); // 创建Map集合
  8. map.put("1", "dog");
  9. map.put("2", "cat");
  10. map.put("3", "fish");
  11. for(int i=1; i<=3; i++) {
  12. System.out.println("第" + i + "个元素是:" + map.get("" + i + ""));
  13. }
  14. }
  15.  
  16. }

  具体写法参照上例即可。运行结果如下:

  

  创建Map集合时,Map接口的“<>”中含有两个类型,分别对应其key与value。

二、集合类接口的实现类

  上面在定义一个接口时,都有new一个实现类,下面介绍几种常用的实现类。

  1. List接口的实现类

  List接口的实现类常用的有ArrayList和LinkedList,这两个实现类在上面的例子中已经出现过了。

  ArrayList类实现了可变的数组,可以根据索引位置对集合进行快速的随机访问。LinkedList类采用链表结构保存对象,便于向集合中插入和删除对象。对于线性结构和链式结构不清楚的朋友可以看我之前的博客“数据的存储结构”,链接:http://www.cnblogs.com/adamjwh/p/5829604.html,也可以自行查阅资料。

  分别通过ArrayList和LinkedList类实例化List集合如下:

  1. List list1 = new ArrayList();
  2. List list2 = new LinkedList();

  2. Set接口的实现类

  Set接口的实现类常用的有HashSet和TreeSet,实现如下:

  1. Set<String> set1 = new HashSet<String>();
  2. Set<String> set2 = new TreeSet<String>();

  3. Map接口的实现类

  Map接口的实现类常用的有HashMap和TreeMap,建议使用HashMap(效率相对较高)。

  实现如下:

  1. Map map = new HashMap();
  2. Map map = new TreeMap();

三、迭代器

  迭代器是利用Iterator接口创建的,在上面已经出现过了。如下是上方Set接口中的代码:

  1. Iterator<String> it = set.iterator(); // 创建一个迭代器
  2. while(it.hasNext()) {
  3. System.out.print(it.next() + " ");
  4. }

  上述代码用Iterator接口和iterator()方法创建了一个迭代器;用while循环遍历这个集合,hasNext()方法是循环判断条件,即如果有元素可以迭代,返回true,循环继续执行;next()方法是返回迭代的下一个元素。除了这两个方法外,Iterator接口还有一个方法是remove(),用于从迭代器指向的collection中移除迭代器返回的最后一个元素。

Java进阶篇(三)——Java集合类的更多相关文章

  1. java提高篇(三)-----java的四舍五入

    Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...

  2. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  3. Java总结篇:Java多线程

    Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...

  4. java提高篇-----理解java的三大特性之封装

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  5. Java进阶(四十)Java类、变量、方法修饰符讲解

    Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...

  6. Java进阶篇(六)——Swing程序设计(上)

    Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...

  7. Java进阶篇(六)——Swing程序设计(下)

    三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...

  8. Java进阶篇(一)——接口、继承与多态

    前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等. 本篇的主题是接口.继承与多态, ...

  9. Java进阶篇(五)——Java的I/O技术

    程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...

随机推荐

  1. ORA-00600[17059]错误

    ORA-00600[17059] ORA-00600[17059]错误大部分都是因为高版本导致,对于本库的分析:因为该库的 shared pool老化比较频繁,到我介入的时候,发现相关该类此sql已经 ...

  2. Vue 爬坑之路(八)—— 使用 Echarts 创建图表

    在后台管理系统中,图表是一个很普遍的元素.目前常用的图标插件有 charts,  Echarts, highcharts.这次将介绍 Echarts 在 Vue 项目中的应用. 一.安装插件 使用 c ...

  3. mycat安装与配置

    1.安装jdk 测试jdk是否已经安装 [root@node002 ~]# java -version-bash: java: command not found 创建解压目录 [root@node0 ...

  4. SQL Server-聚焦WHERE Column=@Param OR @Param IS NULL有问题?

    前言 上一篇我们讲完SQL动态查询,本节我们继续来讲解SQL动态查询中存在的问题. SQL动态查询条件筛选过滤 当我们创建存储过程调用存储过程时,若筛选条件有值则过滤,没有值则返回所行记录,类似如下查 ...

  5. 如何处理导出的csv无法查看身份证后三位的情况?

    如何处理导出的csv无法查看身份证后三位的情况? 原因:excel中如果是常规格式无法显示那么多位数,改成文本格式就可以. 简单步骤,导入数据------>选择数据来源------>选择编 ...

  6. 关于React中状态保存的研究

    在使用react搭配react-router做应用的时候,你可能遇到这样的问题,当我从第一个页面过渡到第二个页面,然后返回之后,发现之前的页面的状态全部不见了,即回到了初始的状态. 这点在页面存在多个 ...

  7. java_web学习(五) JSTL标准标签库

    1.什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  8. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

    "/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...

  9. 使用c语言实现linux数据库的操作

    前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作. 使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据 ...

  10. sql针对某一字段去重,并且保留其他字段

    今天客户提了一个小需求,希望我能提供一条sql语句,帮助他对数据中 _field 这个字段的值去重,并且保留其他字段的数据.第一反应是select distinct,但这种语句在对某个字段去重时,无法 ...