【JAVA集合框架之List与Set】
一、概述
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 中所有元素的数组。 |
|
|
toArray(T[] a)返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
这是比较常用的方法,还有一些继承的方法等略。
以上方法比较常用的还是存和取的方法。
6.代码示例:
package p01.BaseCollectionDemo; import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo01 {
public static void main(String args[])
{
//show1();
//show2();
//show3();
//show4();
show5(); }
private static void show5() {
/*
* 演示retainAll、toArray方法
*/
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll);
Collection coll1=new ArrayList();
coll1.add("abc1");
coll1.add("abc3");
coll1.add("abc4");
coll1.add("abc8");
System.out.println(coll1); System.out.println(coll.retainAll(coll1));
System.out.println(coll);//与removeAll相反,只取相同的部分 }
private static void show4() { /*
* 演示size、Iterator
*/
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll);
System.out.println(coll.size());
for(Iterator it=coll.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
private static void show3() {
/*
* 演示contains、containsAll、isEmpty方法
*/
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll);
Collection coll1=new ArrayList();
coll1.add("abc5");
coll1.add("abc6");
coll1.add("abc7");
coll1.add("abc8");
System.out.println(coll1); coll.addAll(coll1);
System.out.println(coll); System.out.println(coll.containsAll(coll1));
System.out.println(coll.contains("abc1"));
coll.remove("abc1");
System.out.println(coll.contains("abc1")); coll.clear();
System.out.println(coll.isEmpty()); }
private static void show2() {
/*
* 演示remove、removeAll、clear方法
*/
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll);
Collection coll1=new ArrayList();
coll1.add("abc5");
coll1.add("abc6");
coll1.add("abc7");
coll1.add("abc8");
System.out.println(coll1); coll.addAll(coll1);
System.out.println(coll); coll.removeAll(coll1);
System.out.println(coll); coll.remove("abc1");
System.out.println(coll); coll.clear();
System.out.println("打印集合元素:"+coll);
}
public static void show1()
{
/*
* 演示add、addAll
*/
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll);
Collection coll1=new ArrayList();
coll1.add("abc5");
coll1.add("abc6");
coll1.add("abc7");
coll1.add("abc8");
System.out.println(coll1); coll.addAll(coll1);
System.out.println(coll);
}
}
三、迭代器。
1.遍历。
框架中有一个很重要的接口Iterator,使用这个接口可以遍历框架中其它所有的容器。在Collection接口中有一个方法为
boolean |
removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
使用这个方法可以得到实现了Iterator接口的对象,使用这个对象的hasNext方法以及Next方法就可以得到容器中所有的对象。
boolean |
hasNext() 如果仍有元素可以迭代,则返回 true。 |
E |
next()返回迭代的下一个元素。 |
两种遍历的方式很像,但是又有些不同,推荐使用第一种。
package p01.BaseCollectionDemo; import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class IteratorDemo { public static void main(String[] args) {
Collection coll=new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4"); Demo01(coll);
Demo02(coll); } private static void Demo02(Collection coll) {
Iterator it=coll.iterator();
while(it.hasNext())
{
System.out.print(it.next()+" ");
}
System.out.println();
} private static void Demo01(Collection coll) {
for(Iterator it=coll.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
System.out.println();
} }
分析:第一种方式遍历集合的特点就是遍历完成之后迭代器对象会随着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】的更多相关文章
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
- 22章、Java集合框架习题
1.描述Java集合框架.列出接口.便利抽象类和具体类. Java集合框架支持2种容器:(1) 集合(Collection),存储元素集合 (2)图(Map),存储键值对.
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- (转)Java集合框架:HashMap
来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...
- Java集合框架
集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...
- Java集合框架(常用类) JCF
Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...
随机推荐
- phpcms调用某个栏目下的所有二级栏目
在html中直接这样调用就可以了,subcat中的值为父栏目的catid {loop subcat(93) $r}{/loop} 注意subcat方法的参数,如果只写一个参数,也就是父栏目id,那该父 ...
- 《转》---google面经
我面的职位是Softwre Engineer, Tools and Infrastracture, 所以开发和测试的问题都会问到 Phone interview 1:白人小哥.给一个Interval的 ...
- 小波变换C++实现(一)----单层小波变换
文章转自: http://www.cnblogs.com/IDoIUnderstand/archive/2013/03/30/3280724.html [小波变换]STL版 一维离散小波变换(DWT) ...
- POJ 3414
http://poj.org/problem?id=3414 这是一个广搜的题目,不难,就是有些许麻烦.对于练习还是个不错的题目. 题意就是给你两个杯子,这两个杯子的容量分别为a和b,要你通过一些操作 ...
- C++实现VPN工具之VPN错误代码大全
该篇文章转自:<VPN问题全攻略>http://home.51.com/h012359/diary/item/10008457.html 以下是使用VPN版软件中常见的一些错误代码: 1. ...
- NGUI Table页(UIToggle和UIToggledObjects)
1.添加两个按钮Btn1和Btn2.添加2个Spr1和Spr2 2.给每个Btn添加两个脚本UIToggle和UIToggledObjects 3.将每个UIToggle的Group设置个非0的值 4 ...
- MySQL Plugin 'InnoDB' init function returned error
. . 在MySQL的配置文件中,设定default-table-type=InnoDB,发现MySQL无法正常的启动,错误日志中给出了如下的信息: 150210 18:11:19 mysqld_sa ...
- HTML DOM scale() 方法
语法 scale(sx, sy) 参数 参数 描述 sx, sy 水平和垂直的缩放因子. 描述 scale() 方法为画布的当前变换矩阵添加一个缩放变换.缩放通过独立的水平和垂直缩放因子来完成.例如, ...
- mybatis反向生成sql,基本的增删改查
用到的几个文件 MyBatisGeneratorProxy.java package com.timestech.wsgk.test.tools; import static org.mybatis. ...
- Linux系统安装时分区的选择(推荐)
Linux系统安装时分区的选择(推荐) 出处:http://www.cnblogs.com/gylei/archive/2011/12/04/2275987.html 前言: 以前初识Linux时, ...