免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java集合與框架總結(jié)與學(xué)習(xí)
    從圖1中可以看到,Collection是集合繼承樹中最頂層的接口,幾乎所有的Java集合框架成員都繼承實(shí)現(xiàn)了Collection接口,或者與其有密切關(guān)系。Collection提供了關(guān)于集合的通用操作。Set接口和List接口都繼承了Collection接口,而Map接口沒有繼承Collection接口。因此,Set對(duì)象和List對(duì)象都可以調(diào)用Collection接口的方法,而Map對(duì)象則不可以。
    下面我們對(duì)這三種類型接口的結(jié)構(gòu)加以說(shuō)明:Set有點(diǎn)類似數(shù)學(xué)中集合的定義,是無(wú)序的、沒有重復(fù)項(xiàng)目的集合。List是位置性集合,加進(jìn)清單的元素可以加在清單中特定位置或加到末尾,可以保存重復(fù)的元素。Map用于關(guān)鍵字/數(shù)值對(duì),其中關(guān)鍵字是數(shù)值的惟一標(biāo)識(shí)(不可重復(fù)),用戶可以按關(guān)鍵字存取數(shù)據(jù),數(shù)據(jù)可重復(fù)。具體形式如圖2所示:

 圖2 各集合元素存放示例

   (1)Collection:集合層次中的根接口,JDK 沒有提供這個(gè)接口直接的實(shí)現(xiàn)類。

   (2)Set:不能包含重復(fù)的元素。

   (3) List:是一個(gè)有序的集合,可以包含重復(fù)的元素。提供了按索引訪問(wèn)的方式。

   (4)Map:包含了 key-value 對(duì)。Map 不能包含重復(fù)的 key。


三、List用法總結(jié)

3.1 List接口

   List的主要特征使其元素已先行方式存儲(chǔ),集合中允許存放重復(fù)對(duì)象。List接口主要的實(shí)現(xiàn)類包括:

   (1)ArrayList:代表長(zhǎng)度可變的數(shù)組。允許對(duì)元素進(jìn)行快速的隨機(jī)訪問(wèn),但是向ArrayList中插入與刪除元素的速度較慢。

   (2)LinkedList :在實(shí)現(xiàn)中采用鏈表數(shù)據(jù)結(jié)構(gòu),元素之間是雙鏈接。對(duì)順序訪問(wèn)進(jìn)行了優(yōu)化,向List中插入和刪除元素的速度較快,隨機(jī)訪問(wèn)速度則相對(duì)較慢,隨機(jī)訪問(wèn)是指檢索位于特定索引位置元素,當(dāng)需要快速插入和刪除時(shí)LinkedList成為L(zhǎng)ist中的不二選擇。

   (3)Vector :是ArrayList的線程安全版本,性能比ArrayList要低,現(xiàn)在已經(jīng)很少使用。


3.2  ArrayList用法

3.2.1、ArrayList是個(gè)集合

      集合是可以往里面添東西的,用add(E e)方法往里面加(把E都看做Object

      例子:ArrayList類中的addget方法add方法向集合中添加數(shù)據(jù),get方法將集合中指定下標(biāo)位置的數(shù)據(jù)取出)

     (1)size()方法,返回集合中的元素個(gè)數(shù),類似于數(shù)組中的length屬性

     (2)clear()方法,將集合中的所有元素都給清除

     (3)isEmpty()方法判斷集合是否為空,為空返回true

     (4)remove(int index)方法是刪除集合中指定位置的元素,清除的原理是你清除了第一個(gè)后,后面的元素往前移,第一個(gè)變第0個(gè)了,原來(lái)第三個(gè)元素就沒啦

     (5)remove(Object ob)remove的重載,一個(gè)是根據(jù)索引來(lái)刪除,一個(gè)是根據(jù)具體對(duì)象來(lái)刪除,比如remove('Hello');

      (6)indexOf(Obejct ob)判斷某個(gè)元素在索引的第幾個(gè)位置上。

