13.1.2 Java类库中的集合接口和迭代器接口

    删除元素,对于next和remove的调用是互相依赖的,如果调用remove之前没有调用next,则会跑出IllegalStateException异常。如果想要删除两个相连的元素:
  1. it.remove();
  2. it.remove();//error
  3. 而是应该
  4. it.remove();
  5. it.next();
  6. it.remove();
    
    怎么觉得这种接口设计好傻呢。谁干的?

    如果想要实现自己的集合类,可以从Abstractxxxx系列的抽象类来扩展,这样可以少实现很多方法。比如AbstractCollection, AbstractQueue方法。
    java中的迭代器和与c++中的迭代器是不同的,java中的集合本身实现了迭代器接口,而c++中则是通过
    
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Iterator;
  4. public class LearnCollection {
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. ArrayList<String> nameList = new ArrayList<String>();
  8. nameList.add("zhang.san");
  9. nameList.add("li.si");
  10. nameList.add("wang.wu");
  11. nameList.add("zhao.yi");
  12. System.out.println("initial content.");
  13. printCollection(nameList);
  14. printViaIterator(nameList.iterator());

  15. removeViaIterator(nameList.iterator(), "li.si");
  16. System.out.println("");
  17. System.out.println("after remove li.si");
  18. printCollection(nameList);
  19. printViaIterator(nameList.iterator());
  20. }
  21. /**
  22. * remove via iterator
  23. * @param it
  24. * @param value
  25. */
  26. static void removeViaIterator(Iterator<?> it, String value){
  27. while(it.hasNext()){
  28. if(it.next().toString() == value){
  29. it.remove();
  30. System.out.println(String.format("remove %s success.", value));
  31. return;
  32. }
  33. }
  34. System.out.println(String.format("remove %s failed.", value));
  35. }
  36. /**
  37. * @param it
  38. */
  39. static void printViaIterator(Iterator<?> it){
  40. System.out.println("Print via iterator:");
  41. while(it.hasNext())
  42. System.out.println(String.format("\titem:%s", it.next().toString()));
  43. }
  44. /**
  45. * @param collection
  46. */
  47. static void printCollection(Collection<?> collection){
  48. System.out.println("collection content:");
  49. for(Object item: collection){
  50. System.out.println(String.format("\titem:%s", item.toString()));
  51. }
  52. }
  53. }
下面测试一下Collection.toArray的用法。
从下面的代码可以看出,当arrayToFill的大小不够的时候,就不会填充。
  1. static void testToArray(){
  2. LinkedList<String> strList = new LinkedList<String>();
  3. strList.add("zhang.san");
  4. strList.add("li.si");
  5. strList.add("wang.wu");
  6. print("filled array is not large enough.");
  7. testToArrayHelper(strList, new String[2]);
  8. print("filled array is large enough.");
  9. testToArrayHelper(strList, new String[3]);
  10. }
  11. static void testToArrayHelper(LinkedList<String> strList, String[] filledArray){
  12. String[] returnedArray = strList.toArray(filledArray);
  13. printArray("filled array:", filledArray);
  14. print("");
  15. printArray("returned array:", returnedArray);
  16. print("");
  17. if(filledArray == returnedArray)
  18. print("filled array is equal returned array.");
  19. else
  20. print("filled array is not equal returned array.");
  21. }
  22. static <T> void printArray(String title, T[] array){
  23. print(title);
  24. for(T item: array){
  25. if(item != null)
  26. print("item:" + item.toString());
  27. else
  28. print("item is null");
  29. }
  30. }
  31. static void print(String info){
  32. System.out.println(info);
  33. }
输出结果如下:
  1. filled array is not large enough.
  2. filled array:
  3. item is null
  4. item is null
  5. returned array:
  6. item:zhang.san
  7. item:li.si
  8. item:wang.wu
  9. filled array is not equal returned array.
  10. filled array is large enough.
  11. filled array:
  12. item:zhang.san
  13. item:li.si
  14. item:wang.wu
  15. returned array:
  16. item:zhang.san
  17. item:li.si
  18. item:wang.wu
  19. filled array is equal returned array.


13.2 具体的集合
    除了以map结尾的类,其他都实现了collection接口。
   
    关于LinkedList的 ListIterator的add和remove    
  1. static void testListIteratorAdd(){
  2. LinkedList<String> strList = new LinkedList<String>();
  3. strList.add("1");
  4. strList.add("2");
  5. strList.add("3");
  6. print("init content:");
  7. printCollection(strList);
  8. ListIterator<String> it = strList.listIterator();
  9. it.next();
  10. it.add("1.1");
  11. it.add("1.2");
  12. print("after insert 2 item");
  13. printCollection(strList);
  14. }
输出如下:
  1. init content:
  2. collection content:
  3. item:1
  4. item:2
  5. item:3
  6. after insert 2 item
  7. collection content:
  8. item:1
  9. item:1.1
  10. item:1.2
  11. item:2
  12. item:3

测试listIterator的删除功能。
  1. static void testListIteratorRemove(){
  2. LinkedList<String> strList = new LinkedList<String>();
  3. strList.add("1");
  4. strList.add("2");
  5. strList.add("3");
  6. print("init content:");
  7. printCollection(strList);
  8. ListIterator<String> it = strList.listIterator();
  9. it.next();
  10. it.remove();//ok
  11. print("after remove 1 item");
  12. printCollection(strList);
  13. it.remove();//error
  14. print("after remove 2 item");
  15. printCollection(strList);
  16. }
