Java进阶篇(三)——Java集合类
集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放。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集合类的更多相关文章
- java提高篇(三)-----java的四舍五入
Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- Java总结篇:Java多线程
Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...
- java提高篇-----理解java的三大特性之封装
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java进阶(四十)Java类、变量、方法修饰符讲解
Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...
- Java进阶篇(六)——Swing程序设计(上)
Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...
- Java进阶篇(六)——Swing程序设计(下)
三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...
- Java进阶篇(一)——接口、继承与多态
前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等. 本篇的主题是接口.继承与多态, ...
- Java进阶篇(五)——Java的I/O技术
程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...
随机推荐
- 无法打开文件“freeglut.lib”解决方法:
资源: 链接:https://pan.baidu.com/s/1eSctT5K 密码:174s VS2010问题: 无法打开文件"freeglut.lib"解决方法: (1)下载f ...
- Java并发之底层实现原理学习笔记
本篇博文将介绍java并发底层的实现原理,我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为 ...
- C#保留2位小数的做法
第一 算法实现 保留两位的话,就用一个浮点型先乘以100,然后取整,取整完了之后,再乘以1.0,然后再除以100. 上面这种做法是保留n位,不会四舍五入的.因为这 ...
- 通过pyenv和virtualenv创建多版本Python虚拟环境
虚拟环境使用第三方工具virtualenv创建,首先输入以下命令检查系统是否已经安装virtualenv. $ virtualenv --version 如果显示virtualenv版本号,则说明已经 ...
- HTML + CSS短标题(二,三,四文字长度)两端对齐的方式
今天切图碰到了一个看似好弄,却并不好弄的文本两端对齐问题.如图1-1
- 纯CSS二级纵向菜单
纯CSS二级纵向菜单 <body> <div class="divda"> <div class="nav"> <ul ...
- 【转】NO.2、Appium之IOS第一个demo
接第一篇:Appium之iOS环境搭建 http://blog.csdn.net/clean_water/article/details/52946191 这个实例继承了unittest,重写了它的s ...
- 【数论】洛谷P1372又是毕业季
题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...
- 使用xUnit为.net core程序进行单元测试(中)
第一部分: http://www.cnblogs.com/cgzl/p/8283610.html 下面有一点点内容是重叠的.... String Assert 测试string是否相等: [Fact] ...
- chromedriver对应的支持的Chrome版本(更新至Chrome63)
很多网友在配置chromedriver的时候会遇到很多麻烦,在网上找了很多资料觉得这个表格不错,就给大家分享出来,希望对大家配置chrome的时候有帮助: chromedriver版本 支持的Chro ...