在數(shù)組中查看數(shù)組元素個(gè)數(shù),用數(shù)組的length屬性,在集合中查看集合元素個(gè)數(shù),用集合的size()方法。


3.2.2、ArrayList使用范例

import java.awt.List;import java.util.ArrayList;import java.util.Iterator;/** * @author 林炳文 * @time 2015/2/5 * ArrayList用法示例說(shuō)明 * */public class Main { public static void main(String[] args) { //ArrayList用法示例 ArrayList<String> m_ArrayList=new ArrayList<String>(); m_ArrayList.add('Evankaka'); m_ArrayList.add('林炳文'); m_ArrayList.add('德德'); m_ArrayList.add('Evankaka'); m_ArrayList.add('小紅'); m_ArrayList.set(2,'文炳林');// 將索引位置為2的對(duì)象修改 m_ArrayList.add(3,'秀秀');// 將對(duì)象添加到索引位置為3的位置 //ArrayList遍歷方法1 Iterator<String> it_ArrayList = m_ArrayList.iterator(); System.out.println('ArrayList遍歷方法1'); while (it_ArrayList.hasNext()) { System.out.println(it_ArrayList.next()); } //ArrayList遍歷方法2 System.out.println('ArrayList遍歷方法2'); for(Object o:m_ArrayList){ System.out.println(o); } //ArrayList遍歷方法2 System.out.println('ArrayList遍歷方法3'); for(int i = 0; i<m_ArrayList.size(); i ){ System.out.println(m_ArrayList.get(i)); } //刪除元素 m_ArrayList.remove('Evankaka'); it_ArrayList = m_ArrayList.iterator(); System.out.println('ArrayList刪除元素后的遍歷'); while (it_ArrayList.hasNext()) { String m_String=it_ArrayList.next(); if(m_String.equals('秀秀')){ it_ArrayList.remove(); }else{ System.out.println(m_String); } } } }

輸出結(jié)果:

ArrayList遍歷方法1
Evankaka
林炳文
文炳林
秀秀
Evankaka
小紅
ArrayList遍歷方法2
Evankaka
林炳文
文炳林
秀秀
Evankaka
小紅
ArrayList遍歷方法3
Evankaka
林炳文
文炳林
秀秀
Evankaka
小紅
ArrayList刪除元素后的遍歷
林炳文
文炳林
Evankaka
小紅

3.2.3、ArrayList注意

(1)使用Iterator迭代集合過(guò)程中,不可修改集合元素,否則會(huì)引發(fā)異常。并且Iterator只能向后迭代 

(2)如果你想在循環(huán)過(guò)程中去掉某個(gè)元素,只能調(diào)用it.remove方法,    不能使用list.remove方法,    否則一定出并發(fā)訪問(wèn)的錯(cuò)誤.  

3.3  LinkedList用法

        LinkedList類是鏈表節(jié)點(diǎn)各種操作的實(shí)現(xiàn),LinkedList類實(shí)現(xiàn)了一個(gè)帶有頭尾引用的通用型雙向鏈表。注意,此實(shí)現(xiàn)不是同步的。如果多個(gè)線程同時(shí)訪問(wèn)列表,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了該列表,則它必須保持外部同步。(結(jié)構(gòu)修改指添加或刪除一個(gè)或多個(gè)元素的任何操作;僅設(shè)置元素的值不是結(jié)構(gòu)修改。)這一般通過(guò)對(duì)自然封裝該列表的對(duì)象進(jìn)行同步操作來(lái)完成。如果不存在這樣的對(duì)象,則應(yīng)該使用 Collections.synchronizedList 方法來(lái)“包裝”該列表。最好在創(chuàng)建時(shí)完成這一操作,以防止對(duì)列表進(jìn)行意外的不同步訪問(wèn)。


四、set接口

       set集合中多個(gè)對(duì)象之間沒有明顯的順序,set與Collection的結(jié)構(gòu)基本上完全一樣,不同在于set不能包含重復(fù)元素。Set判斷兩個(gè)對(duì)象相同不是使用==運(yùn)算符,而是根據(jù)equals方法。也就是說(shuō)主要兩個(gè)對(duì)象用equals方法比較返回true,Set就不會(huì)接受這兩個(gè)對(duì)象。 HashSet是Set接口的典型實(shí)現(xiàn),大多數(shù)時(shí)候使用Set集合就是使用這個(gè)類。

4.1   HashSet說(shuō)明與范例

      HashSet按hash算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存儲(chǔ)和查找性能。 
      HaseSet具有以下特點(diǎn): 
     ● 不能保證元素的排列順序,順序有可能發(fā)生變化 
    ● HashSet不是同步的,如果多個(gè)線程訪問(wèn)同一個(gè)HashSet,要注意線程安全問(wèn)題 
    ● 集合元素值可以為null 
      當(dāng)向HashSet集合中存入一個(gè)元素時(shí),HashSet會(huì)調(diào)用該對(duì)象的hashCode()方法來(lái)得到該對(duì)象的hashCode值,然后根據(jù)該值來(lái)決定該對(duì)象在HashSet中的存儲(chǔ)位置。如果有兩個(gè)元素通過(guò)equals方法比較返回true,但它們的hashCode方法返回值不相等,HashSet將會(huì)把它們存儲(chǔ)在不同的位置。也就是說(shuō)HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過(guò)equals方法比較相等,并且兩個(gè)對(duì)象的hashCode方法返回值也相等。

使用范例:

package com.collection;import java.util.Date;import java.util.HashSet;import java.util.Iterator;public class Main{ public static void main(String [] args) { HashSet h=new HashSet(); h.add('1st'); h.add('2nd'); h.add(new Integer(3)); h.add(new Double(4.0)); h.add('2nd'); //重復(fù)元素,未被添加 h.add(new Integer(3)); //重復(fù)元素,未被添加 h.add(new Date()); System.out.println('開始:size=' h.size()); Iterator it=h.iterator(); while(it.hasNext()) { Object o=it.next(); System.out.println(o); } h.remove('2nd'); System.out.println('移除元素后:size=' h.size()); System.out.println(h); }}
結(jié)果:

開始:size=5
4.0
1st
3
2nd
Mon Feb 16 20:52:17 CST 2015
移除元素后:size=4
[4.0, 1st, 3, Mon Feb 16 20:52:17 CST 2015]

4.2 TreeSet

       TreeSet描述的是Set的一種變體——可以實(shí)現(xiàn)排序等功能的集合,它在將對(duì)象元素添加到集合中時(shí)會(huì)自動(dòng)按照某種比較規(guī)則將其插入到有序的對(duì)象序列中,并保證該集合元素組成時(shí)刻按照“升序”排列。

使用范例:

package com.collection;import java.util.TreeSet;import java.util.Iterator;public class Main{ public static void main(String [] args) { TreeSet ts=new TreeSet(); ts.add('orange'); ts.add('apple'); ts.add('banana'); ts.add('grape'); Iterator it=ts.iterator(); while(it.hasNext()) { String fruit=(String)it.next(); System.out.println(fruit); } }}

結(jié)果:

apple
banana
grape
orange

 4.3 Set總結(jié)

     (1) HashSet和TreeSet是Set的兩個(gè)典型實(shí)現(xiàn)。HashSet的性能總是比TreeSet好(特別是常用的添加、查詢等操作),因?yàn)門reeSet需要額外的紅黑樹算法來(lái)維護(hù)集合元素的次序。只有當(dāng)需要一個(gè)保存排序的Set時(shí),才應(yīng)該使用TreeSet,否則都應(yīng)該使用HashSet。
      (2)  LinkedHashSet是HashSet的子類,該集合也是根據(jù)元素hashCode值來(lái)決定元素存儲(chǔ)位置,但它同時(shí)使用鏈表維護(hù)元素的次序,這樣使得元素看起來(lái)是以插入的順序保存的。LinkedHashSet需要維護(hù)元素的插入順序,因此性能略低于HashSet的性能,但在迭代訪問(wèn)Set里的全部元素時(shí)將有很好的性能,又因?yàn)殒湵淼拇嬖?,遍歷LinkedHashSet會(huì)更快。
     (3)TreeSet是SortedSet接口的實(shí)現(xiàn),TreeSet可以確保集合元素處于排序狀態(tài),TreeSet并不是根據(jù)元素的插入順序進(jìn)行排序,而是根據(jù)元素的實(shí)際值來(lái)進(jìn)行排序的。     
     (4)EnumSet是所有Set實(shí)現(xiàn)類中性能最好的,但它只能保存同一個(gè)枚舉類的枚舉值作為集合元素。
     (5)必須指出的是Set的三個(gè)實(shí)現(xiàn)類HashSet、TreeSet和EnumSet都是線程不安全的,如果有多條線程同時(shí)訪問(wèn)一個(gè)Set集合,并有超過(guò)一條線程修改了該Set集合,則必須手動(dòng)保證該Set集合的同步性。通??梢酝ㄟ^(guò)Collections工具類的synchronizedSortedSet方法來(lái)包裝該Set集合。此操作最好在創(chuàng)建時(shí)進(jìn)行。


五 Map接口

     將鍵映射到值的對(duì)象。一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射到一個(gè)值。此接口取代 Dictionary 類,后者完全是一個(gè)抽象類,而不是一個(gè)接口。

  Map 接口提供三種collection 視圖,允許以鍵集、值集或鍵-值映射關(guān)系集的形式查看某個(gè)映射的內(nèi)容。映射順序 定義為迭代器在映射的 collection 視圖上返回其元素的順序。某些映射實(shí)現(xiàn)可明確保證其順序,如 TreeMap 類;另一些映射實(shí)現(xiàn)則不保證順序,如HashMap 類。

  注:將可變對(duì)象用作映射鍵時(shí)必須格外小心。當(dāng)對(duì)象是映射中某個(gè)鍵時(shí),如果以影響 equals 比較的方式更改了對(duì)象的值,則映射的行為將是不確定的。此項(xiàng)禁止的一種特殊情況是不允許某個(gè)映射將自身作為一個(gè)鍵包含。雖然允許某個(gè)映射將自身作為值包 含,但請(qǐng)格外小心:在這樣的映射上 equals 和 hashCode 方法的定義將不再是明確的。

  所有通用的映射實(shí)現(xiàn)類應(yīng)該提供兩個(gè)“標(biāo)準(zhǔn)的”構(gòu)造方法:一個(gè) void (無(wú) 參數(shù))構(gòu)造方法,用于創(chuàng)建空映射;一個(gè)是帶有單個(gè) Map 類型參數(shù)的構(gòu)造方法,用于創(chuàng)建一個(gè)與其參數(shù)具有相同鍵-值映射關(guān)系的新映射。實(shí)際上,后一個(gè)構(gòu)造方法允許用戶復(fù)制任意映射,生成所需類的一個(gè)等價(jià)映射。盡 管無(wú)法強(qiáng)制執(zhí)行此建議(因?yàn)榻涌诓荒馨瑯?gòu)造方法),但是 JDK 中所有通用的映射實(shí)現(xiàn)都遵從它。

  此接口中包含的“破壞”方法可修改其操作的映射,如果此映射不支持該操作,這些方法將拋出 UnsupportedOperationException。如果是這樣,那么在調(diào)用對(duì)映射無(wú)效時(shí),這些方法可以(但不要求)拋出 UnsupportedOperationException。例如,如果某個(gè)不可修改的映射(其映射關(guān)系是“重疊”的)為空,則對(duì)該映射調(diào)用 putAll(Map) 方法時(shí),可以(但不要求)拋出異常。

  某些映射實(shí)現(xiàn)對(duì)可能包含的鍵和值有所限制。例如,某些實(shí)現(xiàn)禁止 null 鍵和值,另一些則對(duì)其鍵的類型有限制。嘗試插入不合格的鍵或值將拋出一個(gè)未經(jīng)檢查的異常,通常是 NullPointerException 或 ClassCastException。試圖查詢是否存在不合格的鍵或值可能拋出異常,或者返回 false;某些實(shí)現(xiàn)將表現(xiàn)出前一種行為,而另一些則表現(xiàn)后一種。一般來(lái)說(shuō),試圖對(duì)不合格的鍵或值執(zhí)行操作且該操作的完成不會(huì)導(dǎo)致不合格的元素被插入映射 中時(shí),將可能拋出一個(gè)異常,也可能操作成功,這取決于實(shí)現(xiàn)本身。這樣的異常在此接口的規(guī)范中標(biāo)記為“可選”。

  此接口是 Java Collections Framework 的成員。

  Collections Framework 接口中的很多方法是根據(jù) equals 方法定義的。例如,containsKey(Object key) 方法的規(guī)范中寫道:“當(dāng)且僅當(dāng)此映射包含針對(duì)滿足 (key==null ? k==null : key.equals(k)) 的鍵 k 的映射關(guān)系時(shí),返回 true”。不 應(yīng)將此規(guī)范解釋為:調(diào)用具有非空參數(shù) key 的 Map.containsKey 將導(dǎo)致對(duì)任意的鍵 k 調(diào)用 key.equals(k)。實(shí)現(xiàn)可隨意進(jìn)行優(yōu)化,以避免調(diào)用 equals,例如,可首先比較兩個(gè)鍵的哈希碼(Object.hashCode() 規(guī)范保證哈希碼不相等的兩個(gè)對(duì)象不會(huì)相等)。一般來(lái)說(shuō),只要實(shí)現(xiàn)者認(rèn)為合適,各種 Collections Framework 接口的實(shí)現(xiàn)可隨意利用底層 Object 方法的指定行為。

      