输出如下,也就是说,ListIterator.remove是依赖于迭代器的状态的,每次调用remove之前,必须先调用一次next或者previous函数。
  1. init content:
  2. collection content:
  3. item:1
  4. item:2
  5. item:3
  6. after remove 1 item
  7. collection content:
  8. item:2
  9. item:3
  10. Exception in thread "main" java.lang.IllegalStateException
  11. at java.util.LinkedList$ListItr.remove(LinkedList.java:923)
  12. at me.ygc.javabasic.learnJava.LearnCollection.testListIteratorRemove(LearnCollection.java:33)
  13. at me.ygc.javabasic.learnJava.LearnCollection.main(LearnCollection.java:15)

 13.2.3 散列集
    在java中,散列表用链表数组实现,每个列表被称为桶(bucket), 先用散列码找到桶,然后在桶内使用equals方法来逐个比较查找。
    如果散列表太满,就要再散列。也就是创建一个新的更大的散列表,将原来的所有元素转移过去,然后丢弃原来的表。
    装填因子默认值为0.75,当超过0.75的时候,就会自动进行再散列。
    
    只有不关心集合中元素位置的时候,才会使用HashSet。
    
    
13.2.8 映射表
    有两种, HashMap,无序的, TreeMap,有序的;   
    如果不需要排序,就选择HashMap,因为这个会稍微快一点。









Java系列,《Java核心技术 卷1》,chapter 13,集合的更多相关文章

  1. 《Java核心技术 卷II 高级特性(原书第9版)》

    <Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...

  2. 《Java核心技术卷I》观赏指南

    Tomxin7 如果你有想看书的计划,但是还在纠结哪些书值得看,可以简单看看"观赏指南"系列,本文会简单列出书中内容,给还没有买书的朋友提供一个参考. 前言 秋招过去很久了,虽然在 ...

  3. 《Java核心技术卷1》拾遗

    之前对Java的基础知识有过学习,现在开始学习<Java核心技术卷1>,将一些新学的知识点,做简要记录,以备后续回顾: 1.double (1)所有的“非数值”都认为是不相同的 if(x= ...

  4. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  5. java的优点和误解 《java核心技术卷i》第一章

    <java核心技术卷i>第一章主要内容包括三点: 1:Java白皮书的关键术语:描述Java的十一个关键字: 2:Java applet 3 :关于Java的常见误解   1:第一章:Ja ...

  6. Java核心技术·卷 II(原书第10版)分享下载

    Java核心技术·卷 II 内容介绍 Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年 ...

  7. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  8. 读书笔记-《Java核心技术卷I-基础知识》

    1.定时器Timer类 构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做什么操作.定时器需要知道调用哪一个方法,并要求传递的对象所属的类实现了java.awt.event包的A ...

  9. Java核心技术卷阅读随笔--第2章【Java 程序设计环境】

    Java 程序设计环境 本章主要介绍如何安装 Java 开发工具包( JDK ) 以及如何编译和运行不同类型的程序: 控制台程序. 图形化应用程序以及 applet.运行 JDK 工具的方法是在终端窗 ...

  10. Java系列:关于Java中的桥接方法

    这两天在看<Java核心技术 卷1>的泛型相关章节,其中说到了在泛型子类中override父类的泛型方法时,编译器会自动生成一个桥接方法,这块有点看不明白. 书上的例子代码如下: publ ...

随机推荐

  1. android 定制自己的日志工具

    最理想的情况是能够控制日志的打印,当程序处于开发阶段就让日志打印出来,当程序上线之后就把日志屏蔽掉. 例如打印一行WARN级别的日志就可以写成这样: LogUtil.w("TAG" ...

  2. sublime text 3 如何安装 package control

    sublime text3 是个很好的编辑工具,前端程序员觉得她很好,我是在一次视频中看到她能帮助自动完成很多快捷的操作. 为什么安装? 如果想要给sublime text 中安装别的插件(这里称呼为 ...

  3. 关于配置并发访问的服务器apache、nginx

    一. apache,nginx比较     关于Apache与Nginx的优势比较  (apache计算密集型   nginx io密集型  各有优势,不存在谁取代谁) 二.nginx 基于nginx ...

  4. android文件存储位置切换

    最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...

  5. 【Other】U盘FAT32转NTFS且无数据丢失

    序: 做了一个U盘启动盘后发现文件系统格式为FAT32.这种格式支持单个文件最大4G,超过4G就无法拷贝了.为了防止以后突发情况所以提前把FAT32转换成NTFS.为避免导入导出数据最简单的方法利用D ...

  6. eclipse中基于maven构建的web项目pom.xml中指定的jar包无法发布到tomcat中

    eclipse运行maven web项目报错: 信息: Starting Servlet Engine: Apache Tomcat/7.0.57 一月 07, 2015 11:50:44 下午 or ...

  7. poj 3667 Hotel(线段树,区间合并)

    Hotel Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 10858Accepted: 4691 Description The ...

  8. hdu 1561 The more, The Better(树形dp,基础)

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. C++STL之迭代器

    迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值.例如, ...

  10. 汇编中call printf参数压栈时错误理解

    EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示: <-------------------EAX------------------------>|& ...