续访问”数据存储(如访问形式趋向于 “随机访问”数据存储(如数组)链接列表)Java 代码1.public class ArrayListltEgt extends AbstractListltEgt2.---------------------------------------------------------------------------------------3.public class LinkedListltEgt extends AbstractSequentialListltEgtpublic class ArrayListltEgt extends AbstractListltEgt---------------------------------------------------------------------------------------public class LinkedListltEgt extends AbstractSequentialListltEgt3.再有就是两者的效率问题, ArrayList 基于数组实现,所以毫无疑问可以直接用下标来索引,其索引数据快,插入元素设计到数组元素移动,或者数组扩充,所以插入元素要慢。
LinkedList 基于链表结构,插入元素只需要改变插入元素的前后项的指向即可,故插入数据要快,而索引元素需要向前向后遍历,所以索引元素要慢。
ArrayList 的特点,内部容器是如何扩充的?上一点谈到了 ArrayList 的特点,这里略,重点来看其内部容器的扩充:Java 代码1.public void ensureCapacityint minCapacity 2. modCount3. int oldCapacity elementData.length4. if minCapacity gt oldCapacity 5. Object oldData elementData6. //这里扩充的大小为原大小的大概 607. int newCapacity oldCapacity 3 / 2 18. if newCapacity lt minCapacity9. newCapacity minCapacity10. //创建一个指定大小的新数组来覆盖原数组11. elementData Arrays.copyOfelementData newCapacity12. 13. public void ensureCapacityint minCapacity modCount int oldCapacity elementData.length if minCapacity gt oldCapacity Object oldData elementData //这里扩充的大小为原大小的大概 60 int newCapacity oldCapacity 3 / 2 1 if newCapacity lt minCapacity newCapacity minCapacity //创建一个指定大小的新数组来覆盖原数组 elementData Arrays.copyOfelementData newCapacity Properties 类的特点? 线程安全吗 Properties 继承于 Hashtable所以它是线程安全的. 其特点是: 它表示的是一个持久的属性集,它可以保存在流中或者从流中加载,属性列表的每一个键和它所对应的值都是一个“字符串” 其中,常用的方法是 load方法,从流中加载属性:Java 代码1.ltSPAN stylequotFONT-WEIGHT: normalquotgtpublic synchronized void loadInputStreaminStream throws IOException 2. // 将输入流转换成 LineReader3. load0new LineReaderinStream4. 5.6. private void load0LineReader lr throws IOException 7. char convtBuf new char10248. int limit9. int keyLen10. int valueStart11. char c12. boolean hasSep13. boolean precedingBackslash14. // 一行一行处理15. while limit lr.readLine gt 0 16. c 017. keyLen 018. valueStart limit19. hasSep false20. precedingBackslash false21. // 下面用 2 个循环来处理 keyvalue22. while keyLen lt limit 23. c lr.lineBufkeyLen24. // need check if escaped.25. if c c : ampamp precedingBackslash 26. valueStart keyLen 127. hasSep true28. break29. else if c c t c f30. ampamp precedingBackslash 31. valueStart keyLen 132. break33. 34. if c 35. precedingBackslash precedingBackslash36. else 37. precedingBackslash false38. 39. keyLen40. 41.42. while valueStart lt limit 43. c lr.lineBufvalueStart44. if c ampamp c t ampamp c f 45. if hasSep ampamp c c : 46. hasSep true47. else 48. break49. 50. 51. valueStart52. 53.54. String key loadConvertlr.lineBuf 0 keyLen convtBuf55. String value loadConvertlr.lineBuf valueStart limit56. - valueStart convtBuf57. // 存入内部容器中,这里用的是 Hashtable 内部的方法.58. putkey value59. 60. lt/SPANgtpublic synchronized void loadInputStream inStream throws IOException // 将输入流转换成 LineReader load0new LineReaderinStream private void load0LineReader lr throws IOException char convtBuf new char1024 int limit int keyLen int valueStart char c boolean hasSep boolean precedingBackslash // 一行一行处理 while limit lr.readLine gt 0 c 0 keyLen 0 valueStart limit hasSep false precedingBackslash false // 下面用 2 个循环来处理 keyvalue while keyLen lt limit c lr.lineBufkeyLen // need check if escaped. if c c : ampamp precedingBackslash valueStart keyLen 1 hasSep true break else if c c t c f ampamp precedingBackslash valueStart keyLen 1 break if c precedingBackslash precedingBackslash else precedingBackslash false keyLen while valueStart lt limit c lr.lineBufvalueStart if c ampamp c t ampamp c f if hasSep ampamp c c : hasSep true else break valueStart String key loadConvertlr.lineBuf 0 keyLen convtBuf String value loadConvertlr.lineBuf valueStart limit - valueStart convtBuf // 存入内部容器中,这里用的是 Hashtable 内部的方法. putkey value LineReader 类,是 Properties 内部的类:Java 代码1.ltSPAN stylequotFONT-WEIGHT: normalquotgtclass LineReader 2. public LineReaderInputStream inStream 3. this.inStream inStream4. inByteBuf new byte81925. 6.7. public LineReaderReader reader 8. this.reader reader9. inCharBuf new char819210. 11.12. byte inByteBuf13. char inCharBuf14. char lineBuf new char102415. int inLimit 016. int inOff 017. InputStream inStream18. Reader reader19.20. /21. 读取一行22. 23. return24. throws IOException25. /26. int readLine throws IOException 27. int len 028. char c 029. boolean skipWhiteSpace true// 空白30. boolean isCommentLine false// 注释31. boolean isNewLine true// 是否新行.32. boolean appendedLineBegin false// 加 至行开始33. boolean precedingBackslash false// 反斜杠34. boolean skipLF false35. while true 36. if inOff gt inLimit 37. // 从输入流中读取一定数量的字节并将其存储在缓冲区数组inCharBuf/inByteBuf 中这里区分字节流和字符流38. inLimit inStream null reader.readinCharBuf39. : inStream.readinByteBuf40. inOff 041. // 读取到的为空.42. if inLimit lt 0 43. if len 0 isCommentLine 44. return -145. 46. return len47. 48. 49. if inStream null 50. // 由于是字节流,需要使用 ISO8859-1 来解码51. c char 0xff amp inByteBufinOff52. else 53. c inCharBufinOff54. 55.56. if skipLF 57. skipLF false58. if c n 59. continue60. 61. 62. if skipWhiteSpace 63. if c c t c f 64. continue65. 66. if appendedLineBegin ampamp c r c n 67. continue68. 69. skipWhiteSpace false70. appendedLineBegin false71. 72. if isNewLine 73. isNewLine false74. if c c 75. // 注释行,忽略.76. isCommentLine true.
上一篇:
深入浅出
下一篇:
还记得,那年的风车吗?