1. 程式人生 > 其它 >SeventeenDay-java Collection的子類及其實現類

SeventeenDay-java Collection的子類及其實現類

1、取迭代器的注意事項

注意:一旦集合結構發生改變,迭代器必須重新獲取

public static void main(String[] args) {
Collection c=new ArrayList();
/*
此處的迭代器,指向的是集合中沒有元素的狀態。
注意:一旦集合結構發生改變,迭代器必須重新獲取
若沒有重新獲取 則在呼叫next()方法時 會出現ConcurrentModificationException的異常
*/
  //獲取迭代器
Iterator it=c.iterator();
c.add(1);//c中存放的是 new Integer(1);記憶體地址
c.add(3);
c.add("4");

while(it.hasNext()){
Object obj=it.next();//返回型別必須是Object型別
System.out.println(obj);
}
}

2、remove

當迭代刪除元素的時候,要使用迭代器刪除元素

Iterator it=c.iterator();
while(it.hasNext()){
Object obj=it.next();//返回型別必須是Object型別
/*通過集合去刪除元素,刪除的是集合中的元素,而迭代器快照中並沒有更新,會出現ConcurrentModificationException的異常
*/
//c.remove(obj);
it.remove();//通過迭代器刪除當前指向元素,會自動更新迭代器,並且更新集合(刪除集合中的元素)
System.out.println(obj);
}

3、List中常用方法

List特點:可重複有序,有序是指存入的順序與取出的順序一樣

List介面繼承Collection介面,除繼承父類方法還有自己獨有的方法:

  void add(int index, E element);

  E get(int index)

  int indexOf(Object o)

  int lastIndexOf(Object o)

  E set(int index, E element)

  E remove(int index)

public static void main(String[] args) {
//建立List型別的集合
List mylist=new ArrayList();
//新增元素 預設新增到集合末尾
mylist.add("w");
mylist.add("a");
mylist.add("j");
//新增元素到指定位置

mylist.add(1,"a");
//取迭代器
Iterator o=mylist.iterator();
//迭代
while(o.hasNext()){
Object obj=o.next();
System.out.print(obj+" ");//w a a j
}
System.out.println("\n========");
//返回元素第一次出現的下標,最後出現的下標
System.out.println(mylist.indexOf("a"));//1
System.out.println(mylist.lastIndexOf("a"));//2
//刪除指定下標的元素
System.out.println(mylist.remove(1));//a
//用指定的元素替代指定位置上的元素
System.out.println(mylist.set(0,"s"));//返回的是被替代元素 w
//根據下標遍歷集合
for (int i = 0; i < mylist.size(); i++) {
System.out.print(mylist.get(i)+" ");//s a j
}

}

4、ArrayList集合

List的實現類

  • 預設初始化容量為10;(底層先建立一個空陣列,當新增第一個元素的時候,容量為10)

  • 集合底層是Object[]陣列

  • 構造方法: new ArrayList(); new ArrayList(20);

  • 集合擴容:集合滿了後(底層陣列滿了)每次擴容原容量的1.5倍

  • 優點:檢索效率高(每個元素所佔記憶體空間一樣,空間地址連續)

  • 缺點:隨機增刪元素效率低,無法儲存大資料量,很難找到一塊大的連續空間

  • 不是執行緒安全的

//Array List 的構造方法程式碼
public static void main(String[] args) {
//初始化容量為10,元素個數為0
List list1=new ArrayList();
//初始化容量為20,元素個數為0
List list2=new ArrayList(20);
//建立一個HashSet集合
Collection c=new HashSet();
c.add(100);
c.add(200);
c.add(300);
List list3=new ArrayList(c);
System.out.println(list3.size());//3
}

5、LinkedList集合

List的實現類

連結串列的優點:由於連結串列在記憶體中儲存的地址不連續,所以隨機增刪不會發生大量元素位移,因此增刪效率較高

缺點: 由於記憶體地址不連續,每次檢索都要從頭節點開始,所以檢索效率較低

public static void main(String[] args) {
/*
LinkedList集合底層是雙向連結串列。
*/
List list=new LinkedList();
list.add("12");
list.add("as");
list.add(10);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}

補充:

//把ArrayList非執行緒安全轉換成執行緒安全
//使用工具類Java.util.Collections(注意Java.util.Collection是集合介面)
List mylist=new ArrayList();
Collections.synchronizedList(mylist);//把mylist變為執行緒安全的

6、Vector集合

實現List介面,與ArrayList,LinkedList用法一樣。

Vector:

  底層也是一個數組

  初始化容量10

   擴容是原容量的兩倍

   所有方法都是執行緒同步的

  是執行緒安全的,效率較低,使用較少

public static void main(String[] args) {
List list=new Vector();
list.add("qw");
list.add("12");
//獲取迭代器
Iterator it=list.iterator();
//迭代
while(it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}
}

7、自定義泛型

自定義泛型的時候,<>尖括號裡面是一個識別符號,隨便寫

最常用的是<E>,<T> E:是Element單詞首字母。 T:是Type單詞首字母

public class GenericTest03<A> {
public static void main(String[] args) {
GenericTest03<String> g=new GenericTest03<>();
g.doSome("12");//規定了A為String型別 呼叫doSome方法是傳參型別必須是String型別
String s=g.getSome();//A為String型別,故返回型別也為string
GenericTest03<Integer> I=new GenericTest03<>();
I.doSome(12);//規定了A為Integer型別 呼叫doSome方法傳參型別必須是Integer型別
int i=I.getSome();//A為int型別,故返回型別為int
//不用泛型
GenericTest03 g1=new GenericTest03();
Object obj=g1.getSome();//不用泛型,返回型別就是Object

}
public void doSome(A o){
System.out.println("泛型");
}
public A getSome(){
return null;
}
}

8、HashSet

Set介面的實現類

HashSet:無序不可重複,底層呼叫HashMap

存放在HashSet的元素實際上是放在HashMap的key部分了

public static void main(String[] args) {
Set<String> s=new HashSet<>();
s.add("12");
s.add("12");
s.add("12");
s.add("234");
s.add("123");
System.out.println(s.size());//3 資料不可重複
//遍歷
for (String s1 : s) {
System.out.println(s1);//輸出來的順序與存放的順序不一定一樣
}
}

9、TreeSet

SortedSet介面的實現類 (SortedSet繼承Set介面

TreeSet:無序不可重複 但是元素會自動按大小排序 稱可排序集合

public static void main(String[] args) {
Set<String> s=new TreeSet<>();
s.add("4");
s.add("a");
s.add("6");
s.add("a");
for (String s1 : s) {
System.out.print(s1+" ");//4 6 a
}
}

10、自動型別判斷機制(鑽石表示式)

public static void main(String[] args) {
//JDK8之後 ArrayList<>這裡可以省略不寫 程式自動識別
List<Animal> mylist=new ArrayList<>();
}