容器的概念
在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体。
容器中常用的方法
1 int size();返回大小
2 boolean isEmpty()非空判断
3 boolean contains(Object o)判断o在集合内是否存在
4 Iterator<E> iterator()集合迭代器
5 Object[] toArray()返回包含此容器中所有元素的数组
6 boolean remove(Object o)把o元素从集合内删除
7 boolean add(Object obj)向容器中添加指定的元素
8 Object get(int index)获取下标为index的那个元素
9 Object remove(int index)删除下标为index的那个元素
10 Object set(int index,Object element)将下标为index的那个元素置为element
11 Object add(int index,Object element)在下标index的位置添加一个对象element
12 Object put(Object key,Object value)向容器中添加指定的元素
13 Object get(Object key)获取关键字为key的那个对象
容器分类
Collection。
Set接口的实现为HashSet与TreeSet,List接口的实现为ArrayList与LinkedList,Map接口的实现为HashMap与TreeMap。
ArrayList常用方法
ArrayList实现了List接口,也叫动态数组,有三种构造函数,以下是源码中常用的方法以及注释。
1 //指定大小的构造函数
2 public ArrayList(int initialCapacity) {
3 if (initialCapacity > 0) {
4 this.elementData = new Object[initialCapacity];
5 } else if (initialCapacity == 0) {
6 this.elementData = EMPTY_ELEMENTDATA;
7 } else {
8 throw new IllegalArgumentException("Illegal Capacity: "+
9 initialCapacity);
10 }
11 }
12 //无参数构造函数
13 public ArrayList() {
14 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
15 }
16 //指定内容构造函数
17 public ArrayList(Collection<? extends E> c) {
18 elementData = c.toArray();
19 if ((size = elementData.length) != 0) {
20 if (elementData.getClass() != Object[].class)
21 elementData = Arrays.copyOf(elementData, size, Object[].class);
22 } else {
23 this.elementData = EMPTY_ELEMENTDATA;
24 }
25 }
26//返回集合长度
27 public int size() {
28 return size;
29 }
30 //判断集合内是否有值
31 public boolean isEmpty() {
32 return size == 0;
33 }
34 //判断集合中是否存在对象o
35 public boolean contains(Object o) {
36 return indexOf(o) >= 0;
37 }
38 //返回包含此集合中所有元素的数组
39 public Object[] toArray() {
40 return Arrays.copyOf(elementData, size);
41 }
42 //获取指定位置的元素
43 public E get(int index) {
46 return elementData(index);
47 }
48 //在指定位置替换元素
49 public E set(int index, E element) {
52 E oldValue = elementData(index);
53 elementData[index] = element;
54 return oldValue;
55 }
56 //添加元素
57 public boolean add(E e) {
58
59 elementData[size++] = e;
60 return true;
61 }
62 //在指定位置添加元素
63 public void add(int index, E element) {
69 elementData[index] = element;
70 size++;
71 }
72 //删除指定位置的元素
73 public E remove(int index) {
74
77 E oldValue = elementData(index);
78
79 int numMoved = size - index - 1;
80 if (numMoved > 0)
81 System.arraycopy(elementData, index+1, elementData, index,
82 numMoved);
83 elementData[--size] = null;
84
85 return oldValue;
86 }
87 //在指定元素
88 public boolean remove(Object o) {
89 if (o == null) {
90 for (int index = 0; index < size; index++)
91 if (elementData[index] == null) {
92 fastRemove(index);
93 return true;
94 }
95 } else {
96 for (int index = 0; index < size; index++)
97 if (o.equals(elementData[index])) {
98 fastRemove(index);
99 return true;
100 }
101 }
102 return false;
103 }
104
105 private void fastRemove(int index) {
106 modCount++;
107 int numMoved = size - index - 1;
108 if (numMoved > 0)
109 System.arraycopy(elementData, index+1, elementData, index,
110 numMoved);
111 elementData[--size] = null;
112 }
ArrayList数组扩容
每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。
ArrayList用例
1 public class ArrayListUse {
2 public static void main(String[] args) {
3 List test = new ArrayList();
4
5 test.add("1");
6 test.add("2");
7 test.add("3");
8 test.add("4");
9 test.add("5");
10
11 test.add(0,5);
12 System.out.println("指定位置add:"+test.get(0));
13 System.out.println("指定位置add:"+test.get(1));
14
15 test.remove(2);
16 System.out.println("指定位置删除"+test.get(2));
17 System.out.println("长度"+test.size());
18
19
20 }
21 }
总结
ArrayList是用数组实现的一种集合类,是非线程安全的,所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。