chapter 17 容器深入研究

填充容器

  1. package cn.test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6.  
  7. class StringAddress{
  8. private String s;
  9. public StringAddress(String s) {this.s=s;};
  10. public String toString() {
  11. return super.toString()+" "+s;
  12. }
  13.  
  14. }
  15. public class FillingLists {
  16. public static void main(String[] args) {
  17. List<StringAddress> list=new ArrayList<StringAddress>(Collections.nCopies(4, new StringAddress("Hello")));
  18. System.out.println(list);
  19. Collections.fill(list, new StringAddress("World!"));
  20. System.out.println(list);
  21. }
  22. }

一种Generator解决方案

  1. public interface Generator<T> {
  2. T next();
  3. }
  1. package cn.test;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. public class CollectionData<T> extends ArrayList<T> {
  6. public CollectionData(Generator<T> gen,int quantity) {
  7. for(int i=0;i<quantity;i++) {
  8. add(gen.next());
  9. }
  10. }
  11. public static <T> CollectionData<T>
  12. list(Generator<T> gen,int quantity){
  13. return new CollectionData<T>(gen,quantity);
  14. }
  15. }

Set和存储顺序

  

队列

  1. package cn.test;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.PriorityQueue;
  5. import java.util.Queue;
  6. import java.util.concurrent.ArrayBlockingQueue;
  7. import java.util.concurrent.ConcurrentLinkedQueue;
  8. import java.util.concurrent.LinkedBlockingQueue;
  9. import java.util.concurrent.PriorityBlockingQueue;
  10.  
  11. public class QueueBehavior {
  12. private static int count=10;
  13. static <T> void test(Queue<T> queue,Generator<T> gen) {
  14. for(int i=0;i<count;i++) {
  15. queue.offer(gen.next());
  16. while(queue.peek()!=null) {
  17. System.out.print(queue.remove()+" ");
  18. }
  19. }
  20. System.out.println();
  21. }
  22. static class Gen implements Generator<String>{
  23. String[] s=("one two three four five six seven "
  24. + "eight nine ten").split(" ");
  25. int i;
  26. public String next() {
  27. return s[i++];
  28. }
  29.  
  30. }
  31. public static void main(String[] args) {
  32. test(new LinkedList<String>(),new Gen());
  33. test(new PriorityQueue<String>(),new Gen());
  34. test(new ArrayBlockingQueue<String>(count),new Gen());
  35. test(new ConcurrentLinkedQueue<String>(),new Gen());
  36. test(new LinkedBlockingQueue<String>(),new Gen());
  37. test(new PriorityBlockingQueue<String>(),new Gen());
  38.  
  39. }
  40.  
  41. }

优先级队列

理解Map

性能

  

  

SortedMap

散列与散列码

  1. package cn.test;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.Random;
  7.  
  8. class Groundhog{
  9. protected int number;
  10. public Groundhog(int n) {number = n;}
  11. public String toString() {
  12. return "Groundhog # "+number;
  13. }
  14. }
  15. class Prediction{
  16. private static Random rand=new Random(47);
  17. private boolean shadow=rand.nextDouble() > 0.5;
  18. public String toString() {
  19. if(shadow)
  20. return "Six more weeks of Winter!";
  21. else
  22. return "Early Spring!";
  23. }
  24. }
  25. public class SpringDetector {
  26. public static <T extends Groundhog>
  27. void detectSpring(Class<T> type)throws Exception{
  28. Constructor<T> ghog = type.getConstructor(int.class);
  29. Map<Groundhog,Prediction> map=new HashMap<Groundhog,Prediction>();
  30. for(int i=0;i<10;i++)
  31. map.put(ghog.newInstance(i), new Prediction());
  32. System.out.println("map = "+map);
  33. Groundhog gh = ghog.newInstance(3);
  34. System.out.println("Looking up prediction for "+gh);
  35. if(map.containsKey(gh))
  36. System.out.println(map.get(gh));
  37. else
  38. System.out.println("Key not found: "+gh);
  39. }
  40. public static void main(String[] args) throws Exception {
  41. detectSpring(Groundhog.class);
  42. }
  43. }

为速度而散列

覆盖hashCode()

Collection或Map的同步控制

  1. public class Synchronization {
  2. public static void main(String[] args) {
  3. Collection<String> c = Collections.synchronizedCollection(new ArrayList<String>());
  4. List<String> list = Collections.synchronizedList(new ArrayList<String>());
  5. Set<String> s = Collections.synchronizedSet(new HashSet<String>());
  6. SortedSet<String> ss = Collections.synchronizedSortedSet(new TreeSet<String>());
  7. Map<String,String> m=Collections.synchronizedMap(new HashMap<String,String>());
  8. Map<String,String> sm=Collections.synchronizedSortedMap(new TreeMap<String,String>());
  9. }
  10. }

快速报错

  1. public class FailFast {
  2. public static void main(String[] args) {
  3. Collection<String> c=new ArrayList<String>();
  4. Iterator<String> it=c.iterator();
  5. c.add("An object");
  6. try {
  7. String s=it.next();
  8. } catch (ConcurrentModificationException e) {
  9. System.out.println(e);
  10. }
  11.  
  12. }
  13. }
    //  java.util.ConcurrentModificationException

  在获取迭代器后,容器发生了变化。

持有引用

Hashtable

  Hashtable 过时的类,线程安全,键值不为null;

  HashMap 线程不安全 ,但可以通过Collections类转为线程安全。Map m = Collections.synchronizeMap(hashMap),键值可以为null;

