1. 程式人生 > >JAVA基礎接口集合框架

JAVA基礎接口集合框架

city 父類引用 arr sda 獲取 and 相互 emp 要求

接口
--------------------------------------------------------------------------------
一、接口(是一種規範)
1.接口名/接口文件與類類似,也是用.java文件編寫
2.關鍵字 interface 接口名命名規範與類名相同 習慣上可以使用I開頭表示
3. 接口額訪問修飾符只能使用public和default修飾不能使用private和protected
在接口中默認缺省為public
4.接口中的所有屬性只能為公開的靜態的常量
而且public/static/final都可省略
5.接口中的所有方法必須為公共的抽象方法 且抽象方法中的abstract/public可省略
省略後依然是公開的

--------------------------------------------------------------------------------
二、實現類實現接口
1.一個類實現接口使用Implements關鍵字
實現類實現一個接口必須重寫接口中的所有抽象方法 除非是抽象類
2.一個類可以實現多個接口 多個接口之間用逗號間隔
3.接口的引用可以指向其實現類的對象。類似於父類引用指向子類對象
因此可以使用接口實現多態
--------------------------------------------------------------------------------
三、接口繼承接口
1.接口可以繼承接口,使用extends關鍵字;接口的繼承與類相同
2.接口可以多繼承 使用多個父接口,使用逗號分割,
子接口繼承父接口將擁有父接口的所有抽象方法
--------------------------------------------------------------------------------
四、接口的優點
1.可以被多繼承
2.設計和實現完全分離
3.更自然的使用多肽
4.更容易搭建程序框架
5.更容易更換實現
--------------------------------------------------------------------------------
五、接口和抽象類的區別
1.本質區別 關鍵字不同 class interface
子類繼承抽象類 子類必須與父類是一類事物 必須符合"is a"關系
例如Chinese are peope
接口只是對功能的擴展,多個實現類實現接口時
並不要求所有的抽象類是一類事物
接口符合"like a"關系,理解為X具備一個X功能
例 人\狗 都有吃飯功能 都可以實現吃飯接口
但是兩者吃飯功能不能從同一父類中繼承
2.抽象類是類 接口是規範
3.接口可繼承接口 並可多繼承接口可多實現 但類只能單根繼承
4.接口只能做方法聲明,抽象類中可以做方法聲明,也可以做方法實現
5.抽象類能夠保證實現的層次關系,而借口則是能夠更有效地分離行為和實現
6.抽象類可以有自己屬性 接口智能有靜態常量
7.接口中智能有抽象方法,抽象類中可以有抽象方法
集合框架
對常用的數據結構和算法做一些規範(接口)和實現(具體實現接口的類)
--------------------------------------------------------------------------------
一、集合框架的接口
Collection:存儲一組不唯一 無序的對象
List:存儲一組不唯一 有序
Set存儲一組唯一 無序的對象
Map存儲一組鍵值對象,提供key到value的映射(key不能重復)

--------------------------------------------------------------------------------
二、List 常用方法 (ArraysList:長度可變的數組)

【List接口】
1、常用方法:
① add():在列表的最後添加元素;
② add(int index,E element):在列表的指定位置插入元素;
③ size():返回當前列表的元素個數;
④ get(int index):返回下標為index的元素。
如果沒有泛型約束,返回Object類型,需要強轉;如果有泛型約束,直接返回泛型類型,無需強轉。
⑤ clear():清除列表中的所有數據
isEmpty():檢測列表是否為空
⑥ contains():傳入一個對象,檢測列表中是否包含該對象。
如果傳入的是String和基本數據類型,可以直接比對
如果傳入的是實體類,則默認只比對兩個對象的地址。因此,需要在實體類重寫equals()方法;
Tips:
String s = "123";
="123".equals(s);//這個順序可以防止空指針
⑦ indexOf():傳入一個對象,返回該對象在列表中首次出現的地址。
lastIdexOf():傳入一個對象,返回該對象在列表中最後一次出現的地址。
⑧remove():傳入一個下標,或者一個對象,刪除指定元素;
如果傳入下標,返回被刪除的對象,如果下標大於size(),會報下標越界異常;
如果傳入對象,則要求重寫equals方法,返回true或false表示刪除是否成功
⑨set(index, obj):用新傳入的對象,將指定位置的元素替換掉;
返回被替換掉的元素對象。
⑩subList(1,3):截取一個子列表,返回List類型
?toArray() 將列表轉為數組 返回一個object類型的數據
--------------------------------------------------------------------------------
三、使用iterator叠代器遍歷列表
1.使用列表調用 .iterator()返回一個叠代器對象
2.使用叠代器對象調用.hasNext()判斷是否有下一條數據
3.使用叠代器對象調用.next()取出下一條數據
--------------------------------------------------------------------------------
四、ArrayList LinkedList
1.ArrayList 實現一個長度可變的數組,在內存空間中開辟一串連續的空間,
與數組的區別在於長度可以隨意的改變,
這只能存儲結構在尋歡遍歷和隨機訪問元素的速度比較快
2.LinkedList 使用鏈表結構存儲數據,再插入和刪除元素時速度非常快
特有方法
①addFirst():開頭插入元素
addLast():結尾插入元素
②removeFirst() 刪除第一個元素,並返回被刪除的元素
removeLast()刪除最後一個元素,並返回被刪除的元素
③getFirst()返回列表的第一個元素 不刪除
getLast()返回列表的最後一個元素 不刪除

