2.集合
標籤(空格分隔): 6.2Java高級
一 Java集合框架
二 List接口的實現類
1. ArryList集合類
(1) 簡介
(2)常用方法
- 增-add()
al.add(“hello”); //在末尾增加元素
al.add(1, “hello”); //增加在指定位置
al.add(12); //集合不支持基本數據類型!!!!!!!
al.add(15.5);
// al.add(new Student(“jack”,20));
al.add(stu);//同上
al.add(new Student(“rose”,21));
- //集合不支持基本數據類型!!!!!!!
-
刪-remove()
al.remove(“12”);//刪除指定內容
System.out.println(al.contains(12));
System.out.println(al.get(1));
al.remove(1);//刪除指定位置元素
System.out.println(al.get(1)); -
查-get()
System.out.println(al.get(1)); -
判斷列表中是否存在指定元素-contains();返回布爾值
System.out.println(al.contains(12));//true
System.out.println(al.contains(new Integer(12)));//true 比較的是值System.out.println(al.contains(stu));//true System.out.println(al.contains(new Student("jack",20)));//false 比較的是地址
- /*
contains裏面默認調用的是equals方法
Object (基類)的equals方法默認比較的就是地址
Integer類重寫了這個方法 所以比較的是值
String
*/
- /*
(3) ArryList的三種遍歷方法
//1.傳統for循環遍歷
for(int i=0;i<al.size();i++){
System.out.println(al.get(i));
}
//2.使用增強型for循環遍歷 往裏面扔的都是Object 所以拿出來的還是Object
for(Object obj: al){
System.out.println(obj);
}
//3.迭代器返回值
//iterator() 返回的是迭代器
Iterator it = al.iterator();
while(it.hasNext()) { //hasNext()如果有下一個元素返回真 否則返回假
//當代碼執行到這裏的時候表示有下一個
Object obj = it.next();//獲取裏邊對象
System.out.println(obj);
}
2. LinkedList集合類
(1)簡介
(2)常用方法
(3)和ArryList的區別
- LinkedList 增/刪速度較快
ArryList 遍歷速度較快
3. Stack類
(1)簡介
- Stack 棧----先進後出(後進先出)–LIFO(last in first out)
- //創建Stack類對象 Stack stack=new Stack();
(2)方法
重點在查
//1.查看棧頂對象
System.out.println(stack.peek());
//2.遍歷Stack集合中的元素(利用pop返回刪除值的特性)
int size=stack.size();//要放在外邊,如果i<stack.size(),i值越來越大,size值會逐漸變小
for(int i=0;i<size;i++){
System.out.println(stack.pop());//移除並返回刪除值
}
三 set集合
(1)簡介
- set 無序且唯一
* 無序是指 添加順序和輸出順序是不一致的,我們無法控制
- 藉助HashSet創建集合對象
Set set=new HashSet();
(2)常用方法
//添加集合元素
set.add(10);
set.add(20);
set.add(30);
set.add(40);
set.add(50);
set.add(new Student("jack",20));
set.add(new Student("jack",20));
/*
* 去重(留第一個值爲去重,留最後一個值爲覆蓋)
*
* 在上午的ArrayList中 對比兩個對象 是不是同一個的時候
* 我們知道底層對比的是調用equals方法(重寫了Object的equals方法)
* 在Set去重的時候,不光要對比是否是同一個對象(比的是“值”)
* 還要比較在內存中是否是同一個,這個時候需要重寫Object的public int hashCode()
* 以此來判斷是不是同一個。
*/
//遍歷集合元素
//方法1:使用增強for循環進行遍歷
for(Object obj: set){
System.out.println(obj);
}//兩個student對象的內存地址不一致,若只想顯示一個 重寫equals的底層代碼,去除地址判斷部分
//方法2:迭代器Iterator
Iterator it=set.iterator() ;
while(it.hasNext()){
System.out.println(it.next());//讀取值的方法next()
}
//方法3:將集合轉換爲數組後遍歷
Object[] arr=set.toArray();//聲明數組 開闢空間 賦值set.toArray()
for(int i=0;i<set.size();i++){
System.out.println(arr[i]);
}
四 Map接口
(1)簡介
- Map 裏面存放的是key value的映射對
* key要求是唯一的
* value可以不唯一
* 可以根據key來獲取value
* 實例對象藉助HashMap創建
(2)方法
//增加值--關鍵字put()
hm.put(1,"a");
hm.put("a", "A");
hm.put("jack", new Student("jack",18));
hm.put("jack", new Student("jack",21));
System.out.println(hm.get("jack"));//這裏key是唯一的 ,出現重複時,會對前邊的進行覆蓋
//遍歷(重點!!!)
//方法1:返回key的集合來遍歷HashMap
Set keys=hm.keySet();
for(Object key: keys){
System.out.println("key->"+key+" |value->" +hm.get(key));
}
//方法2:返回所有的value遍歷輸出(無法獲取key)
Collection values = hm.values(); //返回所有value的集合
Iterator it = values.iterator();
while(it.hasNext()) {
System.out.println("values->"+it.next());
}
//方法3: 使用EntrySet完成HashMap的遍歷
Set entrySet = hm.entrySet(); //返回的是Entry對象的集合,Entry對象中包括了一對kv
Iterator it2 = entrySet.iterator();
while(it2.hasNext()) {
Object obj = it2.next(); //返回的是Object需要向下轉型(父類不能調用子類)
Entry entry = (Entry)obj;
System.out.println("key->"+entry.getKey()+" | value->"+entry.getValue());
}
(3)習題
利用HashMap來完成如下需求:
* 這個字符串中每個字母出現的次數
* key -> value
* a->3 z->2 …
// 創建對象
char[] charArray=str.toCharArray();//將str轉爲數組
HashMap hm = new HashMap();
String str="dhadnhafscfsfdfvdfvdvdsfscs";
for(int i=0;i<charArray.length;i++){
if(hm.containsKey(charArray[i])){
//集合中已有這個字符(value值增加1)
hm.put(charArray[i], (Integer) hm.get(charArray[i])+1);
//hm的兩個屬性都是對象,所以值需要手動裝箱(集合不支持基本類型)
}else{
//第一次遇到這個字符(設置key,value值初始爲1)
hm.put(charArray[i], 1);
}
}
//遍歷
Set aa=hm.keySet();
for(Object a: aa){
System.out.println("key->"+a+" |value->" +hm.get(a));
}
![image_1d56svm27p8pvgg1r8teci1qfn9g.png-15.9kB][23]
五 泛型
(1)簡介
//
* 在以前的ArrayList中存在一個問題,我在向集合中添加元素的時候
* 是所有類型的元素都可以直接添加進去,因爲接受參數的類型是Object
* 我在取出元素的時候 的數據類型也是Object
* 既然是Object
* 那麼當我需要調用子類獨有的屬性和方法的時候 只能向下轉型
(2)代碼操作
//HashMap在泛型中的使用 申明一個指定key是String類型 value是Student類型的HashMap
HashMap<String, Student> hm=new HashMap<String, Student>();
//增--注意提示的數據類型
hm.put("jack", new Student("jack",20));//未按照指定類型輸入會報錯
hm.put("rose", new Student("rose",21));
hm.put("tom", new Student("tom",22));
hm.put("kathy", new Student("kathy",23));
hm.put("kate", new Student("kate",24));
//HashMap遍歷
//1.利用返回的key集合讀取所有值
Set<String> keys=hm.keySet();
//注意 標註強數據類型(否則下一行會出錯,因爲keys的類型不標註還是Object對象)
for(String key: keys){
System.out.println("key->"+key+" |value->"+hm.get(key));
}
//2.返回所有的value遍歷輸出(無法獲取key)
Collection<Student> values=hm.values();
for(Student value: values){//這裏的value就是stu對象實例化
System.out.println("name->"+value.getName()+" |age->"+value.getAge());
}
//3.用EntrySet + Iterator完成對HashMap的讀值遍歷
Set<Entry<String, Student>> entrySet=hm.entrySet();//利用entrySet()方法返回一組kv對應值
Iterator<Entry<String, Student>> it=entrySet.iterator();//創建entrySet的迭代器
//需要添加類型
while(it.hasNext()){
Entry<String, Student> entry=it.next();
System.out.println("key->"+entry.getKey()+" |value->"+entry.getValue());
}
}
六 Collections集合的工具類的使用
(1)簡介
(2)常用方法
- (2-1)對象之間比較大小
- 步驟:
1.查看Integer和String的Comparable接口底層代碼後發現,能對比是因爲他們都實現了Comparable接口未實現的方法—繼承Comparable接口,實現其抽象方法
- 2.發現他的抽象方法不符合實際應用—重寫(借鑑Integer和String的對比代碼)
(2-2)重寫comparator方法
- 步驟:
- 新創建一個類文件
2.重寫/自定義我們需要的比較方法
3.根據需要調用