集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放。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迭代器

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

 import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class CollectionDemoList { public static void main(String[] args) {
String aString = "A", bString = "B", cString = "C", dString = "D", eString = "E"; List<String> list = new LinkedList<>(); // 创建list集合对象
list.add(aString); // 向集合中添加元素
list.add(bString);
list.add(eString);
// 输出语句,用迭代器
Iterator<String> iter = list.iterator(); // 创建集合迭代器
while(iter.hasNext()) { // 遍历集合中的元素
System.out.print(iter.next() + " ");
} System.out.println(); // 换行
list.set(1, cString); // 将索引位置1的对象修改为对象bString
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.print(it.next() + " ");
}
} }

  上述代码中,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集合中并除掉重复值。

 import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set; public class CollectionDemoSet { public static void main(String[] args) {
List<String> list = new ArrayList<>(); // 创建List集合对象
list.add("dog");
list.add("cat");
list.add("fish");
list.add("cat"); //重复值 Set<String> set = new HashSet<>(); // 创建List对象集合
set.addAll(list); // 将List集合对象添加到Set集合中
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.print(it.next() + " ");
}
} }

  同理,创建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集合

  下面看一个例子。

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

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

  

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

二、集合类接口的实现类

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

  1. List接口的实现类

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

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

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

List list1 = new ArrayList();
List list2 = new LinkedList();

  2. Set接口的实现类

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

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

  3. Map接口的实现类

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

  实现如下:

Map map = new HashMap();
Map map = new TreeMap();

三、迭代器

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

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

  上述代码用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. Java内存分配以及GC

    转自http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html  写的太棒了,简单易懂 Java垃圾回收概况 Java GC(Gar ...

  2. Python新式类继承的C3算法

    在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClas ...

  3. MySQL 行锁 表锁机制

    MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁 ...

  4. 深入研究ES6 Generators

    ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发 如果你还不知道 ...

  5. Mac下安装ant(利用brew)

    安装ant最简单的方法就是通过brew.步骤如下:1. 安装brew(如果已经安装可以跳过这步). ruby -e "$(curl -fsSL https://raw.github.com/ ...

  6. 【转】WEB测试要点总结

    一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符"~!@# ¥%--&*?[]{}"特别要注意单引号和&符号.禁止 ...

  7. PHP拓展配置redis、phalcon

    PHPinfo查看php信息 标记部分对应下载版本ts和nts和vc版本 window x64 php7.0-ts-vc14拓展地址,下载相应的dll就行https://pecl.php.net/pa ...

  8. python之dictionary

    1.python3字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 d ...

  9. 【转载】Linux cgroup资源隔离各个击破之 - cpu隔离1

    Linux cgroup 有两个子系统支持CPU隔离.一个是cpu子系统,另一个是cpuset子系统. cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法 .1. 完全公平调度 Comp ...

  10. JavaScript es2015经验基础总结

    一.作用域 var和es6中的let 的区别. 1.var 是JavaScript中定义全局变量的关键字 2.let 是es6语法中定义变量的关键字 但是let的变量是块级作用域(只能在自己的块里面使 ...