java的集合架構

來源:互聯網
上載者:User

標籤:arraylist   遍曆   資料   vector   sys   keyset   list介面   xtend   元素   

 

Java集合架構提供如下兩個類型的容器: 1、集合(Collection): 存取單個元素的集合。 2、圖/映射(Map): 儲存鍵/值對(key-value)。

Collection 介面 和 AbstractCollection 類

Collection 介面是處理對象集合的根介面;

 

集合(Collection)

Java集合架構主要支援三種主要類型的集合: 1、規則集Set: 用以儲存一組不重複的元素 2、線性表List: 用於儲存一個有元素構成的有序集合,其中元素可以重複。 3、隊列Queue: 用於儲存使用先進先出方式處理的對象。

 

注意: 1、Java中的所有的集合架構的介面和類都定義在Java.util包內。 2、Java的集合架構中的所有的具體類都是實現了java.lang.Cloneable和java.io.Serializable介面的。所以,它們的執行個體都是可複製且可以序列化的

 

Collection介面和AbstractCollection類

定義:public interface Collection<E>extends Iterator<E>;
全部方法:

Collection 中的addAll();removeAll();retainALL()類似與集合中的並、差、交

 

Collection介面提供了在集合之中添加或刪除元素的基本操作: 1、add方法給集合添加一個元素。 2、addAll方法會把指定集合中的所有元素添加到這個集合中。 3、remove方法從集合中刪除一個元素。 4、removeAll方法會從集合之中刪除指定集合中的所有元素。 5、retainAll方法保留即出現在當前集合中,也出現在指定集合中的元素。 以上所有的方法返回的都是boolean類型的值,如果執行方法會改變這個集合,那麼返回的就是true。clear()方法傳回值類型為void,單純的刪除集合中所有元素。 注意:方法addAll(), removeAll(), retainAll()類似於集合上的並、差、交運算。

 

Collection介面提供了多種查詢操作: 1、size方法返回集合中元素的個數。 2、contains方法檢測集合中是否包含指定的元素。 3、containsAll方法檢測這個集合是否包含指定集合中的元素。 4、isEmpty方法檢測這個集合是否為空白。 Collection介面提供的toArray方法返回一個表示集合的數組。 集合可以是一個規則集,也可以是一個線性表。Iterator介面提供了對不同類型集合中的元素進行遍曆的統一方法。

 

集合可以是一個規則集,也可以是一個線性表。Iterator介面提供了對不同類型集合中的元素進行遍曆的統一方法。可以使用Collection介面中的Iterator()方法返回一個Iterator介面的執行個體: 1、它的next()方法順序訪問集合中的元素。 2、它的hasNext()方法用來檢測迭代器中是否還有更多的元素。 3、它的remove()方法刪除從迭代器返回的最後一個元素。

 

AbstractCollection類提供Collection介面的部分抽象方法的實現,它是一個抽象類別。除了size方法和iterator方法之外,它實現了Collection介面的其他所有方法。 size方法和iterator方法在其相應的子類中給出具體實現。

規則集Set

Set介面擴充了Collection介面。它沒有引入新的方法或常量,只是規定Set的執行個體不包含重複的元素。實現Set的具體類必須確保沒有向這個規則集添加重複的元素。也就是說,在一個規則集中,一定不存在元素e1、e2使得e1.equals(e2)返回為true。 Set介面定義如下: public interface Set<E> extends Collection<E> AbstractSet是一個便利類,它擴充AbstractCollection類並且實現Set介面。它提供equals方法和hashCode方法的具體實現。一個規則集的hashCode(散列碼)是這個集合中所有元素的hashCode的和。AbstractSet類沒有實現size()方法和iterator()方法,因此它是一個抽象類別。

 

Set介面的三個具體類是:散列類HashSet、鏈式散列集LinkedHashSet、樹形集合TreeSet。

 

散列集合HashSet 可以用它的無參的構造方法來建立空的散列集,也可以由一個現有的集合建立散列集。預設情況下,初始容量為16而客座率(load factor)為0.75。如果知道集合大小,還可以手動指定初始容量和客座率。 客座率(load factor): 客座率的值必須在0.0到1.0之間。它是用來測量在增加Set的容量之前,該Set的飽滿程度。當元素的個數超過了容量與客座率的乘積,容量就會自動翻倍。例如,如果容量是16而客座率是0.75。那麼當尺寸達到12(16×0.75)的時候,容量將會翻倍到32。

 

