#在千鋒“逆戰”學習第25天#周總結+Question10

周總結
finalize方法
當對象被判定爲垃圾對象時,有JVM自動調用此方法,用以標記垃圾對象,進入回收隊列。

垃圾對象:沒有有效引用指向此對象時,爲垃圾對象。

垃圾回收:由GC銷燬垃圾對象,釋放數據存儲空間。

自動回收機制:JVM內存耗盡,一次性回收所有垃圾對象。

手動回收機制:使用System.gc();通知JVM進行垃圾回收。

包裝類

什麼是包裝類?
基本數據類型所對應的引用數據類型 如下圖
在這裏插入圖片描述
注意:Object類可統一所有數據,包裝類的默認值是null。

類型的轉換與拆箱、裝箱
8種包裝類提供不同類型間的轉換方式
Number父類提供6個共性方法 將自身類型轉化成其他數字類型

String類
字符串是常量,創建之後不可改變
字符串字面值存儲再字符串值當中,可以共享
String s = “Hello”;產生一個對象,字符串池中存儲
String s = new String(“Hello”);產生兩個對象,堆、池中各產生一個

常用方法
public char charAt(int index):根據下標獲取字符
public boolean contains(String str):判斷當前字符串中是否含有str
public char[] toCharArray():將字符串轉化爲數組
public int indexOf(String str):查找str首次出現的下標,存在,則返回該下標;不存在則返回-1
public int lastIndexOf(String str):查找str在當前字符串中最後一次出現的下標索引
public int length():返回字符串的長度
public String trim():去掉字符串前後的空格,注意中間的空格不會去掉
public String toUpperCase():將小寫轉化爲大寫
public String toLowerCase():將大寫轉化爲小寫
public boolean endWith(String str):判斷字符串是否以str結尾
public String replace(char oldChar,char newChar):將舊字符替換爲新字符串。(替換內容爲字符串也可以)
public String[] split(String str):根據str來做拆分,作爲拆分的str不會再出現在返回的String數組裏面,所以注意不可以用有用內容來做拆分。

可變字符串
StringBuffer:可變長字符串,JDK1.0提供,運行效率慢,線程安全。

StringBuilder:可變長字符串,JDK5.0提供,運行效率快,線程不安全。
中間變量的JDK優化,自動創建一個StringBuilder緩衝區,在塊空間添加。

BigDecimal
很多實際應用中需要精確計算,而double是近似值存儲,不在符合要求,需要藉助BigDecimal。

位置:java.math包中
作用:精確計算浮點數
創建方式:BigDecimal bd = new BigDecmal(“1.0”);

方法:
BigDecimal add(Bigdecimal bd) 加
BigDecimal subtract(Bigdecimal bd) 減
BigDecimal multiply(Bigdecimal bd) 乘
BigDecimal divide(Bigdecimal bd) 除
注意:如果不能準確的計算出結果時,除法需要再給兩個參數,保留位數和取捨方法。通常採用四捨五入的方法,取值爲BigDecimal.ROUND_HALF_UP
在這裏插入圖片描述

集合框架
什麼是集合
概念:對象的容器,存儲對象的對象,可代替數組
特點:容器的工具類,定義了對多個對象進行操作的常用方法
位置:java.util.*;

Collection體系集合
在這裏插入圖片描述

Collection父接口
特點:代表一組任意類型的對象,無序、無下標。

方法:
boolean add(Object obj)//添加一個對象
boolean addAll(Collection c)//將一個集合中所有對象添加到這個集合中
void clear()//清空此集合中所有對象
boolean contains(Object o)//檢查此集合中是否包含o對象
boolean equals(Object o)//比較此集合是否與指定對象相等
boolean isEmpty()//判斷此集合是否爲空
boolean remove(Object o)//在此集合移除o對象
int size()//返回此集合中的元素個數
Object[] toArray()//將此集合轉換爲數組

List接口
特點:有序,有下標,元素可以重複

方法:
void add(int index,object o)//在指定位置插入對象o
boolean addAll(int index,Collection c)//將一個集合中的元素添加到此集合的index位置
Object get(int index)//返回集合中指定位置的元素
List subList(int fromIndex,int toIndex)//返回fromIndex和toIndex之間的集合元素。

List實現類

ArrayList
數組結構實現,查詢快,增刪慢
JDK1.2版本,運行效率快,線程不安全

Vector
數組結構實現,查詢快,增刪慢
JDK1.0版本,運行效率慢,線程安全

LinkedList
鏈表結構實現,增刪快,查詢慢