Map 提供了一個(gè)更通用的元素存儲(chǔ)方法。Map 集合類用于存儲(chǔ)元素對(duì)(稱作“鍵”和“值”),其中每個(gè)鍵映射到一個(gè)值。從概念上而言,您可以將 List 看作是具有數(shù)值鍵的 Map。而實(shí)際上,除了 List 和 Map 都在定義 java.util 中外,兩者并沒有直接的聯(lián)系。本文將著重介紹核心 Java 發(fā)行套件中附帶的 Map,同時(shí)還將介紹如何采用或?qū)崿F(xiàn)更適用于您應(yīng)用程序特定數(shù)據(jù)的專用 Map。

5.1、了解 Map 接口和方法

Java 核心類中有很多預(yù)定義的 Map 類。在介紹具體實(shí)現(xiàn)之前,我們先介紹一下 Map 接口本身,以便了解所有實(shí)現(xiàn)的共同點(diǎn)。Map 接口定義了四種類型的方法,每個(gè) Map 都包含這些方法。下面,我們從兩個(gè)普通的方法開始對(duì)這些方法加以介紹。

表 1:覆蓋的方法。我們將這 Object 的這兩個(gè)方法覆蓋,以正確比較 Map 對(duì)象的等價(jià)性。

equals(Object o) 比較指定對(duì)象與此 Map 的等價(jià)性
hashCode() 返回此 Map 的哈希碼

 