HashSet可以儲存互不相同的任何元素。 考慮到效率的因素,添加到Set中的對象必須以一種正確分散hashCode的的方式來實現hashCode()方法。如果兩個相同類型對象完全相等,那麼這兩個對象對應的hashCode必須相同。由於HashSet可以儲存類型不相同的元素,這將會帶來一個問題:兩個不同的對象可能會碰巧有相同的hashCode。怎麼辦?應當在實現hashCode()方法的時候盡量規避這種情況的出現。比如,Integer類的hashCode()方法返回它的int值;Character類的hashCode()方法返回這個字元的統一碼,等等。HashSet中如果同時放入Integer和Character可能會導致hashCode衝突。

 

鏈式散列類LinkedHashSet

 

LinkedHashSet使用一個鏈表來擴充HashSet類,它支援對規則集合內的元素進行排序。 LinkedHashSet中的元素按照它們插入的順序進行排序。 LinkedHashSet中的元素不能重複,插入重複的元素等效於只插入1次。 注意:如果不需要維護元素被插入的順序,就應該使用HashSet,它會比LinkedHashSet更加高效。

 

樹形集合TreeSet

 

集合擴充順序: TreeSet 實現 NavigableSet介面,NavigableSet介面是SortedSet的子介面,SortedSet介面是Set介面的子介面。 SortedSet確保規則集合中的所有元素都是有序的。 TreeSet是實現了NavigableSet介面的一個具體類。為了建立TreeSet的一個對象,必須保證TreeSet中加入的物件類型是可以比較的。用兩種方法可以實現: 1、使用Comparable介面 2、給Set中的元素指定一個比較子。這種方法定義的順序稱為是比較子順序。比較子Comparator將在後面介紹。

建立一個TreeSet: //當使用語句new TreeSet的時候就從一個HashSet對象建立一個TreeSet對象並且將規則集中的元素排序一次 //每次給樹形集合TreeSet添加元素的時候,其中的元素都會重新排序。 TreeSet<String> treeSet = new TreeSet<String>(set);

 

TreeSet中的方法: System.out.println("first(): " + treeSet.first());//返回TreeSet中第一個元素 System.out.println("last(): " + treeSet.last());//返回TreeSet中最後一個元素 System.out.println("headSet(\"New York\"): " + treeSet.headSet("New York"));//返回TreeSet中比"New York"小的那一部分 System.out.println("headSet(\"New York\"): " + treeSet.tailSet("New York"));//返回TreeSet中比"New York"大的那一部分

 

TreeSet中的方法: treeSet.first();//返回TreeSet中第一個元素 treeSet.last();//返回TreeSet中最後一個元素 treeSet.headSet("New York");//返回TreeSet中比"New York"小的那一部分 treeSet.tailSet("New York");//返回TreeSet中比"New York"大的那一部分 treeSet.lower("Paris");//小於Paris的第一個元素 treeSet.higher("Paris");//大於Paris的第一個元素 treeSet.floor("Paris");//小於等於Paris的第一個元素 treeSet.ceiling("Paris");//大於等於Paris的第一個元素 treeSet.pollFirst();//刪除和返回樹形集合TreeSet中的第一個元素 treeSet.pollLast();//刪除和返回樹形集合TreeSet中的最後一個元素

 

注意: 1、Java集合架構中的所有具體類都至少有兩個構造方法:一個是建立空集合的無參構造方法,另一個是用某個集合對象來建立其執行個體的構造方法。 2、在需要對Set中的元素進行頻繁的插入刪除操作的的時候,最好使用HashSet,因為這樣會降低程式的已耗用時間。當我們需要一個排好序的集合的時候,可以將這個HashSet作為TreeSet的構造方法的入參建立一個排好序的Set。

 

比較子介面Comparator

 

