`

JAVA2核心技术卷II -- 第2章. 集合

阅读更多

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 2核心技术 卷II:高级特性(第七版).part2

    &lt;br&gt; 译者序 前言 第1章 多线程 第2章 集合 第3章 网络 第4章 数据库编程 第5章 分布式对象 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化...

    Java 2核心技术 卷II:高级特性(第七版).part1

    &lt;br&gt; 译者序 前言 第1章 多线程 第2章 集合 第3章 网络 第4章 数据库编程 第5章 分布式对象 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化...

    Java 2核心技术 卷II:高级特性(第七版).part3

    &lt;br&gt; 译者序 前言 第1章 多线程 第2章 集合 第3章 网络 第4章 数据库编程 第5章 分布式对象 第6章 高级Swing 第7章 高级AWT 第8章 JavaBean构件 第9章 安全 第10章 国际化...

    Java核心技术 第12版 开发基础+高级特性 英文原版

    伴随着Java的成长,《Java核心技术》从第1版到第11版一路走来,得到了广大Java程序设计人员的青睐,成为一本畅销不衰的Java经典图书。 本书经全面修订,以涵盖Java 17的新特性。新版延续之前版本的优良传统,用数百...

    Java核心技术(I、II卷全)原书第八版 中文扫描版

    卷I详细介绍以下内容:面向对象程序设计、异常处理、反射与代理、泛型程序设计、接口与内部类、集合框架、时间监听器模型、并行操作、使用Swing UI工具箱进行图形用户界面设计 卷II——高级特性:文件与流、数据库...

    Java2核心技术.part5

    Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 阻塞队列 1.7 线程安全的集合 1.8 Callable和Future 1.9 执行器 ...

    JAVA核心技术卷II:高级特性

     本书是经典的《Java核心技术,卷II:高级特性》的最新修订版,涵盖了Java SE 6平台的高级用户界面程序设计和企业特性。与第1卷(涵盖了核心的语言和类库特性)一样,本卷已经更新到了Java SE6。并且对新内容都作了...

    Java核心技术.第9版.卷1.卷2.英文版

    《Java核心技术 卷II 高级特性(原书第9版)》全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、国际化等,详细描述了图形与GUI编程,还涉及安全、远程方法、注解处理、本地方法等。本书对Java技术...

    Java2核心技术.part2

    Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 阻塞队列 1.7 线程安全的集合 1.8 Callable和Future 1.9 执行器 ...

    Java核心技术 卷Ⅰ:基础知识 【中文】(第八版)

    Java核心技术 卷Ⅰ:基础知识 【中文】 第1章概述Java与其他程序设计语言不同的性能。解释这种语言的设计初衷,以及在哪些方 面达到了预期的效果。然后,简要叙述Java诞生和发展的历史。 第2章详细地论述如何下载和...

    Java2核心技术.part3

    Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 阻塞队列 1.7 线程安全的集合 1.8 Callable和Future 1.9 执行器 ...

    Java2核心技术.part1

    Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 阻塞队列 1.7 线程安全的集合 1.8 Callable和Future 1.9 执行器 1.10 同步器 ...

    Java2核心技术.part6

    Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 阻塞队列 1.7 线程安全的集合 1.8 Callable和Future 1.9 执行器 ...

    Java2核心技术.part4

    Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 阻塞队列 1.7 线程安全的集合 1.8 Callable和Future 1.9 执行器 ...

    Java核心技术_第八版(英文原版).part2

    《Java核心技术》出版以来一直畅销不衰,深受读者青睐,是与《Java编程思想》齐名的Java图书泰山北斗,各大Java论坛大版主等专家隆重推荐! 每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新...

    Java核心技术_第八版(英文原版).part1

    《Java核心技术》出版以来一直畅销不衰,深受读者青睐,是与《Java编程思想》齐名的Java图书泰山北斗,各大Java论坛大版主等专家隆重推荐! 每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新...

    JAVA程序设计教程

    第二章基本数据类型 .........................................................................................................14 §2.1 数据类型概述 ......................................................

    Java核心技术(原书第8版)卷II_高级特性(part2)

    CayS.Horstmann等编著,公飞编译的《Java核心技术》(CoreJava)自第1版出版以来,一直备受广大Java程序设计人员的青睐,畅销不衰,是Java经典书籍。第8版针对JavaSE6平台进行了全面更新,囊括了Java平台标准版(JavaSE...

Global site tag (gtag.js) - Google Analytics