5.2、Map 構(gòu)建

Map 定義了幾個(gè)用于插入和刪除元素的變換方法。

表 2:Map 更新方法: 可以更改 Map 內(nèi)容。

clear() 從 Map 中刪除所有映射
remove(Object key) 從 Map 中刪除鍵和關(guān)聯(lián)的值
put(Object key, Object value) 將指定值與指定鍵相關(guān)聯(lián)
clear() 從 Map 中刪除所有映射
putAll(Map t) 將指定 Map 中的所有映射復(fù)制到此 map

 

盡管您可能注意到,縱然假設(shè)忽略構(gòu)建一個(gè)需要傳遞給 putAll() 的 Map 的開銷,使用 putAll() 通常也并不比使用大量的 put() 調(diào)用更有效率,但 putAll() 的存在一點(diǎn)也不稀奇。這是因?yàn)?,putAll() 除了迭代 put() 所執(zhí)行的將每個(gè)鍵值對(duì)添加到 Map 的算法以外,還需要迭代所傳遞的 Map 的元素。但應(yīng)注意,putAll() 在添加所有元素之前可以正確調(diào)整 Map 的大小,因此如果您未親自調(diào)整 Map 的大小(我們將對(duì)此進(jìn)行簡(jiǎn)單介紹),則 putAll() 可能比預(yù)期的更有效。