如果我們需要將元素插入到一個樹集合中但是同時這些元素又不是Comparable介面的執行個體。這時候就可以通過java.util.Comparator來定義一個比較子。Comparator介面有兩個方法:compare和equals。 public int compare(Object element1, Object element2) 如果element1小於element2,就返回一個負值;如果element1大於element2,就返回一個正值。相等返回0。 public boolean equals(Object element) 如果指定的對象也是一個比較子並且與當前比較子有相同的排序,則返回true。注意,在Object類中也定義了equals方法。所以,即使在你自訂的比較子類中沒有實現equals方法,也不會出現編譯錯誤。然而,有時候實現該equals方法會提高程式的執行效率,因為這樣可以讓程式快速判斷兩個不同的比較子是否有相同的順序。

 

有時我們希望將元素插入到一個TreeSet中,但是這些元素可能不是也無法定義為java.lang.Comparable的執行個體。這時候可以自訂一個比較子Comparator來計算這些元素。 建立一個實現java.util.Comparator介面的類需要實現Comparator介面中的兩個方法: 1、public int compare(Object element1, Object element2) 如果element1小於element2,就返回一個負值;如果element1大於element2就返回正值,否則返回0 2、public boolean equals(Object element) 如果指定的對象也是一個比較子,並且與這個比較子具有相同的排序,則返回true。由於Object類中也實現了equals方法。所以在自訂的Comparator中沒有實現equals方法也不會出現編譯錯誤。但是有時候實現equals方法能夠讓程式快速判斷兩個不同的比較子是否有相同的排序,從而提高運行效率。

 

public class GeometricObjectComparator implements Comparator<GeometricObject>, java.io.Serializable { @Override public int compare(GeometricObject o1, GeometricObject o2) { double area1 = o1.getArea(); double area2 = o2.getArea(); if (area1 < area2) { return -1; } else if (area1 > area2) { return 1; } else { return 0; } } }

 

線性表List

之前介紹的Set只能儲存不重複的元素。為了允許在集合中儲存重複的元素,需要使用List(線性表)。 List不僅可以儲存重複的元素,還允許使用者指定元素的儲存位置。 使用者通過下標可以訪問List中特定位置的元素。 List介面擴充自Collection介面,以定義一個允許重複的有序集合。List介面增加了面向位置的操作,並且增加了一個能夠雙向遍曆List的迭代器。

 

List中的方法: 1、方法add(index, element)用於指定下標index處插入一個元素element。 2、方法addAll(index, collection)用於在指定下標處插入一個集合collection。 3、方法remove(index)用於從線性表中刪除指定下標index處的元素。 4、方法set(index, element)可以在指定下標index處設定一個新元素。 5、方法indexOf(element)用於擷取指定元素在List中第一次出現的下標。 6、方法lastIndexOf(element)用於擷取指定元素在List中最後一次出現時的下標 7、方法subList (fromIndex, toIndex)返回一個從fromIndex到toIndex-1的子list 8、方法listIterator()或者listIterator(startIndex)都會返回一個ListIterator的執行個體。ListIterator擴充了Iterator介面,以增加對線性表的雙向遍曆能力。

 

List中的方法: 1、方法add(index, element)用於指定下標index處插入一個元素element。 2、方法addAll(index, collection)用於在指定下標處插入一個集合collection。 3、方法remove(index)用於從線性表中刪除指定下標index處的元素。 4、方法set(index, element)可以在指定下標index處設定一個新元素。 5、方法indexOf(element)用於擷取指定元素在List中第一次出現的下標。 6、方法lastIndexOf(element)用於擷取指定元素在List中最後一次出現時的下標 7、方法subList (fromIndex, toIndex)返回一個從fromIndex到toIndex-1的子list 8、方法listIterator()或者listIterator(startIndex)都會返回一個ListIterator的執行個體。ListIterator擴充了Iterator介面,以增加對線性表的雙向遍曆能力。

 

ListIterator中的方法: 1、方法add(element)用於將指定元素element插入到當前List中 如果Iterator介面中定義的next()方法返回非空,該元素將立即被插入到next()方法返回的元素之前;而且,如果previous()方法的傳回值非空。該元素被立即插入到previous()方法返回的元素之後。 2、方法set(element)用於將next方法或者previous方法返回的最後一個元素替換為指定的元素。 3、next()、previous()、nextIndex()、previousIndex()方法分別返回Iterator中的下一個元素,前一個元素,下一個元素的下標,前一個元素的下標。 4、方法hasNext()用於檢測迭代器向前遍曆時是否有元素,而方法hasPrevious()用於檢測迭代器向後遍曆是否有元素。

 