Stack

  1. package cn.test;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.Stack;
  5.  
  6. enum Month{
  7. january,february,march,april,may,june,july,august,september,october,november
  8. }
  9. public class Stacks {
  10. public static void main(String[] args) {
  11. Stack<String> stack=new Stack<String>();
  12. for(Month m:Month.values())
  13. stack.push(m.toString());
  14. System.out.println("stack = "+ stack);
  15. stack.addElement("The last line");
  16. System.out.println("element 5 = "+stack.elementAt(5));
  17. System.out.println("popping elements : ");
  18. while(!stack.empty())
  19. System.out.println(stack.pop()+" ");
  20. LinkedList<String> lstack=new LinkedList<String>();
  21. for(Month m: Month.values())
  22. lstack.addFirst(m.toString());
  23. System.out.println("lstack = "+lstack);
  24. while(!lstack.isEmpty())
  25. System.out.println(lstack.removeFirst()+" ");
  26. }
  27. }

chapter 18 Java I/O系统

输入和输出

XML

I/O流的典型使用方式

对象序列化

  对于某些实现了Serialiazable 又不想被序列化的字段,可以在字段前添加 transient 关键字。

《Think in Java》17~18的更多相关文章

  1. 读书笔记 之《Thinking in Java》(对象、集合)

    一.前言: 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说"书籍是人类 ...

  2. 《Head First Java》读书笔记(1) - Java语言基础

    <Head First Java>(点击查看详情) 1.写在前面的话 这本书的知识点说实话感觉有点散乱,但是贵在其将文字转换成了生动和更容易接受的图片,大量的比喻让人感受到了知识点的有趣之 ...

  3. 读书笔记 之《Thinking in Java》(对象、集合、异常)

    一.前言 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说“书籍是人类进步的阶梯” ...

  4. 《Play for Java》学习笔记(一)项目框架

    从今天开始认真复习<Play for JAVA>,该书以一个案例为主线,以前为应付项目马马虎虎看了一遍,好多地方都不明白!现在跟着这本书再走一遍,认真模拟,当做一个项目啦!! 一.Play ...

  5. 《图书管理系统——java》

    /* (程序头部凝视開始) * 程序的版权和版本号声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名:    < ...

  6. 【书海】《Head First Java》 ——读后总结

    <Head First Java> 中文版 (第二版) IT`huhui前言录 <Head First Java>这本书我不算特别细的看了一遍.认为十分适合初学者,甚至是没接触 ...

  7. 我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)

    也许你是只老鸟,也许你的程序编的很精,但是,在你的程序生活,你也许没有注意到一些“常识性”的问题,因为有些时候我们不需要去注意,我们的程序 照样能够运行得飞快,但是如果那天有一个无聊的人问你一个像这样 ...

  8. 《Thinking in Java》 And 《Effective Java》啃起来

    前言 今天从京东入手了两本书,<Thinking in Java>(第四版) 和 <Effective Java>(第二版).都可以称得上是硬书,需要慢慢啃的,预定计划是在今年 ...

  9. D1——初读《Head First Java》

    今天随便看了点<Head First Java>,发觉这本书的风格真是有趣.打算先把这本书踏踏实实的看了.学习切忌好高骛远.心浮气躁,尤其入门基础阶段更应该踏踏实实地学习知识.下面随便谈谈 ...

随机推荐

  1. jquery ui的css设计

    jquery ui 是当前最强大的UI库之一,其两大卖点是对IE6的良好支持与换肤功能.为了构建avalon ui,今天起我将投入一部分精力来研究时下最流行的几个CSS框架.它是首当其冲. jquer ...

  2. 从零玩转JavaWeb系列7web服务器-----get与post的区别

    总结get与post的区别 get参数通过url传递,post放在request body中. get请求在url中传递的参数是有长度限制的,而post没有. get比post更不安全,因为参数直接暴 ...

  3. Centos6、7 PHP5.4 5.5 5.6安装

    https://www.mojowill.com/geek/howto-install-php-5-4-5-5-or-5-6-on-centos-6-and-centos-7/ https://blo ...

  4. 手动为 Team Foundation Server 安装 SQL Server

    本主题中的步骤适用于安装 SQL Server 2012 企业版,你也可以使用安装标准版的相同步骤. 适用于 SQL 2014 的步骤与以上步骤也非常相似. 我们将在 TFS 所在的同一服务器上安装 ...

  5. 【LA2957 训练指南】运送超级计算机【二分,最大流】

    题意: 宇宙中有n个星球,你的任务是用最短的时间把k个超级计算机从星球S运送到星球T.每个超级计算机需要一整艘飞船来运输.行星之间有m条双向隧道,每条隧道需要一整天的时间来通过,且不能有两艘飞船同时使 ...

  6. NavigationController.viewControllers

      NSMutableArray *viewControllersArray = [NSMutableArray new];    // 获取当前控制器数组    for (CardLoanBaseT ...

  7. 测试URL

    http://localhost:8080/dmonitor-webapi/monitor/vm/342?r=1410331220921&indexes=cpu&indexes=mem ...

  8. [Jenkins] 执行SoapUI的task,设置邮件内容为HTML+CSS

    设置邮件内容:Default Content <span style="font-family:verdana;font-size:16px;color:black;font-weig ...

  9. Dubbo的配置及启动

    Tomcat+Dubbo安装 1.将tomcat的webapps目录下的所有文件清空,讲Dubbo管理控制台的程序dubbo-admin-2.5.3.war放 到webapps中,并且解压命名为ROO ...

  10. JSTL标签总结备用

    前言 ========================================================================= JSTL标签库,是日常开发经常使用的,也是众多 ...