Collection
collection的遍歷方式
- 迭代器遍歷
- 不依賴索引
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class mycollection {public static void main(String[] args) {//1.創建集合并添加元素Collection<String> coll = new ArrayList();coll.add("aaa");coll.add("bbb");coll.add("ccc");coll.add("ddd");//2.獲取迭代器對象//迭代器就好比是一個箭頭,指向集合中的0索引處Iterator<String> it = coll.iterator();//3.利用循環不斷的去獲取集合中的每一個元素while(it.hasNext()) {//4.next方法夫人兩件事情:獲取元素并移動指針String str = it.next();System.out.println(str);}}
}
- 迭代器的細節注意點:
1.報錯NoSuchElementException
2.迭代器遍歷完畢,指針不會復位
3.循環中只能用一次next方法
4.迭代器遍歷時,不能用集合的方法進行增加或者刪除
增強for
//快速生成方式:
//集合的名字+for回車
//1.創建集合并添加元素
collection<string> coll new arrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
//2.利用增強for進行遍歷
//注意點:
1/s其實就是一個第三方變量,在循環的過程中依次表示集合中的每一個數據
for(string s : coll){s "qqq"'
system.out.println(coll);//zhangsan lisi wangwu
List集合
- 刪除元素
請問:此時刪除的是1這個元素,還是1索引上的元素?
為什么?
因為在調用方法的時候,如果方法出現了重載現象
優先調用,實參跟形參類型一致的那個方法。
list.remove(1);
- 練習
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;public class mylist {public static void main(String[] args) {//1.創建列表并添加元素List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");//1.迭代器方式遍歷Iterator<String> it = list.iterator();while (it.hasNext()) {String str = it.next();System.out.println(str);}//2.增強for//下面的變量s,其實是一個第三方的變量而已//在循環的過程中,依次表示集合中的每一個元素for (String str : list) {System.out.println(str);}//3.Lambda表達式//forEach方法的底層啟示就是一個循環遍歷,依次得到集合的每一個元素//并把每一個元素傳遞給下面的accept方法//accept方法的形參s,依次表示集合的每一個元素list.forEach(s-> System.out.println(s));}
}
數據結構
棧
- 棧的特點:后進先出,先進后出
隊列
- 隊列特點:先進先出,后進后出
- 數據從后端進入隊列模型的過程稱為:入隊列
數據從前端離開隊列模型的過程稱為:出隊列
鏈表
- 鏈表中的結點是獨立的對象,在內存中是不連續的,每個結點包含數據值和下一個結點的地址。
- 鏈表查詢慢,無論查詢哪個數據都要從頭開始找。
- 鏈表增刪相對快
ArrayList
- 底層源碼
LinkedList集合
- 底層數據結構是雙鏈表,查詢慢,增刪快,但是如果操作的是首尾元素,速度也是極快的。
- LinkedList本身多了很多直接操作首尾元素的特有API。
泛型深入
- 統一數據類型。
- 把運行時期的問題提前到了編譯期間,避免了強制類型轉換可能出現的異常,因為在編譯階段類型就能確定下來。
泛型的細節
- 泛型中不能寫基本數據類型
- 指定泛型的具體類型后,傳遞數據時,可以傳入該類類型或者其子類類型
- 如果不寫泛型,類型默認是Object
泛型可以在很多地方進行定義
泛型接口
- 泛型不具備繼承性
- 此時,泛型里面寫的是什么類型,那么只能傳遞什么類型的的數據
弊端:
利用泛型方法有一個小弊端,此時他可以接受任意的數據線類型
Ye Fu Zi Student
希望:本方法雖然不確定類型,但是以后我希望只能傳遞 Ye Fu Zi
此時我們就可以使用泛型的通配符:
?也表示不確定的類型
他可以進行類型的限定
?extendsE:表示可以傳遞E或者E所有的子類類型
?superE:表示可以傳遞E或者E所有的父類類型
TreeSet
package TreeSetDemo;import java.util.TreeSet;
import java.util.function.Consumer;public class TreeSetDemo2 {public static void main(String[] args) {/*需求:創建5個學生對象屬性:(姓名,年齡,語文成績,數學成績,英語成績),按照總分從高到低輸出到控制臺如果總分一樣,按照語文成績排如果語文一樣,按照數學成績排如果數學成績一樣,按照英語成績排如果英文成績一樣,按照年齡排如果年齡一樣,按照姓名的字母順序排如果都一樣,認為是同一個學生,不存。*///默認排序//創建學生對象Student s1 = new Student("zhangsan",23,77,88,99);Student s2 = new Student("lisi",23,87,67,99);Student s3 = new Student("wangwu",23,67,85,78);Student s4 = new Student("zhaoliu",23,87,86,87);//創建集合TreeSet<Student> treeSet = new TreeSet<Student>();treeSet.add(s1);treeSet.add(s2);treeSet.add(s3);treeSet.add(s4);//增強forfor (Student t : treeSet) {System.out.println(t);}}
}
package TreeSetDemo;public class Student implements Comparable<Student>{private String name;private int age;private int chinese;private int math;private int english;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", chinese=" + chinese +", math=" + math +", english=" + english +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getChinese() {return chinese;}public void setChinese(int chinese) {this.chinese = chinese;}public int getMath() {return math;}public void setMath(int math) {this.math = math;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}public Student(String name, int age, int chinese, int math, int english) {this.name = name;this.age = age;this.chinese = chinese;this.math = math;this.english = english;}public Student() {}@Overridepublic int compareTo(Student o) {int sum1 = this.getChinese() + this.getMath() + this.getEnglish();int sum2 = o.getChinese() + o.getMath() + o.getEnglish();int i = sum1 - sum2;i = i == 0 ? this.getChinese() - o.getChinese() : i;i = i == 0 ? this.getMath()- o.getMath() : i;i = i == 0 ? this.getEnglish()- o.getEnglish() : i;i = i ==0 ? this.getAge() - o.getAge() : i;i = i ==0 ? this.getName().compareTo(o.getName()) : i;return i;}
}