在這裏插入圖片描述

泛型集合
概念:參數化類型、類型安全的集合,強制集合元素的類型必須一致。

特點:
1). 編譯時即可檢查,而非運行時拋出異常。
2). 訪問時,不必類型轉換(拆箱)。
3). 不同泛型之間引用不能相互賦值,泛型不存在多態。

泛型
(常用名稱:E = Element / T = Type / K = Key / V = Value)
I. 概念:約束-規範類型
II. 泛型的場景:
1). 定義泛型:
實例泛型:
a). 類:創建對象時,爲類所定義的泛型,進行參數化賦值
b). 接口:實現接口時,爲接口所定義的泛型,進行參數化賦值

靜態泛型:
a).定義在方法的返回值類型前面 :< T extends Object>、<T extends Comparable>、<T extends Comparable<? super T>> 可應用在形參列表、返回值兩種場景上,不單單可以規範泛型,還可以語義化返回值。
b). 定義在方法的形參列表當中:<?>、<? extends Object>、<? super Integer>,不支持使用& 只能應用在形參列表上,規範泛型。

Collections工具類:
概念:集合工具類,定義了除了存取以外的集合常用方法。
I. public static <T extends Comparable<? super T>> void sort(List list) //排序,要求:必須實現Comparable,必須可與自身類型比,以及父類類型比
II. public static void reverse(List<?> list) //反轉、倒置元素
III. public static void shuffle(List<?> list) //隨機重置順序

foreach循環:
for(數據類型 變量名 : 容器名稱){ //可遍歷集合或數組(常用在無序集合上)
}

Set子接口:
I. 特點:無序、無下標、元素不可重複(當插入新元素時,如果新元素與已有元素進行equals比較,結果爲true時,則拒絕新元素的插入)
II. 方法:全部繼承自Collection中的方法

Set接口實現類:
I. HashSet【重要】:
1). HashSet的底層使用的HashMap類,即是將所有需要存入HashSet的值,直接保存在HashMap中
2). HashSet如何去掉重複?
3). 先判斷hashCode是否一致,==比較地址,equals比較內容

II. LinkedHashSet【瞭解】:
1). 底層使用LinkedHashMap(鏈表結構)存儲,節點形式單獨存儲數據,並可以指向下一個節點,通過順序訪問節點,可保留元素插入順序

III. TreeSet【瞭解】:
1). 實現了SortedSet接口,要求必須可以對元素排序。
2). 所有插入元素,必須實現Comparable接口,覆蓋compareTo方法。
3). 根據compareTo方法返回0作爲去重的依據,(意味重複)

Map體系集合:
I. Map:地圖、映射
I. 概念:存儲一對數據(Key-value),無序、無下標、鍵不可重複、值可以重複。

II. HashMap算法:拿到任何一個對象後,通過hash(key)做運算,key>>>16(除以16),只可能得到0~15之間的一個數組,作爲插入數組的下標
III. Hashtable:HashMap的線程安全版本
IV. TreeMap:自動對key做排序,根據compareTo的返回值去重
V. Properties:Hashtable 子類,主要用於存儲key和value都是字符串的情況,常在讀取配置文件之後,保存文件中的鍵值對。反射、JDBC

------------------------------------------------------------作業分割線

  1. (Set,List)
import java.util.*;
public class TestListSet{
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add(“Hello”);
list.add(“Learn”);
list.add(“Hello”);
list.add(“Welcome”);
Set<String> set = new HashSet<String>();
set.addAll(list);
System.out.println(set.size());
}
}

選擇正確答案
A. 編譯不通過
B. 編譯通過,運行時異常
C. 編譯運行都正常,輸出 3
D. 編譯運行都正常,輸出 4

答案:C
List元素可重複,Set元素不可重複

  1. (Set,Hash 算法)爲上一題的 Worker 類,在添加完 equals 方法的基礎上,添加一個 hashCode 方法。
    public int hashCode(){
    //1
    }
    有幾種寫法:
    I. return 0;
    II. int result = 0;
    if (name != null) result = name.hashCode();
    return result + age;
    III. return super.hashCode();
    現在要把 Worker 類放入 HashSet 中,並希望在 HashSet 中沒有重複元素,則下 面說法正確的是:
    A. 三種寫法都正確b
    B. I、II 寫法正確,II 的效率更高
    C. II 寫法正確,I、III 寫法都不正確

答案:B

  1. (Set,Hash 算法,方法覆蓋)代碼改錯
