• 《Think in Java》17~18


    chapter 17 容器深入研究

    填充容器

    package cn.test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    class StringAddress{
        private String s;
        public StringAddress(String s) {this.s=s;};
        public String toString() {
            return super.toString()+" "+s;
        }
        
    }
    public class FillingLists {
        public static void main(String[] args) {
            List<StringAddress> list=new ArrayList<StringAddress>(Collections.nCopies(4, new StringAddress("Hello")));
            System.out.println(list);
            Collections.fill(list, new StringAddress("World!"));
            System.out.println(list);
        }
    }

    一种Generator解决方案

    public interface Generator<T> {
        T next();
    }
    package cn.test;
    
    import java.util.ArrayList;
    
    public class CollectionData<T> extends ArrayList<T> {
        public CollectionData(Generator<T> gen,int quantity) {
            for(int i=0;i<quantity;i++) {
                add(gen.next());
            }
        }
        public static <T> CollectionData<T> 
        list(Generator<T> gen,int quantity){
            return new CollectionData<T>(gen,quantity);
        }
    }

    Set和存储顺序

      

    队列

    package cn.test;
    
    import java.util.LinkedList;
    import java.util.PriorityQueue;
    import java.util.Queue;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ConcurrentLinkedQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.PriorityBlockingQueue;
    
    public class QueueBehavior {
        private static int count=10;
        static <T> void test(Queue<T> queue,Generator<T> gen) {
            for(int i=0;i<count;i++) {
                queue.offer(gen.next());
                while(queue.peek()!=null) {
                    System.out.print(queue.remove()+" ");
                }
            }
            System.out.println();
        }
        static class Gen implements Generator<String>{
            String[] s=("one two three four five six seven "
                    + "eight nine ten").split(" ");
            int i;
            public String next() {
                return s[i++];
            }
            
        }
        public static void main(String[] args) {
            test(new LinkedList<String>(),new Gen());
            test(new PriorityQueue<String>(),new Gen());
            test(new ArrayBlockingQueue<String>(count),new Gen());
            test(new ConcurrentLinkedQueue<String>(),new Gen());
            test(new LinkedBlockingQueue<String>(),new Gen());
            test(new PriorityBlockingQueue<String>(),new Gen());
            
        }
        
    }

    优先级队列

    理解Map

    性能

      

      

    SortedMap

    散列与散列码

    package cn.test;
    
    import java.lang.reflect.Constructor;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    class Groundhog{
        protected int number;
        public Groundhog(int n) {number = n;}
        public String toString() {
            return "Groundhog # "+number;
        }
    }
    class Prediction{
        private static Random rand=new Random(47);
        private boolean shadow=rand.nextDouble() > 0.5;
        public String toString() {
            if(shadow)
                return "Six more weeks of Winter!";
            else
                return "Early Spring!";
        }
    }
    public class SpringDetector {
        public static <T extends Groundhog>
        void detectSpring(Class<T> type)throws Exception{
            Constructor<T> ghog = type.getConstructor(int.class);
            Map<Groundhog,Prediction> map=new HashMap<Groundhog,Prediction>();
            for(int i=0;i<10;i++) 
                map.put(ghog.newInstance(i), new Prediction());
            System.out.println("map = "+map);
            Groundhog gh = ghog.newInstance(3);
            System.out.println("Looking up prediction for "+gh);
            if(map.containsKey(gh))
                System.out.println(map.get(gh));
            else
                System.out.println("Key not found: "+gh);
        }
        public static void main(String[] args) throws Exception {
            detectSpring(Groundhog.class);
        }
    }

    为速度而散列

    覆盖hashCode()

    Collection或Map的同步控制

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

    快速报错

    public class FailFast {
        public static void main(String[] args) {
            Collection<String> c=new ArrayList<String>();
            Iterator<String> it=c.iterator();
            c.add("An object");
            try {
                String s=it.next();
            } catch (ConcurrentModificationException e) {
                System.out.println(e);
            }
            
        }
    }
    //  java.util.ConcurrentModificationException

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

    持有引用

    Hashtable

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

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

    Stack

    package cn.test;
    
    import java.util.LinkedList;
    import java.util.Stack;
    
    enum Month{
        january,february,march,april,may,june,july,august,september,october,november
    }
    public class Stacks {
        public static void main(String[] args) {
            Stack<String> stack=new Stack<String>();
            for(Month m:Month.values())
                stack.push(m.toString());
            System.out.println("stack = "+ stack);
            stack.addElement("The last line");
            System.out.println("element 5 = "+stack.elementAt(5));
            System.out.println("popping elements : ");
            while(!stack.empty())
                System.out.println(stack.pop()+" ");
            LinkedList<String> lstack=new LinkedList<String>();
            for(Month m: Month.values())
                lstack.addFirst(m.toString());
            System.out.println("lstack = "+lstack);
            while(!lstack.isEmpty())
                System.out.println(lstack.removeFirst()+" ");
        }
    }
        

    chapter 18 Java I/O系统

    输入和输出

    XML

    I/O流的典型使用方式

    对象序列化

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

  • 相关阅读:
    C语言编程题
    boost-使用说明
    CButton控件
    sprintf()与sscanf()
    MFC中的几个虚函数
    CProgressCtrl进度条控件实现进度滚动效果
    移动窗口和根据条件查找指定窗口
    VC播放mp3的方法
    CEdit控件[转]
    关于鼠标的一些操作
  • 原文地址:https://www.cnblogs.com/mryangbo/p/10240231.html
Copyright © 2020-2023  润新知