ListIterator中的方法: 1、方法add(element)用於將指定元素element插入到當前List中 如果Iterator介面中定義的next()方法返回非空,該元素將立即被插入到next()方法返回的元素之前;而且,如果previous()方法的傳回值非空。該元素被立即插入到previous()方法返回的元素之後。 2、方法set(element)用於將next方法或者previous方法返回的最後一個元素替換為指定的元素。 3、next()、previous()、nextIndex()、previousIndex()方法分別返回Iterator中的下一個元素,前一個元素,下一個元素的下標,前一個元素的下標。 4、方法hasNext()用於檢測迭代器向前遍曆時是否有元素,而方法hasPrevious()用於檢測迭代器向後遍曆是否有元素。

 

ArrayList和LinkedList是實現List介面的兩個具體類。 ArrayList用數組來儲存元素,這個數組是動態建立的。如果元素超過了數組的容量,就建立一個更大的數組,並將當前數組中的元素都複製到新的數組中。 而LinkedList在一個鏈表中儲存元素。 如何選用ArrayList還是LinkedList? 一般來說,如果需要通過下標隨機的訪問元素,但是除了在末尾處之外,不能在其他位置插入或刪除元素(或者不需要插入或刪除元素),那麼選用ArrayList將更加高效。 而如果需要在List中的任意位置插入元素,LinkedList將會是一個更好的選擇。

 

ArrayList的建立方法: 1、調用無參構造方法ArrayList()建立一個帶預設初始值容量的空列表。 2、調用ArrayList(collection)從現有集合collection建立一個數組列表。 3、調用ArrayList(initialCapacity)來建立一個指定初始容量為initialCapacity的列表。

 

LinkedList的建立方法: 1、調用無參構造方法LinkedList()建立一個預設的空列表。 2、調用LinkedList(collection)從現有集合collection建立一個數組列表。

 

注意: 1、為了從泛型型別的可變長參數表建立線性表,Java提供了靜態asList方法。這樣,就可以使用下面的語句建立一個String類型的List和一個Integer類型的List。 List<String> list1 = Arrays.asList("red", "green", "blue"); List<Integer> list1 = Arrays.asList(1, 2, 3);

Collections介面

Java集合架構在Collections類中提供了用於對線性表進行排序的靜態方法。 Collections還包含用於線性表的binarySearch,reverse,shuffle,copy和fill方法。以及用於集合的max,min,disjoint以及frequency方法。

 

可以使用方法sort(list)來對線性表中的元素排序,這裡的比較方法使用的是Comparable介面中的compareTo方法。也可以自訂一個Comparator來比較。 List<String> list = Arrays.asList("tree", "apple", "java"); Collections.sort(list, Collections.reverseOrder()); System.out.println(list);// 逆序排列 Collections.sort(list); System.out.println(list);// 順序排列

 

可以使用方法binarySearch(list, element)來對線性表中的元素排序,使用binarySearch方法之前,注意必須以順序排列數組中的元素。如果list中的元素不是以順序排序的,則會出現錯誤。 System.out.println("apple‘s index:" + Collections.binarySearch(list, "apple")); System.out.println("alpha‘s index:" + Collections.binarySearch(list, "alpha"));

 

可以使用方法reverse()將list1中元素的順序逆反過來 List<Integer> list1 = Arrays.asList(1, 2, 10, 4, 3, 7); System.out.println(list1); Collections.reverse(list1);// 逆反list1 System.out.println(list1);

 

