读书摘要——第四章

来源:互联网 发布:华测rtk如何导出数据 编辑:程序博客网 时间:2024/05/02 09:18
  1. 集合包:集合包最常用的有Collection 和 Map 两个接口的实现类,Collection 用于存放多个单对象,Map 用于存放KEY-Value 形式的键值对。Collection,常用的又分为两种类型接口,List 和 Set,两者最明显的差别为List支持放入重复对象,而Set不支持。List的实现类有:ArrayList 、LinkedList、Vector及Stack;Set接口常用的实现类有:HashSet、TreeSet。
  2. ArrayList:ArrayList采用的是数组的方式来存储对象。当调用ArrayList的add方法时,首先基于已有的元素数量加1,产生一个名为 minCapacity的变量,然后比较此值与Object数组的大小,如果大于Object数组值,那么先将Object数组值赋值给一个数组对象,接着产生一个新的数组容量值,计算方法为当前数组值X1.5 + 1,如得出的容量值仍然小于 minCapacity,那么就以minCapacity作为新的容量值。ArrayList 基于数组方式实现,无容量限制,在插入元素时可能要扩容,在删除元素时并不会减小数组的容量,可以通过 trimToSize()方法缩小。在查找元素时要遍历数组,对于非NULL的元素采用 equals的方式寻找,ArrayList 是非线程安全的。
  3. LinkedList:LinkedList  基于双向链表机制,每个元素都知道前一个元素和后一个元素的位置。在LinkedList 中,以一个内部的Entry类来代表集合中的元素,元素的值赋给 element属性,Entry中的next  属性指向元素的后一个元素,Entry中的previous属性指向元素的前一个元素。LinkedList基于双向链表机制实现,在插入元素时,须创建一个新的Entry对象,并切换相应元素的前后元素的引用;在查找元素时,须遍历链表;在删除元素时,要遍历链表,找到要删除的元素,然后从链表上将此元素删除即可。LinkedList是非线程安全的。
  4. Vector :Vector是基于Synchronized实现线程安全的ArrayList,但在插入元素时容量扩充机制和ArrayList稍有不同,并可通过传入capacityIncrementL来控制容量的扩充。
  5. Stack:Stack继承于Vector,在其基础上实现了Stack所要求的后进先出(LIFO)的弹出及压入操作,提供了push、pop、peek三个主要方法,是线程安全的。
  6. HashSet:HashSet 是Set的接口实现。HashSet  是基于HashMap实现,无容量限制,HashSet 是非线程安全的,不允许元素重复。add方法调用HashMap的put方法来完成操作,将需要添加的元素作为Map的KEY,value则传入一个之前创建的Object对象。HashSet不支持get(int)来获取指定位置元素。
  7. TreeSet:TreeSet基于TreeMap实现。TreeSet支持排序,如传入Comparator实现、descendingSet及descendingIterator等,是非线程安全的。
  8. HashMap:HashMap采用数组方式存储KEY、value 构成Entry对象,无容量限制。HashMap基于KEY HASH寻找Entry对象存放到数组的位置,对于  hash冲突采用链表方式解决,HashMap在插入元素时可能会要扩大数组容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中,HashMap是非线程安全的。
  9. TreeMap:TreeMap是一个支持排序的Map实现。TreeMap基于红黑树实现,无容量限制,是非线程安全的。
  10. 性能比较:在单线程时,Vector 、ArrayList、LinkedList、Stack的查找、删除元素的效率随着元素数量的增加而下降。
  11. 并发包concurrent:并发包中除了提供高性能的线程安全的集合对象外,还提供了很多并发场景需要的原子类操作类,例如ActomicInteger,另外提供了一些用于避免并发时资源冲突的Lock及Condition类。
  12. ConcurrentHashMap:ConcurrentHashMap是线程安全的HashMap的实现。在并发场景下,ConcurrentHashMap比HashMap性能更好。
  13. CopyOnWriteArrayList:CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的ArrayList。在读多写少的并发场景中,CopyOnWriteArrayList较之ArrayList是更好的选择。
  14. CopyOnWriteArraySet:CopyOnWriteArraySet是基于CopyOnWriteArrayList的实现,但是在add时每次都要遍历数组,因此性能会略低于CopyOnWriteArrayList。
  15. ArrayBlockingQueue: ArrayBlockingQueue 是一个基于数组、先进先出、线程安全的集合类,其特色为可实现指定时间的阻塞读写,并且容量时可限制的。
  16. AtomicInteger:AtomicInteger是一个支持原子操作的Integer类,可实现一个按顺序获取ID的场景。基于CAS的方式性能上高于使用synchronized,因此,JDK5以上且必须支持并发的应用,可尽量选择使用atomic的类,如AtomicInteger、AtomicBoolean、AtomicReference等。
  17. TreadPoolExecutor:TreadPoolExecutor是并发包中提供的一个线程池服务,基于TreadPoolExecutor可以很容易将一个实现了Runnable接口的任务放入线程池中执行。
  18. Executors:Executors 提供了一些方便创建ThreadPoolExecutor的方法,包括newFixedThreadPool(int)、newSingleThreadExecutor()、newCachedThreadPool()、newScheduledThreadPool(int)。
  19. FutureTask:FutureTask 可用于要异步获取执行结果或取消执行任务的场景,通过传入Runnalbe或Callable的任务给FutrueTask,直接调用其run方法或放入线程池执行,之后可在外部通过FutureTask的get异步获得执行结果。FutureTask可以确保即使调用了多次run方法,它都只会执行一次Runnable或Callable任务。
  20. Semaphore:Semaphore是并发包中提供的用于控制某资源同时被访问的个数类,如连接池中通常要控制创建连接的个数。
  21. CountDownLatch:CountDownLatch是并发包中提供的一个可用于控制多个线程同时开始某动作的类,其采用的方式为减计数的方式。
  22. CyclicBarrier:CyclicBarrier和CountDownLatch不同,CyclicBarrier是当await的数量达到设定数量后,才继续往下执行。
  23. ReentrantLock:ReentrantLock 时并发包中提供的一个更为方便的控制并发资源的类,且和synchronized语法达到的效果一致。
  24. Condition:Condition是并发包中提供的一个接口,典型的实现有 ReentrantLock,ReentrantLock提供了一个newCondition方法,以便用户在同一个锁的情况下可以根据不同的情况执行等待或者唤醒动作。
  25. ReentrantReadWriteLock : ReentrantReadWriteLock 和 ReentrantLock没有任何继承关系,ReentrantReadWriteLock 提供了读锁和写锁,相比较ReentrantLock 只有一把锁的机制而言,读写锁分离的好处是在读多写少的场景中可大幅度提升性能。
  26. 序列化:在采用JAVA序列化的情况下,类必须实现Serializable 接口 或者 Extemalizable接口。在使用ObjectOutputStream将对象转换为流后,要注意调用reset 或 close ,以避免产生内存泄露。出了JAVA的序列化外,还有 hessian、phprpc、google protocol buffers等方式。
  27. 反序列化:对于实现了Externalizable 接口的类,可直接提交由类对象实例的 readExternal方法来完成,未实现Externalizable接口的类,如果类中有 readObject方法,则交由对象实例的 readObject 方法来完成,没有的话则按照序列化流中序列化的Field进行读取。
0 0
原创粉丝点击