`

Java核心技术卷I -- 第13章 集合

 
阅读更多

1. 集合接口和迭代器接口

1.1 接口

集合类基本接口: Collection,包括boolean add(E element);和Iterator<E> iterator();等方法

迭代器接口: Iterator,包括next(); hasNext(); remove();等方法

Collection<String> c = ...;

Iterator<String> iter = c.iterator();

while (iter.hasNext()) {

String element = iter.next();

do something with element

}

1.2 移除元素

当Iterator进行remove操作时,一定要使用next()方法跳过该元素,然后才执行remove操作

Iterator<String> it = c.iterator();

it.next(); //跳过第一个元素

it.remove(); //删除第一个元素

同样,如果需要删除2个相邻元素,你需要这么使用

it.next();

it.remove();

it.next();

it.remove();

1.3 java.util.Collection<E>方法

Iterator<E> iterator(): 返回一个迭代器,用于访问集合中的各个元素

int size(): 存放集合中元素数量

boolean isEmpty(): 如果没有元素,返回true

boolean contains(Object obj): 该集合中包含一个与obj相等的对象,返回true

boolean containsAll(Collection<?> other): 该集合包含了other集合中所有元素,返回true

boolean add(Object element): 添加一个元素

boolean addAll(Collection<? extends E> other): 将other中所有元素添加到集合

boolean remove(Object obj): 移除该集合中与obj相等的对象

boolean removeAll(Collection<?> other): 移除other中所有元素

void clear(): 移除该集合中所有元素

boolean retainAll(Collection<?> other): 移除所有与other众元素不相等的所有元素

Object[] toArray(): 返回该集合数组

2. 集合概述

List、Set、Queue实现了Collection接口,而Map接口则为另一种实现

2.1 Collection - List

ArrayList: 可以动态增长和减缩的索引序列

LinkedList: 可以在任何位置进行高效插入和移除的有序序列

2.2 Collection - Set

HashSet: 没有重复元素的无序集合

TreeSet: 有序集

EnumSet: 包含枚举类型元素集

LinkedHashSet: 可以记住元素被插入顺序的集合

2.3 Collection - Queue

PriorityQueue: 可以高效的移除最小元素的集合

2.4 Map

HashMap: 一种存储键/值关联的结构

TreeMap: 键有序的map集合

EnumMap: 键属于枚举类型的map集合

LinkedHashMap: 可以记住键/值被添加顺序的map集合

WeakHashMap: 该map集合中的值如果没有在其他地方使用,则被垃圾回收器回收

IdentityHashMap: 该map集合中的键使用==,而不是用equals来进行比较

3. LinkedList(链表)

链表可以在队列前、中间、后方便的插入元素

3.1 和Iterator同时使用

List<String> staff = new LinkedList<String>();

staff.add("Amy");

staff.add("Bob");

staff.add("Carl");

Iterator iter = staff.iterator();

String first = iter.next();

String second = iter.next();

iter.remove(); //删除第二个元素Bob

3.2 在任意位置插入元素

List<String> staff = new LinkedList<String>();

staff.add("Amy");

staff.add("Bob");

staff.add("Carl");

ListIterator iter = staff.listIterator(); //listIterator有add方法,可以方便的在链表中添加元素

iter.next();

iter.add("Juliet"); //添加元素Juliet在Bob前

而ListIterator还存在previous()和hasPrevious()方法,和next()与hasNext()相对应

不同在同一行中调用两次remove方法,必须有next()或者previous()

3.3 使用set方法用新值取代原来的值

String oldValue = iter.next(); //返回第一个元素

iter.set(newValue); //设置第一个元素到新的值

3.4 如果多个迭代器对同一链表操作

如果该集合的元素被一个迭代器删除,而另外一个迭代器需要访问,那么将有ConcurrentModifiactionException异常

4. ArrayList(数组列表)

两种方式来访问元素,一种迭代器,一种get和set方法来访问,后一种对ArrayList适用。Vector是同步的,ArrayList是异步,所以访问ArrayList的速度比Vector快。

5. HashSet(散列集)

散列集没有顺序,它是通过HashCode来查找该元素的位置,使用add方法添加元素到散列表中,使用contains查看是否包含某个对象。

6. TreeSet(树集)

6.1 树集合散列集相似,但是树集是一个有序集合,可以按照任何顺序插入元素,但是进行迭代时,各个值会自动排序

SortedSet<String> sorter = new TreeSet<String>();

sorter.add("Bob");

sorter.add("Amy");

sorter.add("Carl");

for (String s : sorter) System.println(s);

打印顺序为 Amy Bob Carl

树集添加元素的速度小于散列集 ,但还是大于数组和链表

6.2 TreeSet是实现了Comparable接口,然后进行排序的,如果需要实现自己的排序方式,那么需要重新实现Comparable接口,然后再构造器中提供Comparator对象

7. PriorityQueue(优先级队列)

能够以任意顺序插入元素,再按照顺序读取元素,当调用remove方法,返回当前优先级队列中最小元素。一般用来对优先级队列进行任务调度,每次找出最高优先级的任务。

8. Map(映射表)

分为HashMap和TreeMap,HashMap对键进行散列,不需要排序;TreeMap对键的全局顺序进行排序。HashMap的速度较快,一般用HashMap进行操作

8.1 put和get操作

Map<String, Employee> staff = new HashMap<String, Employee>();

Employee harry = new Employee("Harry Hacker");

staff.put("987-01-889", harry); //加入员工编号和姓名

e = staff.get("987-01-889"); //根据Key得到Value信息

8.2 得到所有键的集合

Set<String> keys = staff.keySet();

for (String key : keys) {}

8.3 值得集合 Collection<k> values()

8.4 键/值集合

for (Map.entry<String, Employee> entry : staff.entrySet()) {

String key = entry.getKey();

Employee value = entry.getValue();

}

另一种方法,使用Iterator来遍历

Iterator<Map.Entry<String, Employee>> it = staff.entrySet().iterator();

while(it.hasNext()) {

Map.Entry entry = it.next();

String key = entry.getKey();

Employee value = entry.getValue();

}

8.5 其他的一些方法

void put(Map<key,value> entries) //把Map中所有项放入到Map中

boolean containsKey(Object key) //该Map中已经存在键,返回true

boolean containsValue(Object value) //该Map中已经存在值,返回true

9. WeakHashMap(弱散列映射表)

当键不再使用,需要回收,那么就需要WeakHashMap,它用WeakReference来持有键,当弱引用加入队列,则表示该对象不再将使用

10. LinkedHashSet和LinkedHashMap

能够记录插入顺序,在存取时,能够按顺序排序

Map staff = new LinkedHashMap();

staff.put("144", new Employee("Amy"));

staff.put("255", new Employee("Bob"));

之后staff.keySet().iterator()枚举键

144 255

使用staff.values().iterator()枚举值

Amy Bob

11. EnumSet

enum Weekday {MONDY, TUESDAY, WEDNESDAY...};

EnumSet always = EnumSet.allOf(Weekday.class); //返回所有枚举值

12. IdentityHashMap(标识散列映射表)

键的散列码不是由hashCode,而是由System.IdentityHashCode计算来的,同时使用==,而不是equals来比较相等。

13. 集合框架

13.1 轻量级包装器

List<Card> cardList = Arrays.asList(cardDeck); //Arrays返回包装了一个普通Java数组的List包装器,可以使用get和set方法来操作数据

13.2 子范围

List a = staff.subList(10,20); //取出staff中10到19的元素

13.3 同步视图

HashMap<String, Employee> staff = new HashMap<String, Employee>();

Map<String, Employee> map = Collections.synchronizedMap(staff);

13.4 集合与数组的转化

数组转集合

String[] values = ...;

HashSet<String> staff = new HashSet<String>(Arrays.asList(values));

集合转数组

String[] values = staff.toArray(new String[0]); //因为集合可能是特定类型,比如String,那么就需要准确转换类型

 

分享到:
评论

相关推荐

    Java核心技术 卷I(原书第8版).Part1 pdf

    共分两个压缩包 此为第一个压缩包 第1章 Java 程序设计概述 1.1 Java 程序设计平台 1.2 Java 白皮书的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 ...第13章 集合 第14章 多线程

    Java核心技术 卷I(原书第8版).part2 PDF

    共分为两个压缩包 此为第2个压缩包 第1章 Java 程序设计概述 1.1 Java 程序设计平台 1.2 Java 白皮书的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 ...第13章 集合 第14章 多线程

    Java2核心技术.part5

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Core Java. Volume I. Fundamentals, 8th Edition JAVA核心技术1基础知识

    更新到jdk 6平台,但和 第七版没有本质的区别 代码示例请到此地址下载:【corejava8代码示例】http://download.csdn.net/source/2366281 1 AN INTRODUCTION TO JAVA ...第13章 集合 第14章 多线程

    Java2核心技术.part3

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java2核心技术.part1

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝性 1. 2.6...

    Java2核心技术.part6

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java2核心技术.part4

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java2核心技术.part2

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    编程实践:Java进阶100例

    中文名: 编程实践:Java进阶100例 原名: 编程实践:Java进阶100例 别名: Java 作者: 李相国等. 译者: 李相国等. 图书分类: 软件 ...第十三章:Swing中的表格; 第十四章:桌面程序特效; 第十五章:网络编程

    Java优化编程(第2版)

    第4章 java核心类与性能优化 4.1 散列表类与性能优化 4.1.1 线程同步散列表类 4.1.2 设置arraylist初始化容量 4.1.3 arraylist与linkedlist 4.2 string类与性能优化 4.2.1 字符串累加与性能优化 4.2.2 字符串的...

    java web 视频、电子书、源码(李兴华老师出版)

    第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8...

    李兴华Java Web开发实战经典(高清版) Part2

    第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    第13章 标准标签库(JSTL) 13.1、JSTL简介 13.2、安装JSTL 1.2 13.3、核心标签库 13.3.1、标签 13.3.2、标签 13.3.3、标签 13.3.4、标签 13.3.5、标签 13.3.6、、、标签 13.3.7、标签 13.3.8、标签 ...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

Global site tag (gtag.js) - Google Analytics