import java.util.*;
class Worker{
String name;
int age;
double salary;
public Worker(){}
public Worker(String name, int age, double salary){
this.name = name;
this.age = age;
this.salary = salary;
}
int hashCode(){
return name.hashCode() + age + salary;
}
public boolean equals(Worker w){
if (w.name == name && w.salary == salary && w.age == age){
return true;
}else{
return false;
} } }
public class TestWorker{
public static void main(String args[]){
Set<Worker> set = new HashSet<Worker>();
set.add(new Worker(“tom”, 18, 2000));
set.add(new Worker(“tom”, 18, 2000));
set.add(0, new Worker(“jerry”, 18, 2000));
System.out.println(set.size());
} }

答案:
在這裏插入圖片描述
salary是double類型數據,返回值類型需要做強轉。覆蓋hashCode方法修飾符應與父類一樣或更寬泛,所以前面加public

set是無序類型,沒有下標,所以不能指定下標插入對象,jerry對象把0去掉。

  1. (Set,Hash 算法)在前面的 Worker 類基礎上,爲 Worker 類增加相應的方法,使得 Worker 放入
    HashSet 中時,Set 中沒有重複元素。並編寫相應的測試代碼。
    在這裏插入圖片描述

  2. (Map)關於下列 Map 接口中常見的方法:
    I. put 方法表示放入一個鍵值對,如果鍵已存在則___覆蓋原值__,如果鍵不存在則___儲存新值__。
    II. remove 方法接受___1__個參數,表示__移除該鍵的映射___。
    III. get 方法表示___返回指定鍵映射的值__,get 方法的參數表示__指定的鍵的值___,返回值表示___該鍵映射的值__。
    IV. 要想獲得 Map 中所有的鍵,應該使用方法__Set___,該方法返回值類型爲__Object___。
    V. 要想獲得 Map 中所有的值,應該使用方法__valus();___,該方法返回值類型爲__Object___。

  3. (Map)利用 Map,完成下面的功能:
    從命令行讀入一個字符串,表示一個年份,輸出該年的世界盃冠軍是哪支球隊。
    如果該年沒有舉辦世界盃,則輸出:沒有舉辦世界盃。
    附錄:截止 2009 年,歷屆世界盃冠軍、世界盃冠軍以及對應的奪冠年份:
    在這裏插入圖片描述
    在這裏插入圖片描述

  4. (Map)已知某學校的教學課程內容安排如下:
    老師 課程
    Tom CoreJava
    John Oracle
    Susan Oracle
    Jerry JDBC
    Jim Unix
    Kevin JSP
    Lucy JSP
    完成下列要求:
    I. 使用 Map,以老師的名字作爲鍵,教授的課程名作爲值,表示上述課程安排。
    II. 增加了一位新老師 Allen 教 JDBC
    III. Lucy 改爲教 CoreJava
    IV. 遍歷 Map,輸出所有的老師及老師教授的課程
    V. 利用 Map,輸出所有教 JSP 的老師。
    在這裏插入圖片描述

  5. (Set,HashSet,空指針)有下面代碼

import java.util.*;
class Student {
int age;
String name;
public Student(){}
public Student(String name, int age){
this.name = name;
this.age = age;
}
public int hashCode(){
return name.hashCode() + age;
}
public boolean equals(Object o){
if (o == null) return false;
if (o == this) return true;
if (o.getClass() != this.getClass()) return false;
Student stu = (Student) o;
if (stu.name.equals(name) && stu.age == age) return true;
else return false;
} }
public class TestHashSet{
public static void main(String args[]){
Set<Student> set = new HashSet<Student>();
Student stu1 = new Student();
Student stu2 = new Student(“Tom”, 18);
Student stu3 = new Student(“Tom”, 18);
set.add(stu1);
set.add(stu2);
set.add(stu3);
System.out.println(set.size());
} }

下列說法正確的是:
A. 編譯錯誤
B. 編譯正確,運行時異常
C. 編譯運行都正確,輸出結果爲 3
D. 編譯運行都正確,輸出結果爲 2

答案:B
stu1會空指針異常

  1. (Map)在原有世界盃 Map 的基礎上,增加如下功能:
    讀入一支球隊的名字,輸出該球隊奪冠的年份列表。
    例如:
    I. 讀入“巴西”,應當輸出 1958、1962、1970、1994、2002
    II. 讀入“荷蘭”,應當輸出”沒有獲得過世界盃”。
    在這裏插入圖片描述
    在這裏插入圖片描述

  2. (Map) 給定一個字符串,請輸出該字符串由哪些字符組成,每個字符出現幾次?
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章