Set接口
1.常用方法:與List接口基本相同
但是,由於set接口中的元素是無序的,因此沒有與下標相關的方法

2.Set接口的特點:唯一,無序

取出set方法
使用for each遍歷
使用叠代器遍歷

3.HashSet 底層調用HashMap的方法 傳入數據後 根據數據的hashcode進行散列運算
得到一個散列值後在進行運算,確定數據在序列中存儲的位置

4.HashSet如何確定一個對象是否相等
先判斷對象的hashcode()是否相等 若不等 肯定不是一個對象
若相等 繼續判斷equals()方法;
重寫equals()方法

所以使用HashSet存儲實體對象時,必須重寫對象的hashCode() 和equals()兩個方法

LinkedHashSet 在HashSet的基礎上,新增一個鏈表
用鏈表來記錄HashSet中元素放入的順序,因此使用叠代器遍歷時,可以按照放入的順序依次
讀出元素

comparator 需要單獨一個比較類進行實現,重寫compare()的方法,實例化TreeSet的對象,需要哦轉入這個比較類的對象

Map
1.Map 接口特點 以鍵值對的形式存儲數據,以鍵取值,鍵不能重復值可以重復
2.put(key value) 最後追加一個鍵值
get 通過鍵取值
clear清除所有數據


HashMap 與Hashtable區別
1.後者線程安全 前者不安全
2.後者鍵不能為null 前者可以
HashMap和Hashtable的區別
兩者最主要的區別在於Hashtable是線程安全,而HashMap則非線程安全。Hashtable的實現方法裏面都添加了synchronized關鍵字來確保線程同步,因此相對而言HashMap性能會高一些,我們平時使用時若無特殊需求建議使用HashMap,在多線程環境下若使用HashMap需要使用Collections.synchronizedMap()方法來獲取一個線程安全的集合(Collections.synchronizedMap()實現原理是Collections定義了一個SynchronizedMap的內部類,這個類實現了Map接口,在調用方法時使用synchronized來保證線程同步,當然了實際上操作的還是我們傳入的HashMap實例,簡單的說就是Collections.synchronizedMap()方法幫我們在操作HashMap時自動添加了synchronized來實現線程同步,類似的其它Collections.synchronizedXX方法也是類似原理。
HashMap可以使用null作為key,不過建議還是盡量避免這樣使用。HashMap以null作為key時,總是存儲在table數組的第一個節點上。而Hashtable則不允許null作為key。
HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現Map接口。
HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子默認都是0.75。
HashMap擴容時是當前容量翻倍即:capacity*2,Hashtable擴容時是容量翻倍+1即:capacity*2+1。
HashMap和Hashtable的底層實現都是數組+鏈表結構實現。
兩者計算hash的方法不同:
Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然後對table數組長度取摸:
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

static int indexFor(int h, int length) {
return h & (length-1);
}

在HashMap 中,null 可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對
應的值為null。當get()方法返回null 值時,既可以表示HashMap 中沒有該鍵,也可
以表示該鍵所對應的值為null。因此,在HashMap 中不能用get()方法來判斷HashM
ap 中是否存在某個鍵,而應該用containsKey()方法來判斷。Hashtable 的鍵值都不能
為null,所以可以用get()方法來判斷是否含有某個鍵。
LinkedHashMap
可以使用鏈表 計入數據放入的次序

Collections是Java中專門用於操作的集合工具類

Collection是一個接口


sort方法 對 集合中的數據進行排序
如果集合存儲的是一個實體對象那麽
1 實體類實現Comparable接口,並重寫CompareTo方法
2.在sort的第二個參數,傳入比較器,比較器需實現comparable接口,並重寫compare方法

【泛型】
1、泛型就是“參數化類型”。在定義類型時,不將類型定死。而是采用泛型參數的形式進行定義。調用時傳入具體的泛型參數。

【泛型類的特點】
在聲明類的時候,進行泛型約束,這樣的類叫泛型類。
class Test<T>{
//<T>可以理解為泛型聲明時的形參,可以用任何字母代替。常用T N E
//在泛型類中,T就可以當做特殊的數據類型進行使用
private T arg;
}
//泛型調用時,需要將實際的數據類型進行傳入
Test<String> test1 = new Test<String> ("姜浩真帥!");
Test<Integer> test2 = new Test<Integer>(123);

1、泛型只在編譯階段生效。同一個類通過不同泛型拿到的對象,使用getClass()判斷是屬於同一個類的。
System.ou.println(test1.getClass() == test2.getClass());
//取到的test1的類為Test類,不是Test<T>類

2、同一個類,通過不同泛型拿到的對象,相互不兼容。不能互相賦值。
test2 = test1;//test1與test2不兼容
3.泛型類 在實例化的時候,可以不傳入泛型,類中的數據類型,在賦值的時候傳入的變量類型為空
4.實例化泛型時,智能傳入類名,可以是系統類也可以是自定義實體類


泛型通配符上邊界,使用?extends類名表示通配符只支持指定類的子類
Test<?extends Number>testS = new Test<Number>();

泛型通配符下邊界,使用?super類名,表示通配符只支持指定類及其超類;

泛型的接口
1.聲明
interface inter<T>{
void Test(T t );
}
2.實現類 如果實現泛型接口,那麽不能直接使用接口的泛型,那麽需要重新聲明
class Test3<T> implements inter<T>{
@Override
public void Test(T t){}
}
3.如果實現類,不想作為泛型類,那麽,可以在實現接口時,直接給接口的泛型賦值

class Test3 implements inter<String>{
@Override
public void Test(String t){}
}

泛型方法
1.不一定在泛型類中 可以獨立於泛型類在任何類中都可以單獨使用
class Test{
public static <T> void test(T t){}
}
調用 Test.test("String");
2.使用泛型方法可以實現可變參數的方法
class Test{
/使用...表示可以接受n個任意類型的參數也可以是數組
public static <T> void test(T......t){}
}

通用:Test.test("String","String2",123,true)

3.只有在方法中聲明了<T>的方法 才能是泛型方法
而如果在方法中,使用額類的泛型 則不是泛型方法
註意:
靜態方法不能使用類的泛型
智能將靜態方法單獨聲明為泛型方法
【Random類】
【Random類】
取隨機數。
兩種構造:
①空參構造
②傳入一個種子數:只要種子數相同,那麽在相同次數取到的隨機數肯定相同。這是偽隨機數。可以傳入當前的時間戳:System.currentTimeMillis();

nextInt():隨機獲得一個整數;
nextInt(n):隨機獲得從0-n的隨機數,含0不含n;

【單例模式】
單例模式:確保一個類,只能產生一個實例。

設計思路:
①將構造函數私有化。確保類外部,不能使用new關鍵字自行創建對象。
②在類內部實例化一個對象,並通過靜態方法返回。


Enum類】
枚舉類,是一種特殊的類。
裏面的值,全部都是靜態常量。每一個枚舉值,都相當於一個本類對象,只不過,對象的值都是對象名。
【枚舉類的聲明】

【Date類】
位於Java.util包下
data空參構造:取到當前時間
data全參構造:傳入一個long類型的時間戳,取到指定時間。

date.getTime():取到一個時間的時間戳:從0時區,1970/1/1 0:0:0到當前時間的毫秒數
setTime():傳入一個長整型,重新設置date的時間
compareTo():前面>參數 返回1 前面<參數 返回-1 前面= 參數 返回0
equals():比對兩個時間是否相等。
before():檢測一個時間是不是在指定時間之前
after():檢測一個時間是不是在指定時間之後

【SimpleDateFormat】
位於Java.text包下,對日期進行格式化
實例化對象時,傳入格式化參數,用字母代表對應部分
字母 日期或時間元素 表示 示例
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
d 月份中的天數 Number 10
E 星期中的天數 Text Tuesday; Tue
H 一天中的小時數(0-23) Number 0
h am/pm 中的小時數(1-12) Number 12
m 小時中的分鐘數 Number 30
s 分鐘中的秒數 Number 55
format():用於傳入一個Date類型的參數,並返回格式化之後的字符串
parse():將字符串格式的時間,轉成Date類型。要求傳入的字符串格式,必須與實例化時的模式,保持完全一致
toPattern():返回當前格式化的模式字符串。
【Calender類】
Calendar日歷類是一個抽象類,不能直接通過new拿到對象,必須使用Calendar.getInstance();拿到
getTime 返回一個日期對象
get根據calendar提供的常量,獲得指定字段

JAVA基礎接口集合框架