Java基础——集合List+Set+泛型+Map
?
1.?? 集合類概述
為什么出現集合類?
?面向對象語言對事物的體現都是以對象的形式,所以為了方便對多
個對象的操作,就對對象進行存儲,集合就是存儲對象最常用的一
種方式,不能存儲基本數據類型,但是出現自動裝箱后,可以存儲基本數據類型。
數組和集合類同是容器,有何不同?
?數組雖然也可以存儲對象,但長度是固定的;集合長度是可變的。
數組中可以存儲基本數據類型,集合只能存儲對象。
集合類的特點
?集合只用于存儲對象,集合長度是可變的,集合可以存儲不同類型
的對象。
?
集合框架:集合體系,由一系列的集合容器共同組成;
?
為什么會出現這么多的容器呢?
因為每一個容器對數據的存儲方式都有不同。這個存儲方式稱之為:數據結構;
?
2.?? 共性方法Collection+ArrayList+迭代
?
Collection定義了集合框架的共性功能。
1,添加
???????? add(e);
???????? addAll(collection);
?
2,刪除
???????? remove(e);
???????? removeAll(collection);
???????? clear();
?
3,判斷。
???????? contains(e);// 如果此 collection 包含指定的元素,則返回true。
???????? isEmpty();
?
4,獲取
???????? iterator();
???????? size();
?
5,獲取交集。
???????? retainAll();
?
6,集合變數組。
???????? toArray();
?
1,add方法的參數類型是Object。以便于接收任意類型對象。
?
2,集合中存儲的都是對象的引用(地址)
注意:數組,集合中存儲的不是對象實體,是內存地址;
?
為了操作集合中的元素,每個容器都有自己的內部類,完成了取出,判斷等動作的定義;
這樣取出方式就可以直接訪問集合內容的元素;
每個容器的數據結構不同,
所以取出的動作細節不同,但有共性內容判斷和取出
將共性內容抽取出來,形成Iterator接口
?
如何獲取集合的對象呢?
通過迭代器。
?
什么是迭代器呢?
其實就是集合的取出元素的方式。
如同抓娃娃游戲機中的夾子。
?
迭代器是取出方式,會直接訪問集合中的元素。
所以將迭代器通過內部類的形式來進行描述。
通過容器的iterator()方法獲取該內部類的對象。
(與打印不同)
?
請看如下應用:
import java.util.*; class CollectionDemo {public static void main(String[] args) {method_toArray();} public static void method_toArray()//toArray的使用{ArrayList al = new ArrayList();//1,添加元素。al.add("java01");//add(Object obj);al.add("java02");al.add("java03");al.add("java04");String s[]=(String[])al.toArray(new String[]{});System.out.print("\n\n以數組方式輸出:"); for (int i = 0; i < s.length; i++) { //輸出字符串數組中的內容System.out.print(s[i] + "、"); //輸出每一個元素}System.out.print("\n以對象數組方式輸出:"); Object obj[]=al.toArray();for (int i=0;i<obj.length ;i++ ){System.out.print(obj[i] + "、"); //輸出每一個元素}}public static void method_get(){ArrayList al = new ArrayList();//1,添加元素。al.add("java01");//add(Object obj);al.add("java02");al.add("java03");al.add("java04");/*Iterator it = al.iterator();//獲取迭代器,用于取出集合中的元素。while(it.hasNext())//這種循環輸出后,內存中仍有對象存在{sop(it.next());}*/for(Iterator it = al.iterator(); it.hasNext() ; )//it是局部變量,用完即消失{sop(it.next());}}public static void method_2(){ArrayList al1 = new ArrayList();al1.add("java01");al1.add("java02");al1.add("java03");al1.add("java04");ArrayList al2 = new ArrayList();al2.add("java03");al2.add("java04");al2.add("java05");al2.add("java06");//al1.retainAll(al2);//取交集,al1中只會保留和al2中相同的元素。al1.removeAll(al2);//al1中刪除al2中存在的元素sop("al1:"+al1);sop("al2:"+al2);}public static void base_method(){//創建一個集合容器。使用Collection接口的子類。ArrayListArrayList al = new ArrayList();//1,添加元素。al.add("java01");//add(Object obj);al.add("java02");al.add("java03");al.add("java04");//打印原集合。sop("原集合:"+al);//3,刪除元素。//al.remove("java02");//al.clear();//清空集合。//4,判斷元素。sop("java03是否存在:"+al.contains("java03"));sop("集合是否為空?"+al.isEmpty());//2,獲取個數。集合長度。sop("size:"+al.size());//打印改變后的集合。sop(al);}public static void sop(Object obj){System.out.println(obj);} }3.?? List集合+ListIterator迭代器
Collection
???????? |--List:元素是有序的,元素可以重復。因為該集合體系有索引(角標)。
?????????????????? |--ArrayList:底層的數據結構使用的是數組結構。特點:查詢速度很快。但是增刪稍慢。線程不同步。初始化容量為10,50%延長數組;
?????????????????? |--LinkedList:底層使用的鏈表數據結構。特點:增刪速度很快,查詢稍慢。線程不同步。
?????????????????? |--Vector:底層是數組數據結構。線程同步。被ArrayList替代了。因為效率低。初始化容量為10,100%延長數組;
?
???????? ???????? |--Set:元素是無序,元素不可以重復。、
?
List:
???????? 特有方法。凡是可以操作角標的方法都是該體系特有的方法。
?
增
???????? add(index,element);
???????? addAll(index,Collection);
?
刪
???????? remove(index);
?
改
???????? set(index,element);
查
???????? get(index):
???????? subList(from,to);
???????? listIterator();
???????? int indexOf(obj):獲取指定元素的位置。
???????? ListIterator listIterator();
?
List集合特有的迭代器。ListIterator是Iterator的子接口。
?
在迭代時,不可以通過集合對象的方法操作集合中的元素。
因為會發生ConcurrentModificationException(并發)異常。
?
所以,在迭代器時,只能用迭代器的方法操作元素,可是Iterator方法是有限的,
只能對元素進行判斷,取出,刪除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator(列表迭代器)。
?
該接口只能通過List集合的listIterator方法獲取。
?請看如下案例:
import java.util.*;class ListDemo {public static void sop(Object obj){System.out.println(obj);}public static void method(){ArrayList al = new ArrayList();//添加元素al.add("java01");al.add("java02");al.add("java03");sop("原集合是:"+al);//在指定位置添加元素。al.add(1,"java09");//刪除指定位置的元素。//al.remove(2);//修改元素。//al.set(2,"java007");//通過角標獲取元素。sop("get(1):"+al.get(1));sop(al);//獲取所有元素。for(int x=0; x<al.size(); x++){System.out.println("al("+x+")="+al.get(x));}Iterator it = al.iterator();while(it.hasNext()){sop("next:"+it.next());}//通過indexOf獲取對象的位置。sop("index="+al.indexOf("java02"));List sub = al.subList(1,3);sop("sub="+sub);}public static void main(String[] args) {//演示列表迭代器。ArrayList al = new ArrayList();//添加元素al.add("java01");al.add("java02");al.add("java03");sop(al);ListIterator li = al.listIterator();//sop("hasPrevious():"+li.hasPrevious());//判斷迭代前指針前面有沒元素//正向遍歷while(li.hasNext()){Object obj = li.next();if(obj.equals("java02"))//li.add("java009");li.set("java006");}//逆向遍歷while(li.hasPrevious()){sop("pre::"+li.previous());}//sop("hasNext():"+li.hasNext());//判斷迭代后指針后面有沒元素//sop("hasPrevious():"+li.hasPrevious());sop(al);/*//在迭代過程中,準備添加或者刪除元素。Iterator it = al.iterator();while(it.hasNext()){Object obj = it.next();if(obj.equals("java02"))//al.add("java008");it.remove();//將java02的引用從集合中刪除了。容器中的引用被刪除,但是對象仍然在內存中;sop("obj="+obj);}sop(al);*/}}4.?? 枚舉的特點
枚舉就是Vector特有的取出方式。
發現枚舉和迭代器很像。
其實枚舉和迭代是一樣的。
?
因為枚舉的名稱以及方法的名稱都過長。
所以被迭代器取代了。
枚舉郁郁而終了。
應用:?
import java.util.*;class VectorDemo {public static void main(String[] args) {Vector v = new Vector();v.add("java01");v.add("java02");v.add("java03");v.add("java04");Enumeration en = v.elements();while(en.hasMoreElements()){System.out.println(en.nextElement());}}}5.?? LinkedList
LinkedList:特有方法:
addFirst();
addLast();
?
getFirst();
getLast();
獲取元素,但不刪除元素。如果集合中沒有元素,會出現NoSuchElementException
?
removeFirst();
removeLast();
獲取元素,但是元素被刪除。如果集合中沒有元素,會出現NoSuchElementException
?
在JDK1.6出現了替代方法。
?
offerFirst();
offerLast();
?
peekFirst();
peekLast();
獲取元素,但不刪除元素。如果集合中沒有元素,會返回null。
?
pollFirst();
pollLast();
獲取元素,但是元素被刪除。如果集合中沒有元素,會返回null。
請看如下案例:
import java.util.*;class LinkedListDemo {public static void main(String[] args) {LinkedList link = new LinkedList();link.addLast("java01");link.addLast("java02");link.addLast("java03");link.addLast("java04");//sop(link);// sop(link.getFirst());// sop(link.getFirst());//sop(link.getLast());//sop(link.removeFirst());//sop(link.removeFirst());//sop("size="+link.size());while(!link.isEmpty()){sop(link.removeLast());}}public static void sop(Object obj){System.out.println(obj);}}6.?? LinkedList模擬堆棧或者隊列數據結構
使用LinkedList模擬一個堆棧或者隊列數據結構。
?
堆棧:先進后出? 如同一個杯子。
隊列:先進先出 First in First out? FIFO如同一個水管。
?請看如下程序:
import java.util.*;class myList {private LinkedList list;myList(){list=new LinkedList();}public void myadd(Object obj)//增加{list.addFirst(obj);}public Object getlist()//獲取{return list.removeFirst();}public int length()//長度{return list.size();}public void myset(int x,Object obj)//改{list.set(x,obj);}public boolean isnull()//判斷是否空{return list.isEmpty();}}class linkedtest{public static void main(String[] args) {myList ml=new myList();ml.myadd("java01");ml.myadd("java02");ml.myadd("java03");ml.myset(1,"javatest");//修改System.out.println(ml.length());while(!ml.isnull()){System.out.println(ml.getlist()); }System.out.println(ml.length());}}7.?? 去除ArrayList中的重復元素(字符串)
import java.util.*;/*去除ArrayList集合中的重復元素。*/class test{public static void main(String args[]){ArrayList al=new ArrayList();al.add("test01");al.add("test01");al.add("test02");al.add("test03");al.add("test04");al.add("test04");/*在迭代時循環中next調用一次,就要hasNext判斷一次。Iterator it=al.iterator();while(it.hasNext()){print(it.next()+"......"+it.next());//一次取出兩個,集合中有奇數個元素就會拋出異常;}*/al=single(al);print(al);}public static ArrayList single(ArrayList a){ArrayList newal=new ArrayList();Iterator i=a.iterator();while(i.hasNext()){Object obj=i.next();if(!newal.contains(obj)){newal.add(obj);}}return newal;}public static void print(Object a){System.out.println(a);}}8.?? 去除ArrayList中的重復元素(對象)
/*將自定義對象作為元素存到ArrayList集合中,并去除重復元素。比如:存人對象。同姓名同年齡,視為同一個人。為重復元素。思路:1,對人描述,將數據封裝進人對象。2,定義容器,將人存入。3,取出。(注意類型轉換)4,定義刪除重復的方法single。5,重寫equals方法,實現自己的比較規則,比較name和sex(此方法自動調用)5,調用方法,刪除重復元素6,(小插曲),探究remove方法Person繼承Object,每個對象都有比較方法equals,比較的是內存地址,注意:String中的equals比較的是數值List集合判斷元素是否相同,依據是元素的equals方法。其他集合的方法不同。調用contains()方法時equals方法是底層自動調用;*/import java.util.*;class Person{private String name;private String sex;Person(String name,String sex){this.name=name;this.sex=sex;}public String getName(){return name;}public String getSex(){return sex;}public boolean equals(Object o){ //限制比較的對象類別為Personif(!(o instanceof Person))return false;Person p=(Person)o;System.out.println(this.name+"....."+p.name);//展示比較過程/*比較過程:01對象進來-->02對象進來(02對象調用equals,與01比較)-->03對象進來(與01比較,再與02比較)結合刪除重復元素的原理圖更容易理解*/return this.name.equals(p.name)&&this.sex.equals(p.sex);}}class ArrayList_t2{public static void main(String[] args) {ArrayList al=new ArrayList();al.add(new Person("xiaoming01","M"));al.add(new Person("xiaoming02","M"));al.add(new Person("xiaoming02","M"));al.add(new Person("xiaoming03","M"));al.add(new Person("xiaoming04","F"));al=single(al);//直接調用single無法實現,不知道比較姓名,性別。比較的是對象是否相同//對象的比較,調用equals方法,此方法比較的是內存地址,new出的對象地址都不同//所以重寫equals方法,按照name和sex比較print("--------remove-----------");print("remove 02 :"+al.remove(new Person("xiaoming02","M")));//remove方法底層也是依賴于元素的equals方法,能自動調用。沒有重寫equals方法的話就相當于創建了一個新對象,內存地址值不同,remove()方法返回false,刪除失敗Iterator it = al.iterator();while(it.hasNext()){//print(it.next.getName());//編譯失敗:it.next()返回是Object,沒有此方法,無法識別的getName()方法;//對象直接輸出的,應該將Object類型轉成Person,才能調用getName();Person p = (Person)it.next();print(p.getName()+"+"+p.getSex());}}public static void print(Object obj){System.out.println(obj);}public static ArrayList single(ArrayList a){ArrayList newal=new ArrayList();Iterator i=a.iterator();while(i.hasNext()){Object obj=i.next();if(!newal.contains(obj))//通過調用contains()方法,底層就是自動調用equals方法newal.add(obj);}return newal;}}9.?? Set
概述:
|--Set:元素是無序(存入和取出的順序不一定一致),元素不可以重復。重復的元素不能存入。但是重復對象的篩選,要復寫hascode()方法,重算哈希值。復寫equals()方法。調用contains()方法,
???????? |--HashSet:底層數據結構是哈希表。是線程不安全的。不同步。存取速度快。
??????????????????????????? HashSet是如何保證元素唯一性的呢?
??????????????????????????? 是通過元素的兩個方法,hashCode和equals來完成。分別判斷哈希值和對象。
??????????????????????????? 如果元素的HashCode值相同,才會判斷equals是否為true。
??????????????????????????? 如果元素的hashcode值不同,不會調用equals。
?
??????????????????????????? 注意,對于判斷元素是否存在contains(),以及刪除remove()等操作,依賴的方法是元素的hashcode()和equals()方法。
??????????????????????????? 與ArrayList不同;
?
???????? |--TreeSet:
?
Set集合的功能和Collection是一致的。
?
往hashSet集合中存入自定對象過程分析
請看如下代碼:
import java.util.*;/*往hashSet集合中存入自定對象姓名和年齡相同為同一個人,重復元素。*/class HashSetTest {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {HashSet hs = new HashSet();hs.add(new Person("a1",11));hs.add(new Person("a2",12));hs.add(new Person("a3",13));//hs.add(new Person("a2",12));// hs.add(new Person("a4",14));//sop("a1:"+hs.contains(new Person("a2",12)));//判斷元素是否存在// hs.remove(new Person("a4",13));//刪除操作Iterator it = hs.iterator();while(it.hasNext()){Person p = (Person)it.next();sop(p.getName()+"::"+p.getAge());}}}class Person{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}public int hashCode()//重寫方法,自定義哈希值{System.out.println(this.name+"....hashCode");return name.hashCode()+age*37;// *37是任意的,為了避免哈希值的相同做的運算//字符串也有自己的hashcode()方法;}public boolean equals(Object obj){if(!(obj instanceof Person))return false;Person p = (Person)obj;System.out.println(this.name+"...equals.."+p.name);return this.name.equals(p.name) && this.age == p.age;}public String getName(){return name;}public int getAge(){return age;}}10.?? 集合框架(TreeSet+存儲自定義對象)
概述:
|--Set:元素是無序(存入和取出的順序不一定一致),元素不可以重復。重復的元素不能存入。但是重復對象的篩選,要復寫hascode()方法,重算哈希值。復寫equals()方法。調用contains()方法,
???????? |--HashSet:底層數據結構是哈希表。是線程不安全的。不同步。存取速度快。
??????????????????????????? HashSet是如何保證元素唯一性的呢?
??????????????????????????? 是通過元素的兩個方法,hashCode和equals來完成。分別判斷哈希值和對象。
??????????????????????????? 如果元素的HashCode值相同,才會判斷equals是否為true。
??????????????????????????? 如果元素的hashcode值不同,不會調用equals。
?
??????????????????????????? 注意,對于判斷元素是否存在contains(),以及刪除remove()等操作,依賴的方法是元素的hashcode()和equals()方法。
??????????????????????????? 與ArrayList不同;
?
???????? |--TreeSet:可以對Set集合中的元素進行排序。
????????????????????????????????????底層數據結構是二叉樹。
????????????????????????????????????保證元素唯一性的依據:
???????????????????????????????????? compareTo方法return 0.
?
???????????????????????????????????? TreeSet排序的第一種方式:讓元素自身具備比較性。
????????????????????????????????????元素需要實現Comparable接口,覆蓋compareTo方法。
????????????????????????????????????也種方式也成為元素的自然順序,或者叫做默認順序。
?
???????????????????????????????????? TreeSet的第二種排序方式。
????????????????????????????????????當元素自身不具備比較性時,或者具備的比較性不是所需要的。(兩個人比身高)這時就需要讓集合自身具備比較性。
????????????????????????????????????在集合初始化時,就有了比較方式。(如:兩個人用刻度尺-比較器比身高)
?
Set集合的功能和Collection是一致的。
需求:
往TreeSet集合中存儲自定義對象學生。
想按照學生的年齡進行排序。
?
記住,排序時,當主要條件相同時,一定判斷一下次要條件。
?
如:
class TreeSetDemo {public static void main(String[] args) {TreeSet ts = new TreeSet();ts.add(new Student("lisi02",22));ts.add(new Student("lisi007",20));ts.add(new Student("lisi09",19));ts.add(new Student("lisi08",19));//ts.add(new Student("lisi007",20));//ts.add(new Student("lisi01",40));Iterator it = ts.iterator();while(it.hasNext()){Student stu = (Student)it.next();System.out.println(stu.getName()+"..."+stu.getAge());}}}class Student implements Comparable//該接口強制讓學生具備比較性。{private String name;private int age;Student(String name,int age){this.name = name;this.age = age;}public int compareTo(Object obj){//return 0;if(!(obj instanceof Student))throw new RuntimeException("不是學生對象");Student s = (Student)obj;System.out.println(this.name+"....compareto....."+s.name);if(this.age>s.age)return 1;if(this.age==s.age){return this.name.compareTo(s.name);//調用String類的自身比較方法}return -1;/**/}public String getName(){return name;}public int getAge(){return age;}}
?
提示:
當存的是字符串對象時,調用默認的比較方法,按照ASCII瑪進行自然排序;
存的是自定義對象,復寫compareTo()方法,當主要條件相同時,一定判斷一下次要條件;
如果要按怎么存進去就怎么取出來,則復寫compareTo()方法,return 1即可,倒序的話就return -1;
11.?? ?二叉樹+ 實現Comparator方式排序
?
通過treeset,提高比較效率;
大的數在右邊,小的數在左邊,默認取數時從左到右;
?
當元素自身不具備比較性,或者具備的比較性不是所需要的。
這時需要讓容器自身具備比較性。
定義一個比較器,將比較器對象作為參數傳遞給TreeSet集合的構造函數。
?
當兩種排序(元素自身具備比較性的排序和容器具備比較性的排序)都存在時,以比較器為主。
?
定義比較器:定義一個類,實現Comparator接口,覆蓋compare方法。
?
注意:
compareable接口,覆蓋compareTo()方法;
Comparator接口,覆蓋compare方法
字符串自身具備compareTo()方法
?
請看如下案例:
class Student implements Comparable//該接口強制讓學生具備默認的比較性。{private String name;private int age;Student(String name,int age){this.name = name;this.age = age;}public int compareTo(Object obj){//return 0;if(!(obj instanceof Student))throw new RuntimeException("不是學生對象");Student s = (Student)obj;//System.out.println(this.name+"....compareto....."+s.name);if(this.age>s.age)return 1;if(this.age==s.age){return this.name.compareTo(s.name);}return -1;/**/}public String getName(){return name;}public int getAge(){return age;}}class TreeSetDemo2 {public static void main(String[] args) {TreeSet ts = new TreeSet();// TreeSet ts = new TreeSet(new MyCompare());//加上比較器進行排序ts.add(new Student("lisi02",22));ts.add(new Student("lisi02",21));ts.add(new Student("lisi007",20));ts.add(new Student("lisi09",19));ts.add(new Student("lisi06",18));ts.add(new Student("lisi06",18));ts.add(new Student("lisi007",29));//ts.add(new Student("lisi007",20));//ts.add(new Student("lisi01",40));Iterator it = ts.iterator();while(it.hasNext()){Student stu = (Student)it.next();System.out.println(stu.getName()+"..."+stu.getAge());}}}class MyCompare implements Comparator//定義比較器進行排序{public int compare(Object o1,Object o2){Student s1 = (Student)o1;Student s2 = (Student)o2;int num = s1.getName().compareTo(s2.getName());//字符串比較if(num==0)//當主要條件相同,比較次要條件{//整數的對象包裝類有比較方法,所以將整數封裝成Integer;return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));/*if(s1.getAge()>s2.getAge())return 1;if(s1.getAge()==s2.getAge())return 0;return -1;*/}return num;}}?
12.?? MAP集合概述+子類對象特點+共性方法
Map集合:該集合存儲鍵值對。一對一對往里存。而且要保證鍵的唯一性。
???????? 1,添加。
?????????????????? put(K key, V value),有返回值
?????????????????? putAll(Map<? extends K,? extends V> m)
?
???????? 2,刪除。
?????????????????? clear()
?????????????????? remove(Object key)
????????
???????? 3,判斷。
?????????????????? containsValue(Object value)
?????????????????? containsKey(Object key)
?????????????????? isEmpty()
?
?
???????? 4,獲取。
?????????????????? get(Object key)
?????????????????? size()
?????????????????? values()
?
?????????????????? entrySet()
?????????????????? keySet()
?
Map
???????? |--Hashtable:底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的。jdk1.0.效率低。
???????? |--HashMap:底層是哈希表數據結構,允許使用 null值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。
???????? |--TreeMap:底層是二叉樹數據結構。線程不同步。可以用于給map集合中的鍵進行排序。
?
?
和Set很像。
其實大家,Set底層就是使用了Map集合。
?
請看如下案例:
import java.util.*;class MapDemo{public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();//添加元素,添加元素,如果出現添加時,相同的鍵。那么后添加的值會覆蓋原有鍵對應值。//并put方法會返回被覆蓋的值。System.out.println("put:"+map.put("01","zhangsan1"));System.out.println("put:"+map.put("01","wnagwu"));map.put("02","zhangsan2");map.put("03","zhangsan3");System.out.println("containsKey:"+map.containsKey("022"));//System.out.println("remove:"+map.remove("02"));System.out.println("get:"+map.get("023"));map.put("04",null);System.out.println("get:"+map.get("04"));//可以通過get方法的返回值來判斷一個鍵是否存在。通過返回null來判斷。返回NULL代表不存在或者值為null;//獲取map集合中所有的值。Collection<String> coll = map.values();System.out.println(coll);System.out.println(map);}}13.?? ?Keyset+entryset
keyset方法案例
EntrySet方法案例
map集合的兩種取出方式:
1,Set<k> keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。
???????? 所有可以迭代方式取出所有的鍵,在根據get方法。獲取每一個鍵對應的值。
??????????????????
?
???????? Map集合的取出原理:將map集合轉成set集合。在通過迭代器取出。
?
?
2,Set<Map.Entry<k,v>> entrySet:將map集合中的映射關系存入到了set集合中,
????????????????????????????????????而這個關系的數據類型就是:Map.Entry
?
???????????????????????????????????? Entry其實就是Map中的一個static內部接口。
????????????????????????????????????為什么要定義在內部呢?
????????????????????????????????????因為只有有了Map集合,有了鍵值對,才會有鍵值的映射關系。
????????????????????????????????????關系屬于Map集合中的一個內部事物。
????????????????????????????????????而且該事物在直接訪問Map集合中的元素。
?
?
請看應用:
import java.util.*;class MapDemo2 {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("02","zhangsan2");map.put("03","zhangsan3");map.put("01","zhangsan1");map.put("04","zhangsan4");//將Map集合中的映射關系取出。存入到Set集合中。Set<Map.Entry<String,String>> entrySet = map.entrySet();Iterator<Map.Entry<String,String>> it = entrySet.iterator();while(it.hasNext()){Map.Entry<String,String> me = it.next();String key = me.getKey();String value = me.getValue();System.out.println(key+":"+value);}/*//先獲取map集合的所有鍵的Set集合,keySet();Set<String> keySet = map.keySet();//有了Set集合。就可以獲取其迭代器。Iterator<String> it = keySet.iterator();while(it.hasNext()){String key = it.next();//有了鍵可以通過map集合的get方法獲取其對應的值。String value = map.get(key);System.out.println("key:"+key+",value:"+value);}*/}}/*Map.Entry 其實Entry也是一個接口,它是Map接口中的一個內部接口。interface Map{public static interface Entry{public abstract Object getKey();public abstract Object getValue();}}class HashMap implements Map{class Hahs implements Map.Entry{public Object getKey(){}public Object getValue(){}}}*/14.?? Map練習
/*每一個學生都有對應的歸屬地。學生Student,地址String。學生屬性:姓名,年齡。注意:姓名和年齡相同的視為同一個學生。保證學生的唯一性。1,描述學生。2,定義map容器。將學生作為鍵,地址作為值。存入。3,獲取map集合中的元素。*/import java.util.*;class Student implements Comparable<Student>//如果一個類會產生多個對象,最好讓其具備自然順序,實現comparable接口,復寫compareTo()方法,hashcode()和equals()方法{private String name;private int age;Student(String name,int age){this.name = name;this.age = age;}public int compareTo(Student s){int num = new Integer(this.age).compareTo(new Integer(s.age));if(num==0)return this.name.compareTo(s.name);return num;}//為了限制數量,排除重復的數據,復寫hashcode()和equals()方法public int hashCode(){return name.hashCode()+age*34;}public boolean equals(Object obj){if(!(obj instanceof Student))throw new ClassCastException("類型不匹配");Student s = (Student)obj;return this.name.equals(s.name) && this.age==s.age;}public String getName(){return name;}public int getAge(){return age;}public String toString(){return name+":"+age;}}class MapTest{public static void main(String[] args) {HashMap<Student,String> hm = new HashMap<Student,String>();hm.put(new Student("lisi1",21),"beijing");hm.put(new Student("lisi1",21),"tianjin");hm.put(new Student("lisi2",22),"shanghai");hm.put(new Student("lisi3",23),"nanjing");hm.put(new Student("lisi4",24),"wuhan");//第一種取出方式 keySetSet<Student> keySet = hm.keySet();Iterator<Student> it = keySet.iterator();while(it.hasNext()){Student stu = it.next();String addr = hm.get(stu);System.out.println(stu+".."+addr);}//第二種取出方式 entrySetSet<Map.Entry<Student,String>> entrySet = hm.entrySet();Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();while(iter.hasNext()){Map.Entry<Student,String> me = iter.next();Student stu = me.getKey();String addr = me.getValue();System.out.println(stu+"........."+addr);}}}?15.?? HashMap練習
/*4、用一個方法調用隨機傳入的字符串、(hashmap)把字符串里的!@#$替換為1234,去空格,并且把該字符串的前半部分截取出來全部小寫,后半部分全部大寫。【map的使用,字符串的替換截取大小寫轉換】您輸入的是:Asw@rer$eaw!we asw2rer 4EAW1WE*/publicclass Demo{publicstaticvoid main(String args[]){Scanner s = new Scanner(System.in);String str = s.next();System.out.println("您輸入的是:"+str);Demo d= new Demo();System.out.println("處理后為:\n"+d.GetString(str));}public String GetString(String str){Map<String,String> map = new HashMap<String,String>();map.put("!","1");map.put("@","2");map.put("#","3");map.put("$","4");char ch[]= newchar[str.length()];ch = str.toCharArray();String result="";for(int i=0;i<ch.length;i++){Set<String> keySet = map.keySet();//有了Set集合。就可以獲取其迭代器。Iterator<String> it = keySet.iterator();while(it.hasNext()){String key = it.next();//有了鍵可以通過map集合的get方法獲取其對應的值。String value = map.get(key);if((ch[i]+"").equals(key)){ch[i]=(value+"").charAt(0);}//System.out.println("key:"+key+",value:"+value);}if(i<(ch.length+1)/2){result = result+(ch[i]+"").toLowerCase();}elseif (i==(ch.length+1)/2){result =result+"\n"+(ch[i]+"").toUpperCase(); } elseresult = result+(ch[i]+"").toUpperCase();}return result;}}?16.?? TreepMap練習
/* 需求:對學生對象的年齡進行升序排序。因為數據是以鍵值對形式存在的。 所以要使用可以排序的Map集合。TreeMap。 */ import java.util.*;class StuNameComparator implements Comparator<Student> //按姓名排序,定義比較器 {public int compare(Student s1,Student s2){int num = s1.getName().compareTo(s2.getName());if(num==0)return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));return num;} }class MapTest2 {public static void main(String[] args) {TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());tm.put(new Student("blisi3",23),"nanjing");tm.put(new Student("lisi1",21),"beijing");tm.put(new Student("alisi4",24),"wuhan");tm.put(new Student("lisi1",21),"tianjin");tm.put(new Student("lisi2",22),"shanghai");Set<Map.Entry<Student,String>> entrySet = tm.entrySet();Iterator<Map.Entry<Student,String>> it = entrySet.iterator();while(it.hasNext()){Map.Entry<Student,String> me = it.next();Student stu = me.getKey();String addr = me.getValue();System.out.println(stu+":::"+addr);}} }17.?? TreeMap練習-字母出現的次數
/*練習:"sdfgzxcvasdfxcvdf"獲取該字符串中的字母出現的次數。希望打印結果:a(1)c(2).....通過結果發現,每一個字母都有對應的次數。說明字母和次數之間都有映射關系。注意了,當發現有映射關系時,可以選擇map集合。因為map集合中存放就是映射關系。什么使用map集合呢?當數據之間存在這映射關系時,就要先想map集合。思路:1,將字符串轉換成字符數組。因為要對每一個字母進行操作。2,定義一個map集合,因為打印結果的字母有順序,所以使用treemap集合。3,遍歷字符數組。將每一個字母作為鍵去查map集合。如果返回null,將該字母和1存入到map集合中。如果返回不是null,說明該字母在map集合已經存在并有對應次數。那么就獲取該次數并進行自增。,然后將該字母和自增后的次數存入到map集合中。覆蓋掉原來鍵所對應的值。4,將map集合中的數據變成指定的字符串形式返回。*/import java.util.*;class MapTest3{public static void main(String[] args) {String s= charCount("ak+abAf1c,dCkaAbc-defa");System.out.println(s);}public static String charCount(String str){char[] chs = str.toCharArray();TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//怎么實現排序?character實現了comparable接口,具備默認的自然排序int count = 0;//定義在外面,只開辟了一次空間。定義在循環里面,空間開了又關,影響效率;for(int x=0; x<chs.length; x++){if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))continue;//排除字母之外的字符Integer value = tm.get(chs[x]);/*if(value==null){tm.put(chs[x],1);}else{value = value + 1;tm.put(chs[x],value);}//put方法用了兩次,重復。可以優化,用count變量*/if(value!=null)count = value;count++;tm.put(chs[x],count);//直接往集合中存儲字符和數字,為什么可以,因為自動裝箱。count = 0;//循環一次后需要清零}//System.out.println(tm);//遍歷完想要存起來,可用緩沖區(什么類型都能存,而且輸出String類型)StringBuilder sb = new StringBuilder();Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet ();Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();while(it.hasNext()){Map.Entry<Character,Integer> me = it.next();Character ch = me.getKey();Integer value = me.getValue();sb.append(ch+"("+value+")");}return sb.toString();//該方法返回string類型,sb返回的是stringbuilder,所以要調用tostring方法;} }18.?? Map擴展
map擴展知識。
?
map集合被使用是因為具備映射關系。
?
?
應用比較多的是一對多的映射關系,這就可以通過嵌套的形式將多個映射定義到一個大的集合中,并將大的集合分級處理,形成一個體系。
?
請看實例:
/*需求:一個學校有多個教室。每一個教室都有名稱。"yureban" Student("01" "zhangsan");"yureban" Student("02" "lisi");"jiuyeban" "01" "wangwu";"jiuyeban" "02" "zhaoliu";*/import java.util.*;class Student{private String id;private String name;Student(String id,String name){this.id = id;this.name = name;}public String toString(){return id+":::"+name;}}class MapDemo3{//學生信息直接用list集合存儲public static void demo(){HashMap<String,List<Student>> czbk = new HashMap<String,List<Student>>();List<Student> reyu = new ArrayList<Student>();List<Student> jiuye = new ArrayList<Student>();czbk.put("yureban",reyu);czbk.put("jiuyeban",jiuye);reyu.add(new Student("01","zhagnsa"));reyu.add(new Student("04","wangwu"));jiuye.add(new Student("01","zhouqi"));jiuye.add(new Student("02","zhaoli"));Iterator<String> it = czbk.keySet().iterator();while(it.hasNext()){String roomName = it.next();List<Student> room = czbk.get(roomName);System.out.println(roomName);getInfos(room);}}public static void getInfos(List<Student> list){Iterator<Student> it = list.iterator();while(it.hasNext()){Student s = it.next();System.out.println(s);}}public static void main(String[] args) {demo();/*HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>();HashMap<String,String> yure = new HashMap<String,String>();HashMap<String,String> jiuye = new HashMap<String,String>();czbk.put("yureban",yure);czbk.put("jiuyeban",jiuye);yure.put("01","zhagnsan");yure.put("02","lisi");jiuye.put("01","zhaoliu");jiuye.put("02","wangwu");//取出所有學生//遍歷czbk集合。獲取所有的教室。Iterator<String> it = czbk.keySet().iterator();while(it.hasNext()){String roomName = it.next();HashMap<String,String> room = czbk.get(roomName);//獲取教室這個鍵里的學生信息System.out.println(roomName);getStudentInfo(room);}// getStudentInfo(jiuye);//取出班級的學生// getStudentInfo(yure);*/}public static void getStudentInfo(HashMap<String,String> roomMap){Iterator<String> it = roomMap.keySet().iterator();while(it.hasNext()){String id = it.next();String name = roomMap.get(id);System.out.println(id+":"+name);}}}?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Java基础——集合List+Set+泛型+Map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 巨无霸Win8PE X64服务器维护专用
- 下一篇: linux 怎么禁止遍历目录,linux