? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1.集合概述及繼承體系圖
A:集合的由來
數(shù)組長度是固定,當添加的元素超過了數(shù)組的長度時需要對數(shù)組重新定義,太麻煩,java內部給我們提供了集合類,能存儲任意對象,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少
B:數(shù)組和集合的區(qū)別
區(qū)別1 :
數(shù)組既可以存儲基本數(shù)據(jù)類型,又可以存儲引用數(shù)據(jù)類型,基本數(shù)據(jù)類型存儲的是值,引用數(shù)據(jù)類型存儲的是地址值
集合只能存儲引用數(shù)據(jù)類型(對象)集合中也可以存儲基本數(shù)據(jù)類型,但是在存儲的時候會自動裝箱變成對象
區(qū)別2:
數(shù)組長度是固定的,不能自動增長
集合的長度的是可變的,可以根據(jù)元素的增加而增長
C:數(shù)組和集合什么時候用 * 1,如果元素個數(shù)是固定的推薦用數(shù)組 * 2,如果元素個數(shù)不是固定的推薦用集合
D:集合繼承體系圖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.Collection集合的基本功能測試
?A:案例演示
基本功能演示
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.集合的遍歷之集合轉數(shù)組遍歷
A:集合的遍歷
其實就是依次獲取集合中的每一個元素辟拷。
B:案例演示
把集合轉成數(shù)組啃洋,可以實現(xiàn)集合的遍歷
toArray()
```java Collection coll = new ArrayList(); coll.add(new Student("張三",23)); //Object obj = new Student("張三",23); coll.add(new Student("李四",24)); coll.add(new Student("王五",25)); coll.add(new Student("趙六",26));
Object[] arr = coll.toArray(); //將集合轉換成數(shù)組 for (int i = 0; i < arr.length; i++) { Student s = (Student)arr[i]; //強轉成Student System.out.println(s.getName() + "," + s.getAge()); } ```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.Collection集合的帶All功能測試
A:案例演示
帶All的功能演示
java boolean addAll(Collection c) boolean removeAll(Collection c) boolean containsAll(Collection c) boolean retainAll(Collection c)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5.集合的遍歷之迭代器遍歷
A:迭代器概述
集合是用來存儲元素,存儲的元素需要查看,那么就需要迭代(遍歷)
B:案例演示
迭代器的使用
```java
Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); c.add("d"); Iterator it = c.iterator(); //獲取迭代器的引用 while(it.hasNext()) { //集合中的迭代方法(遍歷) System.out.println(it.next()); } ```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?6.Collection存儲自定義對象并遍歷
A:案例演示
Collection存儲自定義對象并用迭代器遍歷
Collection c = new ArrayList();
```java c.add(new Student("張三",23)); c.add(new Student("李四",24)); c.add(new Student("王五",25)); c.add(new Student("趙六",26)); c.add(new Student("趙六",26));
for(Iterator it = c.iterator();it.hasNext();) { Student s = (Student)it.next(); //向下轉型 System.out.println(s.getName() + "," + s.getAge()); //獲取對象中的姓名和年齡 } System.out.println("------------------------------"); Iterator it = c.iterator(); //獲取迭代器 while(it.hasNext()) { //判斷集合中是否有元素 Student s = (Student)it.next(); //向下轉型 System.out.println(s.getName() + "," + s.getAge()); //獲取對象中的姓名和年齡 } ```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7.迭代器的原理及源碼解析
A:迭代器原理
迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的存儲結構都是不同的,所以每一個集合存和取都是不一樣,那么就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過于臃腫,迭代器是將這樣的方法向上抽取出接口,然后在每個類的內部,定義自己迭代方式,這樣做的好處有二,第一規(guī)定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內部實現(xiàn),使用者不用管怎么實現(xiàn)的,會用即可
B:迭代器源碼解析
1,在eclipse中ctrl + shift + t找到ArrayList類
2,ctrl+o查找iterator()方法
3,查看返回值類型是new Itr(),說明Itr這個類實現(xiàn)Iterator接口
4,查找Itr這個內部類,發(fā)現(xiàn)重寫了Iterator中的所有抽象方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?9.List集合的特有功能概述和測試
A:List集合的特有功能概述
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 10.List集合存儲學生對象并遍歷
A:案例演示
通過size()和get()方法結合使用遍歷宅粥。
```java
List list = new ArrayList(); list.add(new Student("張三", 18)); list.add(new Student("李四", 18)); list.add(new Student("王五", 18)); list.add(new Student("趙六", 18));
for(int i = 0; i < list.size(); i++) { Student s = (Student)list.get(i); System.out.println(s.getName() + "," + s.getAge()); } ```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 11.并發(fā)修改異常產生的原因及解決方案
A:案例演示
需求:我有一個集合坡脐,請問,我想判斷里面有沒有"world"這個元素悠垛,如果有朝抖,我就添加一個"javaee"元素崭庸,請寫代碼實現(xiàn)。
```java
List list = new ArrayList(); list.add("a"); list.add("b"); list.add("world"); list.add("d"); list.add("e");
/Iterator it = list.iterator(); while(it.hasNext()) { String str = (String)it.next(); if(str.equals("world")) { list.add("javaee"); //這里會拋出ConcurrentModificationException并發(fā)修改異常 } }/ ```
B:ConcurrentModificationException出現(xiàn)
迭代器遍歷扬蕊,集合修改集合
C:解決方案
a:迭代器迭代元素搀别,迭代器修改元素(ListIterator的特有功能add)
b:集合遍歷元素,集合修改元素
? ? ```java
ListIterator lit = list.listIterator();? ? //如果想在遍歷的過程中添加元素,可以用ListIterator中的add方法
? ? while(lit.hasNext()) {
? ? ? ? String str = (String)lit.next();
? ? ? ? if(str.equals("world")) {
? ? ? ? ? ? lit.add("javaee");?
? ? ? ? ? ? //list.add("javaee");
? ? ? ? }
? ? }
```
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 12.ListIterator
boolean hasNext()是否有下一個
boolean hasPrevious()是否有前一個
Object next()返回下一個元素
Object previous();返回上一個元素
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 13. Vector的特有功能
A:Vector類概述
B:Vector類特有功能
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
C:案例演示
Vector的迭代
```java
Vector v = new Vector(); //創(chuàng)建集合對象,List的子類 v.addElement("a"); v.addElement("b"); v.addElement("c"); v.addElement("d");
//Vector迭代 Enumeration en = v.elements(); //獲取枚舉 while(en.hasMoreElements()) { //判斷集合中是否有元素 System.out.println(en.nextElement());//獲取集合中的元素 } ```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 14.數(shù)據(jù)結構之數(shù)組和鏈表
A:數(shù)組
查詢快修改也快
增刪慢
B:鏈表
查詢慢,修改也慢
增刪快
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?15.List的三個子類的特點
A:List的三個子類的特點
ArrayList: 底層數(shù)據(jù)結構是數(shù)組尾抑,查詢快歇父,增刪慢。 線程不安全再愈,效率高庶骄。 Vector: 底層數(shù)據(jù)結構是數(shù)組,查詢快践磅,增刪慢。 線程安全灸异,效率低府适。 Vector相對ArrayList查詢慢(線程安全的) Vector相對LinkedList增刪慢(數(shù)組結構) LinkedList: 底層數(shù)據(jù)結構是鏈表,查詢慢肺樟,增刪快檐春。 線程不安全,效率高么伯。
powershell Vector 和 ArrayList 的區(qū)別 Vector 是線程安全的,效率低 ArrayList 是線程不安全的,效率高 共同點:都是數(shù)組實現(xiàn)的 ArrayList 和 LinkedList 的區(qū)別 ArrayList 底層是數(shù)組結果,查詢和修改快 LinkedList 底層是鏈表結構的,增和刪比較快,查詢和修改比較慢 共同點:都是線程不安全的* B:List有三個兒子疟暖,我們到底使用誰呢? 查詢多用ArrayList 增刪多用LinkedList 如果都多ArrayList(一般都會經常使用ArrayList)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1.HashSet存儲字符串并遍歷)
A:Set集合概述及特點
通過API查看即可
B:案例演示
HashSet存儲字符串并遍歷
```java Set?set = new HashSet<>();
set.add("lisi"); set.add("lisi"); set.add("wangwu"); set.add("wangw1u"); set.add("wang2w1u");
for (String string : set) { System.out.println(string); } ``` 將集合中的重復元素去掉
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.HashSet存儲自定義對象
A:案例演示
存儲自定義對象,并保證元素唯一性田柔。
重寫hashCode()和equals()方法
```java Set?set = new HashSet<>(); Teacher t1 = new Teacher("lisi",13); Teacher t2 = new Teacher("lisi",13) Teacher t3 = new Teacher("lisi"13); /* * 先判斷hashcode * hashcode不一致那么就不是同一個對象 * hashcode一致 * 那么久再去調用equals * true 對象一樣 * false 不一樣 */ set.add(t1); set.add(t2); set.add(t3);
for (Teacher teacher : set) { System.out.println(teacher); } ```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4.HashSet如何保證元素唯一性的原理
1.HashSet原理
我們使用Set集合都是需要去掉重復元素的, 如果在存儲的時候逐個equals()比較, 效率較低,哈希算法提高了去重復的效率, 降低了使用equals()方法的次數(shù)
當HashSet調用add()方法存儲對象的時候, 先調用對象的hashCode()方法得到一個哈希值, 然后在集合中查找是否有哈希值相同的對象
如果沒有哈希值相同的對象就直接存入集合
如果有哈希值相同的對象, 就和哈希值相同的對象逐個進行equals()比較,比較結果為false就存入, true則不存
2.將自定義類的對象存入HashSet去重復
類中必須重寫hashCode()和equals()方法
hashCode(): 屬性相同的對象返回值必須相同, 屬性不同的返回值盡量不同(提高效率)
equals(): 屬性相同返回true, 屬性不同返回false,返回false的時候存儲
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 5.LinkedHashSet的概述和使用
A:LinkedHashSet的特點
B:案例演示
LinkedHashSet的特點
可以保證怎么存就怎么取
```java package corejava_day17.set;
import java.util.Iterator; import java.util.LinkedHashSet;
public class LinkedListed { public static void main(String[] args) { LinkedHashSet?set = new LinkedHashSet(); set.add("lisi"); set.add("lisi2555"); set.add("lisi3"); set.add("lisi1"); set.add("lis64i");
? ? Iterator<String> iterator = set.iterator();
? ? while(iterator.hasNext()) {
? ? ? ? System.out.println(iterator.next());
? ? }
}
}
```
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?6.產生10個1-20之間的隨機數(shù)要求隨機數(shù)不能重復
A:案例演示
需求:編寫一個程序俐巴,獲取10個1至20的隨機數(shù),要求隨機數(shù)不能重復硬爆。并把最終的隨機數(shù)輸出到控制臺欣舵。
```java package corejava_day17.set;
import java.util.HashSet; import java.util.Random; import java.util.Set;
public class LinkedListed { public static void main(String[] args) { Random random = new Random(); Set?set = new HashSet<>(); while(set.size() < 20) { int number = random.nextInt(20) + 1; set.add(number); }
? ? for (Integer integer : set) {
? ? ? ? System.out.println(integer);
? ? }
}
}
```
7.練習
使用Scanner從鍵盤讀取一行輸入,去掉其中重復字符, 打印出不同的那些
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 8.TreeSet存儲Integer類型的元素并遍歷
A:案例演示
TreeSet存儲Integer類型的元素并遍歷
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 9.TreeSet存儲自定義對象
A:案例演示
存儲Person對象
10.TreeSet保證元素唯一和自然排序的原理和圖解
A:畫圖演示
TreeSet保證元素唯一和自然排序的原理和圖解
```powershell 二叉樹: 小的存儲在左邊,大的存儲在右邊 負數(shù)在左邊 后一個比前一個小 正數(shù)在右邊 后一個比前一個大 0代表集合中只有這樣一個元素 每次先去根元素比較
按照年紀排序缀磕,年紀相同按照名字排序 ```
11.TreeSet存儲自定義對象并遍歷練習
A:案例演示
TreeSet存儲自定義對象并遍歷練習1(按照姓名排序)
12.TreeSet存儲自定義對象并遍歷練習2
A:案例演示
TreeSet存儲自定義對象并遍歷練習2(按照姓名的長度排序)
13.TreeSet保證元素唯一和比較器排序的原理及代碼實現(xiàn)
A:案例演示
TreeSet保證元素唯一和比較器排序的原理及代碼實現(xiàn)
```java // 按照字符串長度排序 package corejava_day17.set;
import java.util.Comparator; import java.util.TreeSet;
class Com implements Comparator?{
// o2 代表集合中已經有的
// o1 新添加的
// 每次首先都會與根元素比計較
? //負數(shù)在左邊 后一個比前一個小
//正數(shù)在右邊 后一個比前一個大
//0代表集合中只有這樣一個元素
@Override
public int compare(String o1, String o2) {
? ? int num = o1.length() - o2.length();
? ? return num == 0 ? o1.compareTo(o2) : num;
}
}
public class LinkedListed { public static void main(String[] args) { TreeSet?set = new TreeSet<>(new Com());
? ? set.add("ddddddddd");
? ? set.add("dd");
? ? System.out.println(set.toString());
}
}
```
14.TreeSet原理
1.特點
TreeSet是用來排序的, 可以指定一個順序, 對象存入之后會按照指定的順序排列
2.使用方式
a.自然順序(Comparable)
TreeSet類的add()方法中會把存入的對象提升為Comparable類型
調用對象的compareTo()方法和集合中的對象比較
根據(jù)compareTo()方法返回的結果進行存儲
b.比較器順序(Comparator)
創(chuàng)建TreeSet的時候可以制定 一個Comparator
如果傳入了Comparator的子類對象, 那么TreeSet就會按照比較器中的順序排序
add()方法內部會自動調用Comparator接口中compare()方法排序
調用的對象是compare方法的第一個參數(shù),集合中的對象是compare方法的第二個參數(shù)
c.兩種方式的區(qū)別
TreeSet構造函數(shù)什么都不傳, 默認按照類中Comparable的順序(沒有就報錯ClassCastException)
TreeSet如果傳入Comparator, 就優(yōu)先按照Comparator
1.練習
在一個集合中存儲了無序并且重復的字符串,定義一個方法,讓其有序(字典順序),而且還不能去除重復
```java package com.briup.test;
import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.TreeSet;
public class Test4 {
public static void main(String[] args) {
? ? ArrayList<String> list = new ArrayList<>();
? ? list.add("aaa");
? ? list.add("aaa");
? ? list.add("ccc");
? ? list.add("ddd");
? ? list.add("fffffffffff");
? ? list.add("briup");
? ? list.add("bbbb");
? ? list.add("aaa");
? ? list.add("aaa");
? ? sort(list);
? ? System.out.println(list);
}
public static void sort(List<String> list) {
? ? TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
? ? ? ? @Override
? ? ? ? public int compare(String s1, String s2) {
? ? ? ? ? ? int num = s1.compareTo(s2);? ? ? ? ? ? ? ? //比較內容為主要條件
? ? ? ? ? ? return num == 0 ? 1 : num;? ? ? ? ? ? ? ? ? //保留重復
? ? ? ? }
? ? });
? ? //2,將list集合中所有的元素添加到TrreSet集合中,對其排序,保留重復
? ? ts.addAll(list);
? ? //3,清空list集合
? ? list.clear();
? ? //4,將TreeSet集合中排好序的元素添加到list中
? ? list.addAll(ts);
}
}
```
從鍵盤接收一個字符串, 程序對其中所有字符進行排序,例如鍵盤輸入: helloitcast程序打印:acehillostt(保留重復)
```java package com.briup.test;
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet;
public class Test5 {
public static void main(String[] args) {
? ? Scanner sc = new Scanner(System.in);
? ? System.out.println("請輸入一個字符串");
? ? String line = sc.nextLine();
? ? char[] arr = line.toCharArray();
? ? TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {
? ? ? ? @Override
? ? ? ? public int compare(Character c1, Character c2) {
? ? ? ? ? ? int num = c1.compareTo(c2);
? ? ? ? ? ? return num == 0 ? 1 : num;
? ? ? ? }
? ? });
? ? for(char c : arr) {
? ? ? ? ts.add(c);? ? ? ? ? ? ? ? ? ? ? ? ?
? ? }
? ? for(Character c : ts) {
? ? ? ? System.out.print(c);
? ? }
}
}
```
程序啟動后, 可以從鍵盤輸入接收多個整數(shù), 直到輸入quit時結束輸入. 把所有輸入的整數(shù)倒序排列打印.(保留重復的)
```java package com.briup.test;
import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet;
public class Test6 {
public static void main(String[] args) {
? ? Scanner sc = new Scanner(System.in);
? ? TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
? ? ? ? @Override
? ? ? ? public int compare(Integer i1, Integer i2) {
? ? ? ? ? ? int num = i2.compareTo(i1);
? ? ? ? ? ? return num == 0 ? 1 : num;
? ? ? ? }
? ? });
? ? while(true) {
? ? ? ? String line = sc.nextLine();? ? ? ? ? ? ? ?
? ? ? ? if("quit".equals(line)) {
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? Integer i = Integer.parseInt(line);
? ? ? ? ts.add(i);
? ? }
? ? for (Integer integer : ts) {
? ? ? ? System.out.println(integer);
? ? }
}
}
```
?
鍵盤錄入5個學生信息(姓名,語文成績,數(shù)學成績,英語成績),按照總分從高到低輸出到控制臺缘圈。(分數(shù)相同按照名字排序)