1、數組與集合的區別
數組:長度固定,可以存儲基本數據類型,也能存儲對象
集合:長度可變,只能存儲對象類型(由於有包裝類的存在,集合可以存儲任何類型)。
2、集合的體系結構
集合也叫容器用於存儲對象。我們根據不同的需求和不同的數據結構來對集合做了不同的抽象。
3、集合的方法
①添加
②刪除
③判斷
④數組的轉換
⑤遍歷
package cn.tx.coll;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo4 {
public static void main(String[] args) {
//創建一個集合
Collection coll = new ArrayList();
for(int i = 0;i<10;i++){
coll.add("哈哈"+i);
}
//System.out.println(coll);
//創建集合的迭代器,這個迭代器it創建在ArrayList&It裏面的內部類,只能給coll這個集合使用
Iterator it = coll.iterator();
while(it.hasNext()){
//Object ob = it.next();
//已經知曉後直接將其強轉爲相應的數據類型
//shift+ait+r 可以修改同名變量
String str = (String)it.next();
System.out.println(str);
//ctrl+對應字能查看源代碼和需要實現類等
}
//再次創建一個迭代器
Iterator it1 = coll.iterator();
while(it1.hasNext()){
String str = (String)it1.next();
System.out.println(str);
}
/**
//迭代器在遍歷的時候不能進行其他操作
Iterator it2 = coll.iterator();
while(it2.hasNext()){
String str = (String)it2.next();
if("哈哈2".equals(str)){
coll.add("嘻嘻");
}
System.out.println(str);
}
*/
//遊標一旦走過循環後就不能在回去了
boolean isHs = it.hasNext();
System.out.println(isHs);
}
}
3、List
有序的 collection(也稱爲序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據元素的整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。
需要掌握的方法:
①存儲
②獲取
③遍歷
④刪除
package cn.tx.coll;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class CollectionDemo6 {
public static void main(String[] args) {
//創建一個List接口的集合
List list = new ArrayList();
list.add("11");
list.add("22");
list.add("33");
//創建一個迭代器
ListIterator li = list.listIterator();
while(li.hasNext()){
Object obj = li.next();
System.out.println(obj);
}
//是否有前一個元素
boolean isHasPre = li.hasPrevious();
System.out.println(isHasPre);
System.out.println("--------------");
//反向遍歷
while(li.hasPrevious()){
Object obj2 = li.previous();
System.out.println(obj2);
}
System.out.println("--------------------");
//listIterator的迭代器只能遍歷出創建迭代器對象之前的list的狀態的內容
/**
ListIterator li1 = list.listIterator();
while(li1.hasNext()){
Object obj3 = li1.next();
if("發".equals(obj3)){
//通過這個迭代器可以在list中添加元素,不會出現併發問題
li1.add("heihei");
}
System.out.println(obj3);
}
System.out.println(list);
*/
System.out.println("-----------------");
//這個循環中size是動態的,添加後每次都在獲取size的值
for(int i = 0;i < list.size();i++){
Object obj4 = list.get(i);
if("22".equals(obj4)){
list.add("嘿嘿");
}
System.out.println(obj4);
}
}
}
4、ArrayList
List 接口的大小可變數組的實現。實現了所有可選列表操作,並允許包括null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。
特點:
ArrayList中的元素和可以重複。
是有序的集合,長度不固定。
不是線程安全的。
效率高。
5、LinkedList
List 接口的鏈接列表實現。實現所有可選的列表操作,並且允許所有元素(包括null)。除了實現 List 接口外,LinkedList類還爲在列表的開頭及結尾 get、remove 和 insert 元素提供了統一的命名方法。這些操作允許將鏈接列表用作堆棧、隊列或雙端隊列。不是線程安全的。
package cn.tx.coll;
import java.util.LinkedList;
import java.util.List;
public class CollectionDemo8 {
public static void main(String[] args) {
//創建一個List接口的集合
LinkedList list = new LinkedList();
list.add("11");
list.add("22");
list.add("33");
//把元素插入列表的頭和尾
list.addFirst("woaini");
list.addLast("wojiushiaini");
System.out.println(list);
//獲得頭元素,只是獲得,沒有提走
Object ob = list.element();
System.out.println(ob);
//出棧
Object ob1 = list.poll();
System.out.println(ob1);
System.out.println(list);
//壓棧
list.push("cheng");
System.out.println(list);
}
}
6、Vector
和ArrayList功能類似,最主要的區別就在於vector是線程併發安全的。但是缺點是效率比較低。
package cn.tx.coll;
import java.util.Enumeration;
import java.util.Vector;
public class CollectionDemo9 {
public static void main(String[] args) {
Vector v = new Vector();
v.add("張三");
v.add("李四");
v.add("王五");
//獲得集合中的每個元素
Enumeration em=v.elements();
while(em.hasMoreElements()){
Object ob = em.nextElement();
if("李四".equals(ob)){
v.add("田八");
}
System.out.println(ob);
}
}
}
7、泛型
我們在項目中使用集合基本99%都是在集合中存儲同一種數據類型。既然我們在集合中存儲同一種數據類型,我們事先一定知道這個集合中要存儲什麼數據類型。我們就可以預先去指定要存儲的數據類型。
①泛型在集合中的運用
泛型:就是提前指定要操作的數據類型。
在集合使用的語法:
在定義集合的時候,List<數據類型> 變量名= new ArrayList<數據類型>();
package cn.tx.generic;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class GenericDemo2 {
public static void main(String[] args) {
//集合中可以存儲任何數據類型,實際情況都是在集合中存儲一種數據類型,我們可以通過泛型來指這種數據類型
Collection<String> sc = new ArrayList<String>();
sc.add("haha");
sc.add("xixi");
sc.add("hehe");
sc.add("eueu");
//迭代器也帶泛型
Iterator<String> it =sc.iterator();
while(it.hasNext()){
//直接使用String來接收
String str = it.next();
System.out.println(str);
}
List<String> list = new ArrayList<String>();
list.add("haha");
list.add("xixi");
list.add("hehe");
list.add("eueu");
for(int i = 0;i < list.size();i++){
String str2 = list.get(i);
System.out.println(str2);
}
}
}
②自定義泛型
在自定義泛型時
語法:class/interface 類名/接口名 <T>{ }
T只是泛型的一個標準,使用什麼字符都可以,但是都要大寫,不要使用特殊字符,建議用T。
package cn.tx.generic;
import java.util.Date;
import cn.tx.coll.Student;
public class GenericTestMain<T> {
public static void main(String[] args) {
GenericTest<String> gt = new GenericTest<String> ();
String[] arr = new String[3];
arr[0]="張三";
arr[1]="李四";
arr[2]="王五";
gt.setArr(arr);
String str = gt.getByIndex(1);
System.out.println(str);
System.out.println("-----------------");
GenericTest<Student> gt1 = new GenericTest<Student> ();
Student[] arr1 = new Student[3];
arr1[0]=new Student(1,"aa",1,new Date());
arr1[1]=new Student(1,"bb",1,new Date());
arr1[2]=new Student(1,"cc",1,new Date());
gt1.setArr(arr1);
Student stu = gt1.getByIndex(1);
System.out.println(stu);
}
}
8、小結
①數組如果不遍歷只能輸出對應的地址;
②接口的方法都是抽象的,不能被實例化;
③ctrl+對應關鍵字 找出源代碼;
④Vector是線性同步的,安全但是效率不高;
⑤迭代器只能用在創建的的集合中,只能單次使用,如果需要再次使用,需要重新定義。