5.3、查看 Map

迭代 Map 中的元素不存在直接了當(dāng)?shù)姆椒?。如果要查詢某個(gè) Map 以了解其哪些元素滿足特定查詢,或如果要迭代其所有元素(無(wú)論原因如何),則您首先需要獲取該 Map 的“視圖”。有三種可能的視圖。

  • 所有鍵值對(duì) — 參見 entrySet()
  • 所有鍵 — 參見 keySet()
  • 有值 — 參見 values()

 

前兩個(gè)視圖均返回 Set 對(duì)象,第三個(gè)視圖返回 Collection 對(duì)象。就這兩種情況而言,問(wèn)題到這里并沒有結(jié)束,這是因?yàn)槟鸁o(wú)法直接迭代 Collection 對(duì)象或 Set 對(duì)象。要進(jìn)行迭代,您必須獲得一個(gè) Iterator 對(duì)象。因此,要迭代 Map 的元素,必須進(jìn)行比較煩瑣的編碼

 

Iterator keyValuePairs = aMap.entrySet().iterator();Iterator keys = aMap.keySet().iterator();Iterator values = aMap.values().iterator();

 

值得注意的是,這些對(duì)象(Set、Collection 和 Iterator)實(shí)際上是基礎(chǔ) Map 的視圖,而不是包含所有元素的副本。這使它們的使用效率很高。另一方面,Collection 或 Set 對(duì)象的 toArray() 方法卻創(chuàng)建包含 Map 所有元素的數(shù)組對(duì)象,因此除了確實(shí)需要使用數(shù)組中元素的情形外,其效率并不高。

