首先我覺的要明白什麼是集合?是幹嘛的?
集合:集合是java中提供的一種容器,可以用來存儲多個數據
集合和數組既然都是容器,它們有什麼區別呢?
- 數組的長度是固定的。集合的長度是可變的。
- 數組中存儲的是同一類型的元素,可以存儲任意類型數據。集合存儲的都是引用數據類型。如果想存儲基本類型數據需要存儲對應的包裝類型。
Collection常用功能:
1.boolean add(E e) 往集合中添加一個元素
2.void clear() 從此集合中刪除所有元素
3.boolean contains(Object o) 判斷集合中是否包含指定的元素
4.boolean isEmpty() 判斷集合是否爲空(沒有元素),如果爲空返回true
5.boolean remove(Object o) 刪除集合中的指定元素,如果刪除返回true
6.int size() 返回此集合中的元素數
7.Object[] toArray() 將集合轉成數組
下面是集合繼承體系圖:
有關Collection中的方法可不止上面這些,其他方法可以自行查看API學習。
代碼演示:
public static void main(String[] args) {
// 我們學習Collection集合中的方法,編譯看左邊,我們使用的方法都是來自Collection接口
// 多態
// 接口 變量名 = new 實現類();
Collection<String> coll = new ArrayList<>();
// 1.boolean add(E e) 往集合中添加一個元素
coll.add("王寶強");
coll.add("謝霆鋒");
coll.add("賈乃亮");
coll.add("陳羽凡");
System.out.println(coll);
// 2.void clear() 從此集合中刪除所有元素
// coll.clear();
// 3.boolean contains(Object o) 判斷集合中是否包含指定的元素
System.out.println(coll.contains("賈乃亮")); // true
System.out.println(coll.contains("杜海濤")); // false
// 4.boolean isEmpty() 判斷集合是否爲空(沒有元素),如果爲空返回true
System.out.println(coll.isEmpty());
// 5.boolean remove(Object o) 刪除集合中的指定元素,如果刪除返回true
System.out.println(coll.remove("王寶強")); // true
System.out.println(coll.remove("大郎")); // false
// 6.int size() 返回此集合中的元素數
System.out.println(coll.size());
System.out.println(coll);
System.out.println("------");
// 7.Object[] toArray() 將集合轉成數組
Object[] objects = coll.toArray();
for (int i = 0; i < objects.length; i++) {
Object obj = objects[i];
System.out.println(obj);
}
}
List接口:
List接口的特點:
1、可以重複
2、有序
3、有索引
常用的List: ArrayList(Vector)、LinkedList
使用List接口中的常用方法:
void add(int index, E element) 將指定的元素插入此列表中的指定位置(可選操作)。
E get(int index) 返回此列表中指定位置的元素。
E remove(int index) 刪除該列表中指定位置的元素(可選操作)。
E set(int index, E element) 用指定的元素(可選操作)替換此列表中指定位置的元素。
代碼演示:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(2);
list.add(3);
System.out.println("list = " + list);
System.out.println("list.get(3) = " + list.get(3));
//[1,1,5,2,3]
//void add(int index, E element) 將指定的元素插入此列表中的指定位置(可選操作)。
list.add(2,5);
System.out.println("list = " + list);
//E get(int index) 返回此列表中指定位置的元素。
Integer integer = list.get(4);
System.out.println("integer = " + integer);
//E remove(int index) 刪除該列表中指定位置的元素(可選操作)。
Integer removeEle = list.remove(2);//[1,1,5,2,3]
System.out.println("removeEle = " + removeEle);
System.out.println("list = " + list); //[1, 1, 2, 3]
//注意下標和泛型是Integer的時候,remove可能會誤導
boolean isRemove = list.remove(Integer.valueOf(9));
System.out.println("isRemove = " + isRemove);
System.out.println("list = " + list); //[1, 1, 3]
//E set(int index, E element) 用指定的元素(可選操作)替換此列表中指定位置的元素。
//增刪查改
//[1, 1, 2, 3]
Integer setObj = list.set(1,10);
System.out.println("list = " + list);
System.out.println("setObj = " + setObj);
}
ArrayList底層
通過源碼可以看到ArrayList底層其實是個數組,元素增刪慢,查找快,也是我們使用最多的。
Object[] elementData = {};
1、第一次添加元素,把elementData通過Arrays.copyOf(elementData,
newCapacity(minCapacity))擴容成默認的長度10
Arrays.copyOf(數組,新的長度),把數組擴容到新的長度,並且保留原來的數據
它的底層是System.arrayCopy()
2、第十次添加元素的時候,會觸發擴容,擴容成原來程度的1.5倍
代碼演示:
ArrayList<Integer> list = new ArrayList<>();
list.add(1); //初始化數組的容量是10
list.add(2);
list.add(3);
list.add(4);
list.add(5);
LinkedList集合
- java.util.LinkedList 集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合,是一個雙向鏈表。
實際開發中對一個集合元素的添加與刪除經常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法:
public void addFirst(E e) :將指定元素插入此列表的開頭。
public void addLast(E e) :將指定元素添加到此列表的結尾。
public E getFirst() :返回此列表的第一個元素。
public E getLast() :返回此列表的最後一個元素。
public E removeFirst() :移除並返回此列表的第一個元素。
public E removeLast() :移除並返回此列表的最後一個元素。
public E pop() :從此列表所表示的堆棧處彈出一個元素。
public void push(E e) :將元素推入此列表所表示的堆棧。
public boolean isEmpty() :如果列表不包含元素,則返回true。
LinkedList是List的子類,List中的方法LinkedList都是可以使用,這裏就不做詳細介紹,在開發時,LinkedList集合也可以作爲堆棧,隊列的結構使用。
Vector集合
java.util.Vector集合數和ArrayList一樣底層使用數組結構。元素增刪慢,查找快,與ArrayList不同的是Vector是線程
安全的,速度慢,工作中很少使用。
- Enumeration elements() 返回此Vector的枚舉(迭代器的前身)。
說到最後總結一下:
如何選擇集合?
1.如果元素不能重複使用:
Set:
HashSet: 綜合性比較強 LinkedHashSet: 保留了順序,增刪比較慢(多維護一個鏈表來存儲數據)
2.如果元素可以重複:
List:
LinkedList:增刪多,查找少,只在頭尾加元素 ArrayList: 綜合性比較強,當不確定使用什麼的時候就使用