1. 數組與集合
用來存儲一種數據類型的集合容器。
特點:
1. 只能存儲一種數據類型的數據
2. 一旦初始化,數組的長度是固定的
3. 數組中元素之間的內存地址連續
4. Object類型的數組可以存放任意類型的數據
集合相比與數組:
集合可以存放任意類型的數據對象,數組只能存放同一種類型的數據。
集合的長度是可以改變的,數組是固定長度的。
2. Collection接口
以下是Java API中關於Collection接口的說明:
Collection 層次結構 中的根接口。Collection 表示一組對象,這些對象也稱爲 collection 的元素。一些 collection 允許有重複的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。JDK 不提供此接口的任何直接實現:它提供更具體的子接口(如 Set 和 List)實現。歸納如下:
---| Collection 單例集合根接口
------| List 特點:有序、可以重複
------| Set 特點:無序、不可重複
Collection根接口的常見方法包括:增加元素、刪除元素、查詢、迭代等操作
package com.xpeng_V.collection;
import java.util.*;
/**
---| Collection 單例集合根接口
------| List 特點:有序、可以重複
------| Set 特點:無序、不可重複
*/
public class MyCollection{
public static void main(String[] args) {
//使用Collection的實現類ArrayList
Collection list = new ArrayList();
Collection list2 = new ArrayList();
/* 增加
* add(E e) 向集合中添加元素
* add(Collection<?> c) 向集合中添加一個集合
*/
System.out.println("=====================添加元素=====================");
list.add("xpeng_V");
list2.add("A");
list2.add("A");
list2.add(10);
list.add(list2);
System.out.println(list);
/* 刪除
* remove() 刪除集合中的指定元素(遇到的第一個)
* removeAll(Collection<?> c) 刪除交集元素
* retainAll(collection<?> c) 保留交集元素,刪除其他元素
* clear() 清空集合中的元素
*
*/
System.out.println("=====================刪除元素=====================");
list2.remove("A");
list2.clear();
System.out.println(list2);
/* 查詢
* size() 查看集合的大小
*/
System.out.println("=======================查詢======================");
System.out.println("list="+list+"的大小是:"+list.size());
/* 判斷
* isEmpty() 是否爲空集合
* contains() 判斷是否存在指定元素
* containsAll(Collection<?> c)
*/
System.out.println("=======================判斷======================");
System.out.println("list是否爲空:"+list.isEmpty());
System.out.println("是否存在xpeng_V:"+list.contains("xpeng_V"));
/* 迭代遍歷
* toArray() 返回集合中的所有元素的爲Object類型的數組
* iterator() 使用iterator迭代器遍歷集合
*/
System.out.println("=====================迭代遍歷=====================");
list.clear();
list.add(new Person(1, "甲"));
list.add(new Person(2, "乙"));
list.add(new Person(3, "丙"));
Object[] arr = list.toArray();
System.out.println("返回的數組是:"+Arrays.toString(arr));
//輸出編號是2的人的信息
for (int i = 0; i < arr.length; i++) {
Person p = (Person) arr[i]; //返回數組類型是Object,需要強轉
if(p.id == 2){
System.out.println(p);
}
}
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class Person{
int id;
String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "{"+id+"--"+name+"}";
}
}
2.1 List接口
已經說明了Collection接口中常見的方法,以下代碼包含List接口中特有的方法。
List接口中的特殊方法,都具有索引值。
package com.xpeng_V.collection;
import java.util.*;
/**
---| Collection 單例集合根接口
------| List 特點:有序、可以重複
------| Set 特點:無序、不可重複
*/
public class MyList {
public static void main(String[] args) {
List list = new ArrayList();
List list2 = new ArrayList();
System.out.println("有序、可重複、可以爲空");
list.add("A");
list.add("A");
list.add("B");
list.add(null);
System.out.println(list);
list.clear();
/* 添加元素
* add(index i,E e) 將元素添加到集合的指定位置
* addAll(index i,Collection<?> c) 將集合c添加到原集合的指定位置
*/
System.out.println("====================添加元素====================");
list.add(1);
list.add(2);
list.add(3);
list.add(1, "e");
list2.add("4");
list2.add("5");
list.add(0, list2);
list.add(1);
System.out.println(list);
/* 獲取方法
* get(index i) 獲取指定索引值的元素
* indexOf(E e) 獲取指定元素第一次出現在集合中的索引值
* lastIndexOf(E e) 獲取指定元素最後一次出現在集合中的索引值
* subList(fromIndex i1,toIndex i2) 截取兩索引值之間的元素返回一個List(包頭不包尾)
*/
System.out.println("=====================獲取=====================");
System.out.println("使用循環遍歷List集合");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
System.out.println();
System.out.println("元素'1'第一次出現的索引值:"+list.indexOf(1));
System.out.println("元素'1'最後一次出現的索引值:"+list.lastIndexOf(1));
List list3 = list.subList(2, 4);
System.out.println("返回的list:"+list3);
/* 修改
* set(index i,E e) 使用指定元素替換索引爲i的元素
*/
System.out.println("=====================修改=====================");
list.set(0, "替換");
System.out.println(list);
/* 迭代
* listIterator()
*/
System.out.println("====================迭代遍歷====================");
ListIterator it = list.listIterator();
/* ListIterator是Iterator的子接口,它具有Iterator的所有方法。
* add(E e) 把當前元素插入到當前指針所在的位置
* set(E e) 替換迭代器最後一次返回的元素
* hasPrevious() 逆序遍歷
* previous() 返回前一個元素
*/
//逆序排列
while(it.hasNext()){
it.next(); //現將指針移動到列表最下端
}
while(it.hasPrevious()){
System.out.println(it.previous());//逆序遍歷
}
it.next();
it.add("A");
System.out.println(list);
it.next();
it.next();
it.set("B");
System.out.println(list);
}
}
2.1.1 ArrayList
ArrayList底層維護了一個Object數組,使用無參構造函數實例化時,Object數組默認的容量是10,當容量不夠時,自動增加0.5倍!
參考ArrayList源碼:
---| Collection 單例集合根接口
------| List 特點:有序、可以重複
--------| ArrayList
--------| LinkedList
--------| Vector
------| Set 特點:無序、不可重複
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
private transient Object[] elementData;
private int size;
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
//無參數構造方法,默認的容量是10
public ArrayList() {
this(10);
}
......
......
ArrayList特點:底層維護了一個Object數組,查詢快,增刪慢
ArrayList實例化時,會創建一個Object數組,內存地址是連續的,所以查詢的速度快。
對ArrayList進行增加操作而ArrayList容量不足時,ArrayList首先會增加0.5倍的容量形成一個新的ArrayList,然後將以前的數據拷貝到新的ArrayList中,最後插入新增的數據。因爲拷貝佔用大量的時間,所以ArrayList增加的速度較慢;
對ArrayList進行刪除操作時,會將刪除元素之後的元素拷貝到前面的位置,所以刪除的速度較慢;
2.1.2 LinkedList
LinkedList使用鏈表的數據結構實現,查詢慢,增刪快