可以使用方法shuffle(list)來對線性表中的元素進行隨機的重新排序 List<Integer> list1 = Arrays.asList(1, 2, 10, 4, 3, 7); for (int i = 1; i <= 3; i++) { List<Integer> tempList = new ArrayList<Integer>(list1); Collections.shuffle(tempList);// 打亂tempList System.out.println("shuffle time: " + i + ". list1: " + tempList); } for (int i = 1; i <= 3; i++) { List<Integer> tempList = new ArrayList<Integer>(list1); // 使用隨機數Random(20),打亂tempList,結果擁有相同的元素序列 Collections.shuffle(tempList, new Random(20)); System.out.println("shuffle time: " + i + ". list1: " + tempList); }

 

可以使用方法copy(det, src)將源線性表中的所有元素以同樣的下標複製到目標線性表中。 目標線性表必須和源線性表等長。 如果源線性表的長度大於目標線性表,那麼,源線性表中的剩餘元素不會受到影響。 List<Integer> list2 = Arrays.asList(1, 2, 3, 4); List<Integer> list3 = Arrays.asList(31, 32); Collections.copy(list2, list3); System.out.println("list2: " + list2);// [31, 32, 3, 4] 注意:copy方法是淺複製。複製的只是線性表中元素的引用。

 

可以使用方法nCopies(int n, Object o)建立一個包含指定對象的n個副本的不可變線性表。 List<Date> list4 = Collections.nCopies(5, new Date()); System.out.println("list4: " + list4); 如果執行list4.add(new Date());會產生一個java.lang.UnsupportedOperationException。這裡注意使用nCopies()方法產生的list是不可變的,不能在該線性表中添加,刪除,或者更新元素。nCopies()方法產生的list中所有的元素都有相同的引用。

 

max方法和min方法: 可以使用max方法和min方法找出集合中的最大元素和最小元素。 集合中的元素必須使用Comparable介面或者Comparator介面。 List<String> list6 = Arrays.asList("red", "green", "blue"); System.out.println("max in list6 " + Collections.max(list6)); System.out.println("min in list6 " + Collections.min(list6));

 

如果兩個集合中沒有相同的元素,那麼方法disjoint返回true Collection<String> collection1 = Arrays.asList("red", "blue"); Collection<String> collection2 = Arrays.asList("red", "green"); Collection<String> collection3 = Arrays.asList("cyan", "tan"); System.out.println("collection1 disjoint collection2: " + Collections.disjoint(collection1, collection2)); System.out.println("collection2 disjoint collection3: " + Collections.disjoint(collection2, collection3));

 

使用方法frequency(collection, element)可以找出集合中某元素的出現次數 List<String> list7 = Arrays.asList("blue", "green", "green"); System.out.println("green frequency: " + Collections.frequency(list7, "green")); //控制台輸出2

 

這裡我們給出一個測試Set和List效能的方法,如下所示: private static long getTestTime(Collection<Integer> c, int size) { long startTime = System.currentTimeMillis(); List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < size; i++) { list.add(i); } Collections.shuffle(list); for (int e : list) { c.add(e); } long endTime = System.currentTimeMillis(); return endTime - startTime;

 

向量類Vector和棧類Stack

 

Java集合架構是在Java2引入的。Java2之前的版本也支援一些資料結構,其中就有向量類Vector與棧類Stack。為了適應Java的集合架構,Java2對這些類進行了重新設計。 除了包含用於訪問和修改向量的同步方法之外,Vector類與ArrayList是一樣的。同步方法用於防止兩個或者多個線程同時訪問某個向量的時候引起資料損毀。對於許多不需要使用同步的應用程式來說,使用ArrayList比使用Vector更高效。 Stack棧類也是在Java 2之前引入的。方法empty()與方法isEmpty()的功能是一樣的。方法peek()可以返回棧頂的元素而不刪除它。方法pop()返回棧頂的元素並刪除。方法push(element)將指定元素添加到Stack中。方法search(element)檢測指定元素是否在棧內。

 

隊列和優先隊列

 

隊列是一種先進先出的資料結構。元素被追加到隊列的末尾,然後從隊列頭刪除。在優先隊列中,元素被賦予優先順序。當訪問元素時,擁有最高優先順序的元素首先被刪除。

 

雙端隊列Deque和鏈表LinkedList

LinkedList實現了Deque介面,Deque介面又擴充了Queue介面。Deque是“double-ended queue”的簡稱,通常發音是“deck”。Deque介面用附加的從隊列兩端插入和刪除元素的辦法擴充Queue介面。方法addFirst()、removeFirst()、addLast()、removeLast()、getFirst()、getLast()都被定義在Deque介面中。 PriorityQueue類實現一個優先隊列。預設情況下,優先隊列使用Comparable介面以元素的自然順序排列。擁有最小數值的元素被賦予最高優先順序,因此最先從隊列中刪除。如果幾個元素具有相同的最高優先順序,其中的任意一個元素都可以從列表中被刪除。也可以使用構造方法PriorityQueue(initialCapacity, comparator)中的Comparator來指定一個順序。

Map

假設程式中需要儲存100萬個市民的姓名和他們的社會安全號碼,而且需要使用社會安全號碼來搜尋對應人的姓名。那麼,針對這個任務的最有效資料結構就是映射(Map)。 Map是一種依照Key-Value值儲存元素的容器。Key就像是下標。在List中,下標是整數;而在Map中索引值Key可以市任意類型的對象(Integer,String)。 Map中的索引值Key必須保持唯一性,即不能有重複的索引值,每個Key對應一個Value。一個索引值Key和它對應的值Value構成一個item。真正在Map儲存的是這個item。

 

Map介面提供了查詢、更新、和擷取集合的值和集合的索引值的方法。下面介紹更新方法: 1、clear() 刪除所有的條目。 2、put(key, value) 將一個值value和Map中的一個索引值key關聯。如果這個Map中原來就包含到該索引值的一個映射,那麼該方法會返回原來和這個索引值相關聯的舊值。(而將key關聯為新的Value值) 3、putAll(m) 將指定的Map m添加到當前Map中,但是重複的items會被覆蓋。 4、remove() 將指定的key對應的元素從Map中刪除。

 

查詢方法: 1、containsKey(key) 檢測Map中是否包含指定key的key-value 的映射 2、containsValue(value) 檢測Map中是否包含指定value的key-value 的映射 3、isEmpty() 檢測Map是否為空白 4、size() 返回Map中item的個數

 

將Map轉換為Set的方法: 1、keySet() 調用map.keySet()將map中的key全部拿出來組成一個包含全部key值的Set 2、values() 調用map.values()將map中的value全部拿出來組成一個包含全部value值的Set 3、entrySet() 調用map.entrySet()將map中的<key, value>全部拿出來組成一個包含全部<key, value>值的Set,該Set中每個對象都是底層Map中的一個key-value對。 該方法實際返回一個實現Map.Entry<K, V>介面的對象集合,這裡的Entry是Map介面的一個內部介面。

 

AbstractMap抽象類別:實現了Map介面的便利抽象類別。 AbstractMap實現了Map介面中除了entrySet()方法之外的所有方法。 SortedMap介面: 擴充了Map介面,並保持Map中的<K, V>對以索引值K升序排列。 它還有附加的方法firstKey()和lastKey()返回最低索引值和最高索引值,headMap(toKey)返回索引值K小於toKey的那部分Map,tailMap(fromKey)返回索引值大於或等於fromKey的那部分Map。

 

1、具體類HashMap: 對於定位一個值、插入一個<K, V>、以及刪除一個<K, V>而言,HashMap 是最高效的。HashMap 中的item是沒有順序的。 2、具體類LinkedHashMap: LinkedHashMap使用鏈表實現來擴充HashMap類,它支援Map中的item排序。元素既可以按照它們插入圖的順序排序,也可以按照它們被最後一次訪問的順序排序。 3、具體類TreeMap: TreeMap在遍曆排好序的索引值的時候是很高效的。索引值可以使用Comparator介面來排序,也可使用Comparable介面排序。

單元素和不可變的集合和圖

 

Collections類包含了線性表和集合的靜態方法,一些可以建立單元素的Set、List和Map的方法,以及用於建立不可變Set、List和Map的方法。 Collections類中還定義了3個常量:EMPTY_SET、EMPTY_LIST和EMPTY_MAP,分別表示空的規則集、線性表和圖。 方法singleton()用於建立僅包含一個item的不可變Set 方法singletonList()用於建立僅包含一個item的不可變List 方法singletonMap()用於建立僅包含一個單一索引值對的不可變Map Collections類中還提供了6個用於建立唯讀集合的靜態方法: unmodifiableCollection(Collection)、unmodifiableSet(Set)、unmodifiableList(List)、unmodifiableMap(Map)、unmodifiableSortedMap(SortedMap)、unmodifiableSortedSet(SortedSet)

java的集合架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.