集合框架知識梳理2
---------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------
1、MAP 雙列 集合 、Collection 單列集合
1、MAP 雙列 集合 、Collection 單列集合
|--Hsahtable :底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的 JDK1.0 效率低|--HashMap :底層是哈希表數據結構,允許存入null鍵null值,該集合是不同步的 JDK1.2 效率高|--TreeMap :底層是二叉樹數據結構,線程不同步,可以給Map集合中的鍵進行排序
2、需要注意的是 MAP是沒有 迭代器的,想要迭代,必須通過創建一個Collection對象接收values的值再迭代
3、MAP 集合 存儲鍵值對,一對一對的往裏存,而且要保證鍵的唯一性。 鍵 是 不可重複的。
4、HashMap 作爲升級版 可以把 null作爲鍵或者值
5、map集合的兩種取出方: entrySet()【重點】keySet() 【重點】
6、keySet(): 將map 中的所有鍵存入到set集合,因爲set集合具備迭代器
3、MAP 集合 存儲鍵值對,一對一對的往裏存,而且要保證鍵的唯一性。 鍵 是 不可重複的。
4、HashMap 作爲升級版 可以把 null作爲鍵或者值
5、map集合的兩種取出方: entrySet()【重點】keySet() 【重點】
6、keySet(): 將map 中的所有鍵存入到set集合,因爲set集合具備迭代器
用迭代器取出所有鍵,通過get方法,取出鍵對應的 值
7、entrySet(): 在set集合中存儲的是映射關係。
該映射關係是以Map.Entry接口的對象形式存在的,所以set的泛型就是該接口調用 set集合的迭代器 ,將一個個Map.Entry 對象取出然後調用該對象自帶方法,取出 鍵和值
8、Entry :其實也是一個接口,MAP的子接口,可以用類實現接口,用類的內部類子接口
9、HashMap 不能進行比較排序不論是 implements Comparator 還是 implements Comparable
10、Map 集合被使用是因爲具備映射關係。
-------------------------------------------------------
Map 集合 【 Map(K,V) 】
該集合存儲鍵值對,一對一對的往裏存,而且要保證鍵的唯一性。
(看API的時候,可以先羅列出這個集合可能擁有的功能,然後對應去看)
Map
9、HashMap 不能進行比較排序不論是 implements Comparator 還是 implements Comparable
10、Map 集合被使用是因爲具備映射關係。
-------------------------------------------------------
Map 集合 【 Map(K,V) 】
該集合存儲鍵值對,一對一對的往裏存,而且要保證鍵的唯一性。
(看API的時候,可以先羅列出這個集合可能擁有的功能,然後對應去看)
Map
|--Hsahtable :底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的 JDK1.0 效率低|--HashMap :底層是哈希表數據結構,允許存入null鍵null值,該集合是不同步的 JDK1.2 效率高|--TreeMap :底層是二叉樹數據結構,線程不同步,可以給Map集合中的鍵進行排序
Map 和Set很像
其實,Set底層就是使用了Map集合。
(Collection 單列集合,Map 雙列集合)
Map 集合和 基本方法
class MapDemo1{
public static void main(String[] args) {
Map<String,String> mss = new HashMap<String,String>();
mss.put("01","huan1");
mss.put("01","huan99");//當存入相同鍵的時候,新的值會覆蓋原有值
mss.put("02","huan2");
mss.put("03","huan3");
System.out.println("打印出集合:"+mss);
System.out.println("有huan值嗎?"+mss.containsValue("huan"));
System.out.println("有03編號嗎?"+mss.containsKey("03"));
System.out.println("刪除03編號"+mss.remove("03"));
System.out.println("打印出集合:"+mss);
System.out.println("有03編號嗎?"+mss.containsKey("03"));
System.out.println("集合爲空嗎"+mss.isEmpty());
//System.out.println(mss.clear());
System.out.println("集合爲空嗎"+mss.isEmpty());
System.out.println("獲取值"+mss.get("01"));
System.out.println("獲取值"+mss.get("011"));//其實可以使用get方法判斷某一個建存不存在
System.out.println("獲取長度"+mss.size());
mss.put(null,"我是空鍵的值");
mss.put("05",null);
System.out.println("------------------------------------------------\n"+
"要注意,HashMap是可以將null作爲鍵,或者值的");
System.out.println("獲取值空鍵::"+mss.get(null)+"\n\tnull鍵並不多見,可以使用get進行判斷,查看是否存在null的鍵");
System.out.println("\n------------------------------------------------");
Collection<String> coll=mss.values();
//由於MAP沒有迭代器,所以:通過創建一個Collection對象接收values的值再輸出
System.out.print("迭代器輸出:");
for(Iterator<String> it=coll.iterator();it.hasNext(); ){
System.out.print(it.next()+" ");
}
System.out.println("\n打印出集合:"+mss);
System.out.println(mss.put("09","-0-"));
System.out.println(mss.put("09","9999999"));//當存入相同鍵的時候,新的值會覆蓋原有值
}
}
例子中,羅列出 各種基本方法。1、需要注意的是 MAP是沒有 迭代器的,想要迭代,必須通過創建一個Collection對象接收values的值再迭代
2、MAP集合 鍵 是 不可重複的。
3、HashMap 作爲升級版 可以把 null作爲鍵或者值
1、添加
put(K key, V value)putAll(Map< ? extends K, ? extends v>M)
2、刪除
clear()remove(Object key)
3、判斷
containsValue(Object value)containsKey(Object kay)isEmpty()
4、獲取
get(Object key)size()values()
【2】
map集合的兩種取出方式:
map集合的兩種取出方式:
entrySet()【重點】keySet() 【重點】
keySet(): 將map 中的所有鍵存入到set集合,因爲set集合具備迭代器
用迭代器取出所有鍵,通過get方法,取出鍵對應的 值
public static void main(String[] args) {
HashMap<String,String> hss = new HashMap<String,String>();
hss.put("02","sm2");
hss.put("01","sm1");
hss.put("04","sm4");
hss.put("03","sm3");
//1 先獲取map集合的所有鍵的Set集合,keySet()
Set<String> keyset=hss.keySet();
//有了Set集合,就可以獲取迭代器。
for(Iterator<String> it= keyset.iterator();it.hasNext() ; ){
String key=it.next();
//有了鍵可以通過map集合的get方法獲取其對應的值
String value=hss.get(key);
System.out.println(key+"----"+value);
}
}
entrySet():在set集合中存儲的是映射關係。該映射關係是以Map.Entry接口的對象形式存在的,所以set的泛型就是該接口調用 set集合的迭代器 ,將一個個Map.Entry 對象取出然後調用該對象自帶方法,取出 鍵和值
//2將map集合中的映射關係取出,存如到set集合中。
Set<Map.Entry<String,String>> entryset = hss.entrySet();
for(Iterator<Map.Entry<String,String>> it = entryset.iterator(); it.hasNext(); ){
Map.Entry<String,String> me=it.next();
String key=me.getKey();
String value=me.getValue();
System.out.println(key+"--"+value);
}
Entry :其實也是一個接口,MAP的子接口,可以用類實現接口,用類的內部類子接口模擬一下:
interface Map{
public static interface Entry{
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map.Entry
{
class Hahs implements Map.Entry{
public abstract Object getKey();
public abstract Object getValue();
}
}
//能加 static 修飾的接口,都是內部接口【3】
1、HashMap 不具備 比較 TreeMap才具有
class MapTest6 {
public static void main(String[] args) {
//TreeMap<Student,String> hss = new TreeMap<Student,String>(new MyCom());
//TreeMap<Student,String> hss = new TreeMap<Student,String>();
//HashMap<Student,String> hss = new HashMap<Student,String>(new MyCom());
HashMap<Student,String> hss = new HashMap<Student,String>();
hss.put(new Student("xua",30),"tian");
hss.put(new Student("fds",26),"sf");
hss.put(new Student("afdsa",17),"tfff");
hss.put(new Student("cfdsa",27),"tfff");
hss.put(new Student("bfdsa",27),"tfff");
hss.put(new Student("xua",24),"tfds");
hss.put(new Student("dsua",18),"fdsfean");
hss.put(new Student("zuf",20),"tsd");
for(Iterator<Student> it = hss.keySet().iterator() ; it.hasNext() ; ){
Student s = it.next();
String addr = hss.get(s);
System.out.println(s+"--"+addr);
}
}
}
//比較方式1:--implements Comparator--比較器
class MyCom implements Comparator<Person>{
public int compare(Person s1,Person s2){
int num=new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
if(num==0){
return s1.getName().compareTo(s2.getName());
}
return num;
}
}
//比較方式2:--implements Comparable
class Person implements Comparable<Person>{
private String name;
private int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
//3
public int compareTo(Person p){
int num = this.getName().compareTo(p.getName());
if(num == 0){
return new Integer(this.getAge()).compareTo(new Integer(p.getAge()));
}
return num;
}
//1
public int hashCode(){
return name.hashCode()+age*17;
}
//2
public boolean equals(Object obj){
if(!(obj instanceof Student)){
throw new ClassCastException("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
Person p = (Person) obj;
return this.getName().equals(p.getName()) && this.age==p.age ;
}
public String toString(){
return name+"+++++"+age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
class Student extends Person{
Student(String name,int age){
super(name,age);
}
}
發現,不論是implements Comparator 還是 implements Comparable 都不能對HashMap 進行比較排序【4】
Map 擴展知識。
Map 集合被使用是因爲具備映射關係。
案例:
一個學校有很多班級,一個班級會有很多學生,
那麼,,這學生,班級,和學校,該如何來存儲,用什麼來存儲,呢
MapTest9 是一個方法 MapTest91 是另外一個方法
本方法中,因爲班級裏的學生具有名字,和學號這種映射關係,
所以我們用2個Map集合來 裝學校, 而學校具有,班級名稱,和具體班級,
也是一種映射關係,所以把學生集合作爲值,班級名作爲鍵,進行存儲
HashMap<String,HashMap<String,String>> xuexiao = new HashMap<String,HashMap<String,String>>();
這樣就搞定了。
1、創建 學校,班級,讓學校跟班級有映射關係。
2、爲班級添加學員。當需要我們獲取某個班級的學員的時候
一個學校有很多班級,一個班級會有很多學生,
那麼,,這學生,班級,和學校,該如何來存儲,用什麼來存儲,呢
MapTest9 是一個方法 MapTest91 是另外一個方法
本方法中,因爲班級裏的學生具有名字,和學號這種映射關係,
所以我們用2個Map集合來 裝學校, 而學校具有,班級名稱,和具體班級,
也是一種映射關係,所以把學生集合作爲值,班級名作爲鍵,進行存儲
HashMap<String,HashMap<String,String>> xuexiao = new HashMap<String,HashMap<String,String>>();
這樣就搞定了。
1、創建 學校,班級,讓學校跟班級有映射關係。
2、爲班級添加學員。當需要我們獲取某個班級的學員的時候
我們可以通過獲取班級來實現
3、編寫一個獲取班級學員信息的方法
傳入一某一個班級名稱,因爲其也是一個Map 集合,因爲Map不具備迭代器我們把所有鍵,裝入一個collextion集合中,通過迭代器獲得班級學員編號,和名字。
4、當我們要使用上訴方法時候,必須獲取到該學校的班級。同理,使用collextion 集合來存儲
鍵,通過鍵,來獲取到所有班級, 通過在迭代器裏,進行每一次班級的傳入,而獲取所有班級的學員信息。
"yurebao" "01" "zhangs""yurebao" "02" "zhans""jiuye" "01" "zhangdfs""jiuye" "02" "zhangs"
【4-1】
方式2看MapTest91
>>[2]
"jiuye" Student("01","zhangs");
方式二 -------對比
"jiuye" Student("01","zhangs");
上訴方法是通過班級創建學生的方式來完成的,
因爲萬物皆對象,其實學生也是一個對象,
那麼我們接下來的方法就是把學生信息直接封裝爲對象進行操作。
當把學生信息封裝爲一個對象,這個時候,就不存在映射關係,
那麼就不用map集合了,那麼用什麼集合了,collcetion 裏有兩個集合,一個list,set 集合
如果不考慮重複性,我們就用list 集合
1、創建學校集合,班級集合,學生。
2、獲取班級
3、根據班級獲取學生。
方式2看MapTest91
>>[2]
"jiuye" Student("01","zhangs");
import java.util.*;
class MapTest9 {
public static void main(String[] args) {
//創建一個學校
HashMap<String,HashMap<String,String>> xuexiao = new HashMap<String,HashMap<String,String>>();
//創建一個班級
HashMap<String,String> yure =new HashMap<String,String>();
//創建一個班級
HashMap<String,String> jiuye =new HashMap<String,String>();
//這個時候,兩個班級和學校是沒有關係的。:
xuexiao.put("預熱班",yure);
xuexiao.put("就業班",jiuye);
// 有關係後,給每個班級添加學生
yure.put("y01","zhangs");
yure.put("y02","lisi");
yure.put("y03","wangw");
jiuye.put("j01","liming");
jiuye.put("j02","huangy");
jiuye.put("j03","huangl");
jiuye.put("jo4","jiangx");
//如何獲取學校所有的學生? 提示,通過遍歷學校,獲取到所有的教室,然後。。。。
Set<String> keyset = xuexiao.keySet();//使用一個Collection集合來把所有的鍵裝在一起。
for(Iterator<String> it = keyset.iterator() ; it.hasNext() ; ){
String key = it.next(); //獲取鍵
HashMap<String,String> jiaoshi = xuexiao.get(key); //注意班級的類型 獲取班級
System.out.println("輸出看看獲取的班級:"+key+"\n\n");
ShowBanji(jiaoshi);//獲取班級具體信息
}
}
//獲取指定某個班級的學生信息。
public static void ShowBanji(HashMap<String,String> roommap){
Set<String> keyset=roommap.keySet();//使用一個Collection集合來把所有的鍵裝在一起。
for(Iterator<String> it = keyset.iterator() ; it.hasNext() ; ){
String id = it.next();
String name = roommap.get(id);
System.out.println(id+"----"+name);
}
}
}
【4-2】方式二 -------對比
"jiuye" Student("01","zhangs");
上訴方法是通過班級創建學生的方式來完成的,
因爲萬物皆對象,其實學生也是一個對象,
那麼我們接下來的方法就是把學生信息直接封裝爲對象進行操作。
當把學生信息封裝爲一個對象,這個時候,就不存在映射關係,
那麼就不用map集合了,那麼用什麼集合了,collcetion 裏有兩個集合,一個list,set 集合
如果不考慮重複性,我們就用list 集合
1、創建學校集合,班級集合,學生。
2、獲取班級
3、根據班級獲取學生。
class MapTest91 {
public static void main(String[] args) {
//同樣創建一個學校,只是HashMap變爲了list
HashMap<String,List<Student>> xuex = new HashMap<String,List<Student>>();
//創建2個班級
List yure = new ArrayList<Student>();
List jiuye = new ArrayList<Student>();
//創建關係
xuex.put("預熱班級",yure);
xuex.put("就業班級",jiuye);
yure.add(new Student("yy1","zzz"));
yure.add(new Student("yy2","zfdszz"));
jiuye.add(new Student("jj1","azzez"));
jiuye.add(new Student("yjj2","zdszz"));
for(Iterator<String> it = xuex.keySet().iterator() ; it.hasNext() ; ){
//Iterator<String> it = xuex.keySet().iterator();
//while(it.hasNext()){ //兩種循環方式。
String key =it.next();//班級名稱
List<Student> room = xuex.get(key);
System.out.println(key+"|");
getInfo(room);
}
}
public static void getInfo(List<Student> stu){
//循環方式2 切記collcetion集合中都是單列沒有get方法,不要和Map集合搞混淆了。
//Iterator<Student> it = stu.iterator();
//while(it.hasNext()){
// Student no = it.next();
// System.out.println(no);
//}
//
for(Iterator<Student> it = stu.iterator() ; it.hasNext() ; ){
Student key = it.next();
System.out.println(key+"---");//因爲覆蓋了toString方法,所以這裏可以直接輸出。
}
}
}
//學生類
class Student{
private String no;
private String name;
Student(String no,String name){
this.no = no;
this.name = name;
}
public String getNo(){
return no;
}
public String getName(){
return name;
}
public String toString(){
return no+"=-"+name;
}
}
充分利用萬物皆對象,就是說,儘量進行封裝。方便操作。---------------------------------------------------------------------------------------------------------------------------------------------
----------
android培訓、 java培訓、期待與您交流!----------