------- <a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">android教育訓練</a>、<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">java教育訓練</a>、期待與您交流! ----------
第一講 map集合概述
1、将鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。
什麼時候使用map集合呢?
當資料之間存在這映射關系時,就要先想map集合。
2、基本方法
2.1、put(K key, V value)
如果出現添加相同的鍵時,那麼後添加的值會覆寫原有鍵對應值、并且put方法會傳回被覆寫的值。
特點:保證鍵的唯一性
重要:
向map集合中添加元素時,如果傳回的是空,說明該鍵是第一次存入。
2.2、、删除。
clear()
以前與 key 關聯的值;如果沒有 key 的映射關系,則傳回 null
并且remove方法會傳回被删除的鍵對應的值。value remove(Object key)
2.3、判斷
如何存在,則傳回true,否則false
boolean containsValue(Object value)
boolean containsKey(Object key)
boolean isEmpty()
2.4、擷取。
指定鍵所映射的值;如果此映射不包含該鍵的映射關系,則傳回 null
get(Object key) 得到鍵對應的值
size() 得到集合長度
entrySet() 傳回此映射中包含的映射關系的 Set 視圖。
keySet() 傳回此映射中包含的鍵的 Set 視圖。
3、Map子類對象特點
Hashtable:底層是哈希表資料結構,不可以存入null鍵null值。該集合 是線程同步的,必須實作hashCode和equals方法,jdk1.0,效率低。
HashMap:底層是哈希表資料結構,允許一個null鍵和多個null值,該集合是不同步的。将hashtable替代,jdk1.2,效率高。也需要實作元素的hashCode 和equals方法。
TreeMap:底層是二叉樹資料結構。線程不同步。可以用于給map集合中的鍵進行排序。
4、Map集合的兩種取出方式:
4.1、keyset方式
将map集合中所有的鍵值取出放到set集合,set集合可以利用疊代器取出每個鍵值,然後根據map集合的get方法取出每個鍵對應的值
4.2、entrySet方式
将map集合的一種映射關系存入set集合,這種關系就是Map.Entry。然後利用getkey()和getvalue()方法,分别取出鍵和值
說明:
Map是一個接口,其實,Entry也是一個接口,它是Map的子接口中的一個内部接口,就相當于是類中有内部類一樣。為何要定義在其内部呢?
原因:a、Map集合中村的是映射關系這樣的兩個資料,是先有Map這個集合,才可有映射關系的存在,而且此類關系是集合的内部事務。
b、并且這個映射關系可以直接通路Map集合中的内部成員,是以定義在内部。
import java.util.*;
//Map集合的兩種取出方式
class MapTest
{
public static void main(String[] args)
{
Map <String,String>map=new HashMap<String,String>();//通過泛型定義要存入map集合的是字元串
map.put("zhnagsan","20");
map.put("wangwun","26");
map.put("lisi","24");//向集合中添加元素
map.put("zhnagqiang","22");
//keyset方式練習
Set<String > keyset=map.keySet();//用keyset方法将鍵存入set集合
Iterator<String> it=keyset.iterator();//利用疊代器取出鍵值
while (it.hasNext())
{
String key=it.next();
String value=map.get(key);//用map的get方法取出鍵對應的值
System.out.println(key+":::"+value);
}
//entryset方式練習
Set<Map.Entry<String,String>> entryset=map.entrySet();//将map集合的一種映射關系存入set集合
Iterator<Map.Entry<String,String>> newit=entryset.iterator();//利用疊代器取出鍵值
while (newit.hasNext())
{
Map.Entry<String,String> me=newit.next();
String key=me.getKey();//然後利用getkey()方法,取出鍵
String value=me.getValue();//然後利用ggetvalue()方法,取出值
System.out.println(key+":::"+value);
}
}
}
練習二 每一個學生都有對應的歸屬地,歸屬地用String表示,學生的屬性有姓名、年齡,姓名和年齡相同
的學生認為是同一對象。要求保證元素唯一性。
*/
//每一個學生都有對應的歸屬地,歸屬地用String表示,學生的屬性有姓名、年齡,将學生對象按年齡排序
//練習gsauythhjdiiidkoisoo擷取字母出現的次數
//希望列印的結果是h(2)i(4).....
class MapTest
{
public static void main(String[] args)
{
String str="gsauythhjdiiidkoisoo";
String s=getcharCount(str);//調用方法
System.out.println(s);
}
public static String getcharCount(String str)
{
TreeMap<Character,Integer>ts=new TreeMap<Character,Integer>();//定義treemap集合并甲泛型
StringBuilder sb=new StringBuilder();
char[]chs=str.toCharArray();//将字元數串轉換成字元數組,
for (int x=0; x<chs.length;x++ )
{
Integer value=ts.get(chs[x]);//用map集合的get方法,傳回值
if(value==null)
ts.put(chs[x],1);
else
{
value=value+1;
ts.put(chs[x],value);//如果不是null,說明存在,就将字元存入,把次數增加
}
}
Set<Character> keyset=ts.keySet();//用keyset方法将鍵存入set集合
Iterator<Character> it=keyset.iterator();
while (it.hasNext())//利用疊代器取出鍵值
{
Character key=it.next();
Integer value1=ts.get(key);
sb.append(key+"("+value1+")");//列印出需要格式
}
return sb.toString();
}
}
第二講 Map擴充知識
在很多項目中,應用比較多的是一對多的映射關系,這就可以通過嵌套的形式将多個映射定義到一個大的集合中,
并将大的集合分級處理,形成一個體系。
練習:
import java.util.*;
class MapExpandKnow
{
public static void main(String[] args)
{
//預熱班集合
HashMap<String,String> yureban=new HashMap<String,String>();
//就業班集合
HashMap<String,String> jiuyeban=new HashMap<String,String>();
//學校集合
HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>();
//學校中班級集合和名稱的映射
czbk.put("yureban",yureban);
czbk.put("jiuyueban",jiuyeban);
//預熱班級中學号與姓名的映射
yureban.put("01","zhangsan");
yureban.put("02","lisi");
//就業班級中學号與姓名的映射
jiuyeban.put("01","wangwu");
jiuyeban.put("02","zhouqi");
//直接顯示全部學生資訊
getAllStudentInfo(czbk);
}
//定義一個方法擷取全部學生資訊,包括在哪個班級,叫什麼名字,學号多少
public static void getAllStudentInfo(HashMap<String ,HashMap<String,String>> hm)
{
for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )//用keySet取出方式
{
String s= it.next();//班級名稱
System.out.println(s+":");
HashMap<String,String> stu=hm.get(s);//班級集合
getStudentInfo(stu);
}
}
//擷取班級中學生的資訊,包括姓名和學号
public static void getStudentInfo(HashMap<String,String> hm)
{
for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )
{
String key=it.next();//學号
String value=hm.get(key);//姓名
System.out.println(key+"..."+value);
}
}
}
第三講 集合架構和數組工具類
1、 Collections:它的出現給集合操作提供了更多的功能。這個類不需要建立對象,内部提供的都是靜态方法。
靜态方法:
Collections.sort(list);//list集合進行元素的自然順序排序。
2、Collections.max(list);//傳回list中字典順序最大的元素。
3、Collections.reverseOrder();//逆向反轉排序。
4、Collections.shuffle(list);//随機對list中的元素進行位置的置換。
5、Collections和Collection有什麼差別?
重點:
Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜态方法,
實作對集合的查找、排序、替換、線程安全化(将非同步的集合轉換成同步的)等操作。
Collection是個java.util下的接口,它是各種集合結構的父接口,繼承于它的接口主要有Set和List,提供了關于集合的一些操作,
如插入、删除、判斷一個元素是否其成員、周遊等。
6、Arrays:
用于操作數組對象的工具類,裡面都是靜态方法。
将數組轉換成集合,有什麼好處呢?用aslist方法,将數組變成集合;
可以通過list集合中的方法來操作數組中的元素:isEmpty()、contains、indexOf、set;
注意(局限性):數組是固定長度,不可以使用集合對象增加或者删除等,會改變數組長度的功能方法。比如add、remove、clear。
(會報不支援操作異常UnsupportedOperationException);
如果數組中存儲的引用資料類型,直接作為集合的元素可以直接用集合方法操作。
如果數組中存儲的是基本資料類型,asList會将數組實體作為集合元素存在。
7、 集合變數組:用的是Collection接口中的方法:toArray();
如果給toArray傳遞的指定類型的資料長度小于了集合的size,那麼toArray方法,會自定再建立一個該類型的資料,長度為集合的size。
如果傳遞的指定的類型的數組的長度大于了集合的size,那麼toArray方法,就不會建立新數組,直接使用該數組即可,
并将集合中的元素存儲到數組中,其他為存儲元素的位置預設值null。
是以,在傳遞指定類型數組時,最好的方式就是指定的長度和size相等的數組。
8、增強for循環:
for語句,簡化了疊代器。
格式:增強for循環括号裡寫兩個參數,第一個是聲明一個變量,第二個就是需要疊代的容器
9、可變參數(...):
用到函數的參數上,當要操作的同一個類型元素個數不确定的時候,可是用這個方式,這個參數可以接受任意個數的同一類型的資料。
和以前接收數組不一樣的是:
以前定義數組類型,需要先建立一個數組對象,再将這個數組對象作為參數傳遞給函數。現在,直接将數組中的元素作為參數傳遞即可。
底層其實是将這些元素進行數組的封裝,而這個封裝動作,是在底層完成的,被隐藏了。是以簡化了使用者的書寫,少了調用者定義數組的動作。
如果在參數清單中使用了可變參數,可變參數必須定義在參數清單結尾(也就是必須是最後一個參數,否則編譯會失敗。)。
10、泛型:jdk1.5版本以後出現的一個安全機制。表現格式:<>
好處:
1:将運作時期的問題ClassCastException問題轉換成了編譯失敗,展現在編譯時期,程式員就可以解決問題。
2:避免了強制轉換的麻煩。
隻要帶有<>的類或者接口,都屬于帶有類型參數的類或者接口,在使用這些類或者接口時,必須給<>中傳遞一個具體的引用資料類型。
泛型技術:其實應用在編譯時期,是給編譯器使用的技術,到了運作時期,泛型就不存在了。為什麼?
因為泛型的擦除:也就是說,編輯器檢查了泛型的類型正确後,在生成的類檔案中是沒有泛型的。
import java.util.*;
class CollectionsDemo
{
public static void main(String[] args)
{
sortDemo();
}
//定義一個沒有比較器的折半查找方法
public static int halfSearch(List<String> list,String key)
{
//定義變量
int max,min,mid;
max = list.size()-1;
min = 0;
while(min<=max)
{
mid = (max+min)>>1;
//得到中間的值
String str = list.get(mid);
//調用compareTo方法與關鍵值比較
int num = str.compareTo(key);
if(num>0)
max = mid -1;
else if(num<0)
min = mid + 1;
else
return mid;
}
return -min-1;
}
//定義帶有比較器的折半方法
public static int halfSearch(List<String> list,String key,Comparator<String> cmp)
{
int max,min,mid;
max = list.size()-1;
min = 0;
while(min<=max)
{
mid = (max+min)>>1;// /2;
String str = list.get(mid);
//調用compare方法與關鍵值比較
int num = cmp.compare(str,key);
if(num>0)
max = mid -1;
else if(num<0)
min = mid + 1;
else
return mid;
}
return -min-1;
}
public static void maxDemo()
{
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
//用集合工具的sort方法進行排序
Collections.sort(list);
sop(list);
//用集合工具的max方法求出最大值
String max = Collections.max(list);
sop("max="+max);
}
public static void sortDemo()
{
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
//用集合工具的sort方法進行排序
sop(list);
//Collections.sort(list);
Collections.sort(list,new StrLenComparator());
//Collections.swap(list,1,2);
sop(list);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
class StrLenComparator implements Comparator<String>
{
public int compare(String s1,String s2)
{
if(s1.length()>s2.length())
return 1;
if(s1.length()<s2.length())
return -1;
return s1.compareTo(s2);
}
}
------- <a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">android教育訓練</a>、<a href="http://www.itheima.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="blank">java教育訓練</a>、期待與您交流! ----------