5.4、遍歷map

package com.test; import java.util.HashMap;import java.util.Iterator;import java.util.Map;public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put('first', 'linlin'); map.put('second', 'bingbing'); map.put('third', 'wenwen'); map.put('first', 'linlin2'); // 第一種:通過(guò)Map.keySet遍歷key和value System.out.println('===================通過(guò)Map.keySet遍歷key和value:==================='); for (String key : map.keySet()) { System.out.println('key= ' key ' and value= ' map.get(key)); } // 第二種:通過(guò)Map.entrySet使用iterator遍歷key和value System.out.println('===================通過(guò)Map.entrySet使用iterator遍歷key和value:==================='); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println('key= ' entry.getKey() ' and value= ' entry.getValue()); } // 第三種:通過(guò)Map.entrySet遍歷key和value System.out.println('===================通過(guò)Map.entrySet遍歷key和value:==================='); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println('key= ' entry.getKey() ' and value= ' entry.getValue()); } // 第四種:通過(guò)Map.values()遍歷所有的value,但是不能遍歷鍵key System.out.println('===================通過(guò)Map.values()遍歷所有的value:==================='); for (String v : map.values()) { System.out.println('value= ' v); } } }

輸出結(jié)果如下
===================通過(guò)Map.keySet遍歷key和value:===================
key= third  and  value= wenwen
key= first  and  value= linlin2
key= second  and  value= bingbing
===================通過(guò)Map.entrySet使用iterator遍歷key和value:===================
key= third  and  value= wenwen
key= first  and  value= linlin2
key= second  and  value= bingbing
===================通過(guò)Map.entrySet遍歷key和value:===================
key= third  and  value= wenwen
key= first  and  value= linlin2
key= second  and  value= bingbing
===================通過(guò)Map.values()遍歷所有的value:===================
value= wenwen
value= linlin2
value= bingbing



本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java中Map,List與Set的區(qū)別
Java面試手冊(cè):集合框架
java集合框架
map,set,list,等JAVA中集合解析
java容器中l(wèi)ist和set總結(jié)
map
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服