程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java容器類分析之List ArrayList Vector

Java容器類分析之List ArrayList Vector

編輯:關於JAVA

List是接口,聲明了各個方法,不多說。且看ArrayList類。

ArrayList類的成員變量有Object[] elementData,int size;其中elementData數組用來存儲加入到ArrayList的對象,size為列表中實際的對象數目。ArrayList類不是線程安全的。

Vector與ArrayList的實現基本相同,只是Vector類是線程安全的,其方法都帶有synchronized關鍵字,如果不考慮線程同步的話,ArrayList性能要好一些。當前它們內部實現原理都是用到對象數組來實現,如果元素數目確定,直接用數組效率最高。

簡單的用法:(後面是數據打印結果)

  1. public class ListDemo {
  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<String>();
  7. String[] strArr = new String[3];
  8. boolean ret = list.add("haha");
  9. list.add(new String("aa"));
  10. list.add(null);
  11. System.out.println(list.size());//3
  12. System.out.println(ret);//true
  13. System.out.println(list);//[haha, aa, null]
  14. System.out.println(strArr);//[LJava.lang.String;@1fee6fc
  15. System.out.println(strArr.getClass().getName());//[LJava.lang.String;
  16. System.out.println(list.indexOf("aa"));//1
  17. System.out.println(list.indexOf(null));//2
  18. String str = list.set(1, "ee");
  19. System.out.println(str);//aa
  20. System.out.println(list);//[haha, ee, null]
  21. String remove = list.remove(0);
  22. System.out.println(remove);//haha
  23. System.out.println(list);//[ee, null]
  24. boolean result = list.remove("ff");
  25. System.out.println(result);//false
  26. result = list.remove("ee");
  27. System.out.println(result);//true
  28. System.out.println(list);//[null]
  29. }
  30. }
  1. public ArrayList() {
  2. this(10);
  3. }
  4. public ArrayList(int initialCapacity) {
  5. super();
  6. if (initialCapacity < 0)
  7. throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
  8. this.elementData = new Object[initialCapacity];
  9. }
  10. public boolean add(E e) {
  11. ensureCapacity(size + 1); // Increments modCount!!
  12. elementData[size++] = e;
  13. return true;
  14. }
  15. /*移除指定位置元素,注意每次移除數據都會將數組中後面數據移動來填充數組*/
  16. public E remove(int index) {
  17. RangeCheck(index);
  18. modCount++;
  19. E oldValue = (E) elementData[index];
  20. int numMoved = size - index - 1;
  21. if (numMoved > 0)
  22. System.arraycopy(elementData, index+1, elementData, index,
  23. numMoved);
  24. elementData[--size] = null; // index後面數據依次往前移動,將最後一個位置賦值為0,讓gc來回收空間。
  25. return oldValue;
  26. }
  27. public void ensureCapacity(int minCapacity) {
  28. modCount++;//這個變量不用管。
  29. int oldCapacity = elementData.length; //初始時設定的數組長度
  30. if (minCapacity > oldCapacity) { //如果數組對象數目>初始數組長度,則需要擴容。
  31. Object oldData[] = elementData;
  32. int newCapacity = (oldCapacity * 3)/2 + 1; //新的容量大小
  33. if (newCapacity < minCapacity)
  34. newCapacity = minCapacity;
  35. /*該方法會創建一個新的對象數組,然後調用 System.arraycopy(original, 0, copy, 0,
  36. Math.min(original.length, newLength));方法將源數組數據拷貝到新數組中。引用更新,指 向新的對象數組。*/
  37. elementData = Arrays.copyOf(elementData, newCapacity);
  38. }
  39. }
  40. /*將對象數組削減到當前元素數目大小,減少存儲空間*/
  41. public void trimToSize() {
  42. modCount++;
  43. int oldCapacity = elementData.length;
  44. if (size < oldCapacity) {
  45. elementData = Arrays.copyOf(elementData, size);
  46. }
  47. }
  48. /*查找對象首次出現的位置,若沒有找到,返回-1。由
  49. 代碼可知,可以在list中加入null對象,並查找到。*/
  50. public int indexOf(Object o) {
  51. if (o == null) {
  52. for (int i = 0; i < size; i++)
  53. if (elementData[i]==null)
  54. return i;
  55. } else {
  56. for (int i = 0; i < size; i++)
  57. if (o.equals(elementData[i]))
  58. return i;
  59. }
  60. return -1;
  61. }
  62. /*替換指定位置的元素值,返回該位置中old值*/
  63. public E set(int index, E element) {
  64. RangeCheck(index); //檢查范圍
  65. E oldValue = (E) elementData[index];
  66. elementData[index] = element;
  67. return oldValue;
  68. }
  69. /*返回指定位置的值*/
  70. public E get(int index) {
  71. RangeCheck(index);
  72. return (E) elementData[index];
  73. }
  74. private void RangeCheck(int index) {
  75. if (index >= size)
  76. throw new IndexOutOfBoundsException(
  77. "Index: "+index+", Size: "+size);
  78. }
  79. public int size() {
  80. return size;
  81. }
  82. public boolean isEmpty() {
  83. return size == 0;
  84. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved