1. 程式人生 > >黑馬程式設計師_java基礎_集合框架

黑馬程式設計師_java基礎_集合框架

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------
集合框架


集合框架:

(1)為什麼出現集合類? 面向物件對事物的體現都是以物件的形式,為了方便對多個物件的操作,就對物件進行儲存。 集合就是儲存物件最常用的一種方式. (2)陣列和集合都是容器,兩者有何不同? 陣列長度固定,而集合長度是可變的 陣列值可以儲存物件,還可以儲存基本資料型別;而集合只能儲存物件 陣列儲存資料型別是固定的,而集合儲存的資料型別不固定
(3)集合類的特點: 集合只能儲存物件 集合的長度是可變的 集合可以儲存不同型別的物件 (4)集合類框架(重要!!!要分清幾種容器間的區別): Collection:頂層介面     List:列表,元素是有序的(元素帶角標索引),可以有重複元素,可以有null元素。     ArrayList(JDK1.2):底層的資料結構是陣列資料結構,特點是查詢速度快(因為帶角標),    但是增刪速度稍慢,因為當元素多時,增刪一個元素則所有元素的角標都得改變    執行緒不同步。預設長度是10,當超過長度時,按50%延長集合長度。         LinkedList(JDK1.2):底層資料結構式連結串列資料結構(即後面一個元素記錄前一個),
    特點:查詢速度慢,因為每個元素只知道前面一個元素,但增刪速度快     因為元素再多,增刪一個,只要讓其前後的元素重新相連即可     執行緒是不同步的。      (JDK1.0):底層資料結構是陣列資料結構.特點是查詢和增刪速度都很慢。 預設長度是10,當超過長度時,按100%延長集合長度。 執行緒同步。 (Vector功能跟ArrayList功能一模一樣,已被ArrayList替代)    List使用注意! ArrayList: (1)當往ArrayList裡面存入元素沒什麼要求時,即只要求有序就行時; (2)當往ArrayList裡面存入元素要求不重複時,比如存入學生物件,當同名同姓時
   視為同一個人,則不往裡面儲存。則定義學生物件時,需複寫equals方法
                           public boolean equals(Object obj)
			   {
				if(!(obj instanceof Student))
					return false;
				Student stu = (Student)obj;
				return this.name.equals(stu.name)&&this.age==stu.age;
			   }
  則往ArrayList集合通過add存入學生物件時,集合底層自己會呼叫學生類的equals方法,    判斷重複學生則不存入。  注:對於List集合,無論是add、contains、還是remove方法,判斷元素是否相同,      都是通過複寫equals方法來判斷! LinkedList (1)LinkLedist的特有方法:  boolean offerFirst(E e)  在此列表的開頭插入指定的元素。  boolean offerLast(E e) 在此列表末尾插入指定的元素。  E peekFirst() 獲取但不移除此列表的第一個元素;如果此列表為空,則返回 null。  E peekLast() 獲取但不移除此列表的最後一個元素;如果此列表為空,則返回 null。  E pollFirst() 獲取並移除此列表的第一個元素;如果此列表為空,則返回 null。  E pollLast() 獲取並移除此列表的最後一個元素;如果此列表為空,則返回 null。 (2)通過LinkLedist的特有方法,可以實現某些資料特殊方式的存取,比如堆疊和佇列。 一般情況下,使用哪種List介面下的實現類呢? 如果要求增刪快,考慮使用LinkedList 如果要求查詢快,考慮使用ArrayList 如果要求執行緒安全,考慮使用Vector。 Set:集合,元素是無序的(因為沒有索引),元素不可以重複。可以有null元素。         HashSet(JDK1.2):底層資料結構是雜湊表、存取速度快、元素唯一、執行緒不同步。 保證性元素唯一的原理:  先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是否為true (往HashSet裡面存的自定義元素要複寫hashCode和equals方法,以保證元素的唯一性!) TreeSet:底層資料結構式二叉樹。可以對Set集合中的元素進行排序。元素有序、執行緒不同步。 保證元素唯一性的依據:compareTo方法return 0 TreeSet排序的第一種方式:                          讓元素自身具備比較性,比如八種基本資料型別或則字串,實現Compareble介面,                          覆蓋compareTo方法,此方式是元素的自然順序 TreeSet排序的第一種方式:當元素自身不具備比較性(比如儲存學生物件時)或者具備的 比較性不是我們所需要的比較性時(比如想字串的長度排序),此時就需要讓集合自身具備自定義的比較性。  那如何讓集合自身具備比較性呢?                          可在集合初始化時,就讓集合具備比較方式。即定義一個類, 實現Comparator介面,覆蓋compare方法。 Set集合使用注意事項: (1)HashSet:       通過new的方式往HashSet裡面存的元素的hashCode都不同,但通常我們定義物件,       比如學生物件時,雖然是new的兩個學生物件,但是當他們name和age一樣時,我們認為是       同一個物件,所以為了保證元素的唯一性,我們通常在往HashSet集合裡面儲存元素時,       在定義物件的類中通常複寫hashCode和equals方法。
                   public int hashCode()
			      {
				return name.hashCode()+age*39;
			      }
			      public boolean equals(Object obj)
			      {
				if(!(obj instanceof Student))
					return false;
				Student stu = (Student)obj;
				return this.name.equals(stu.name)&&this.age==stu.age;
			      }
     HashSet是如何保證元素唯一性的呢?       **如果兩元素的hashCode值不同,則不會呼叫equals方法       **如果兩元素的hashCode值相同,則繼續判斷equals是否返回true;       **hashCode和equals方法雖然定義在自定義物件類裡面,但不是我們手動呼叫         而是往HashSet集合裡面儲存元素的時候,集合底層自己呼叫hashCode和equals 它自己拿物件去判斷,自己判斷兩元素是否是同一個元素。 (2)TreeSet:      TreeSet要求往裡面存的元素具備比較性,否則會報錯。      TreeSet排序的第一種方式:讓元素自身具備比較性   定義物件類,實現Compareble介面,複寫compareTo方法,此方式是元素的自然順序
 class Student implements Comparable
  {
private String name;
private int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是學生物件!");
Student stu = (Student)obj;
int num = this.age-stu.age;
if(num==0)
return this.name.compareTo(stu.name);
return num;
}
  }
    TreeSet排序的第一種方式:讓集合具備比較性  當元素自身不具備比較性(比如儲存學生物件時)或者具備的  比較性不是我們所需要的比較性時(比如想字串的長度排序),  此時就需要讓集合自身具備自定義的比較性。   那如何讓集合自身具備比較性呢?可在集合初始化時,  就讓集合具備比較方式。即定義一個類,  實現Comparator介面,覆蓋compare方法。
class StringLengthComparator implements Comparator
 {
public int compare(Object obj1,Object obj2)
{
String s1 = (String)obj1;
String s2 = (String)obj2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);
return num;
}
 }
 class TreeSetTest
 {
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StringLengthComparator());
ts.add("addfg");
ts.add("dfg");
ts.add("agtuug");
ts.add("vgjkg");
sop(ts);
}
 }
基本資料型別或字串物件均實現了Comparable介面,故同種型別基本資料間具備比較性,即自然順序。   Map:頂層介面,該集合儲存的是鍵值對,而且鍵是唯一的,Map和Set很像,Set集合底層就是使用了Map集合。 Map集合沒有迭代器,要取出元素必須先將Map集合轉換成Set集合才能遍歷元素     HashTable(JDK1.0):  底層是雜湊表資料結構; 不可以使用null鍵和null值; 用作鍵的物件必須實現hashCode和equals方法來保證鍵的唯一性 執行緒同步,效率低    HashMap(JDK1.2): 底層是雜湊表資料結構; 允許使用null鍵和null值; 執行緒不同步,效率高; 保證元素唯一性的:  原理:先判斷元素的hashCode值是否相同,再判斷兩元素的equals方法是否為true  (往HashSet裡面存的自定義元素要複寫hashCode和equals方法,  以保證元素的唯一性!)
class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode(){
return name.hashCode()+age*34;
}
@Override
public boolean equals(Object obj){
if(!(obj instanceof Student))
return false;
Student stu = (Student)obj;
return this.name.equals(stu.name)&&this.age==stu.age;
}
public class HashMapDemo1 {
public static void main(String[] args) {
Map<Student , String> hmap = new HashMap<Student , String>();
hmap.put(new Student("001",20), "beijing");
hmap.put(new Student("002",25), "hebei");
hmap.put(new Student("003",50), "hainan");
hmap.put(new Student("001",20), "beijing");
System.out.println(hmap.size());
Set<Student> keySet = hmap.keySet();
Iterator<Student> it = keySet.iterator();
while(it.hasNext()){
Student stu = it.next();
String addr = hmap.get(stu);
System.out.println(stu.getName()+".."+stu.getAge()+"::"+addr);
} 
} 
} 


 TreeMap(JDK1.0): 底層是二叉樹結構; 允許使用null鍵和null值; 執行緒不同步; 可以給Map集合中的鍵進行排序. TreeMap排序的第一種方式:讓元素自身具備比較性,比如八種基本資料型別或則字串,  實現Compareble介面,覆蓋compareTo方法,  此方式是元素的自然順序  TreeMap排序的第一種方式:當元素自身不具備比較性(比如儲存學生物件時)或者具備的  比較性不是我們所需要的比較性時(比如想字串的長度排序),  此時就需要讓集合自身具備自定義的比較性。   那如何讓集合自身具備比較性呢?可在集合初始化時,  就讓集合具備比較方式。即定義一個類,  實現Comparator介面,覆蓋compare方法。
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Student stu) {
int num = new Integer(this.age).compareTo(new Integer(stu.age));
if(num==0)
return this.name.compareTo(stu.name);
return num;
} 
}

public class HashMapDemo1 {
public static void main(String[] args) {
Map<Student , String> tmap = new TreeMap<Student , String>();
tmap.put(new Student("001",20), "beijing");
tmap.put(new Student("002",25), "hebei");
tmap.put(new Student("003",50), "hainan");
tmap.put(new Student("001",20), "beijing");
System.out.println(tmap.size());
Set<Student> keySet1 = tmap.keySet();
Iterator<Student> it1 = keySet1.iterator();
while(it1.hasNext()){
Student stu = it1.next();
String addr = tmap.get(stu);
System.out.println(stu.getName()+".."+stu.getAge()+"::"+addr);
}
}
}
  Iterator:對collection進行迭代的迭代器.迭代器取代了Enumeration。 迭代器和列舉的區別: 迭代器允許呼叫者利用定義良好的語義在迭代期間從迭代器所指向的collection移除元素 方法名稱得到了改進,簡化書寫    LisIterator:系列表迭代器,允許程式設計師按任一方向遍歷列表、迭代期間修改列表   Comparable:此介面強行對實現它的每個類的物件進行整體自然排序。使元素具備比較性   Comparator:強行對某個物件collection進行整體排序的比較函式,使集合具備比較性   Collections:此類完全由在 collection 上進行操作或返回 collection 的靜態方法組成。   Arrays:此類包含用來運算元組(比如排序和搜尋)的各種靜態方法 7、集合類各容器方法:   介面Collection方法摘要(沒有構造方法) a)新增: i.  boolean add(E e) j.  boolean addAll(Collection c) b)刪除: i.  void clear():清空容器 j.  boolean remove(Objec object): k.  boolean removeAll(Collection c): c)判斷: i.  boolean contains(Object object):判斷是否包含此元素 j.  boolean containsAll(Collection c):判斷是否包含一堆元素 k.  boolean equals(Object object):比較此collection與指定物件是否相等 m.  boolean isEmpty():判斷是否集合為空 d)獲取: h.  Iterator iterator():取出 i.  int hashCode():返回此collection的雜湊值 j.  int size():返回此collection中元素的個數 k.  boolean retainAll(Collection c):取交集 m.  Object toArray():返回此collection中所有元素的陣列 n.  T[] toArray(T[] a):返回包含此collection中所有元素的數值。 *****List集合子類及其方法 (1)List介面是Collection介面的一個子介面。 (2)List介面中的元素有如下特點(對角標的操作都是特有方法,因為有序): A:元素有序(儲存順序和取出順序一致) B:元素可以重複 (3)List介面中的特有方法 A:add(int index,Object obj):在指定位置加入元素 B:remove(int index):移除指定位置的元素 C:set(int index,Object obj):修改指定位置的元素 D:get(int index):獲取指定位置的元素 E:indexOf(Object obj):獲取指定元素的位置 F:subList(int start,int end):從一個大的List中擷取一個小的List G:listIterator():返回一個List介面特有的迭代器 (1)、ArrayList:     |--->構造方法摘要:(少用,不是重點) ArrayList():構造一個初始容量為 10 的空列表。 ArrayList(Collection<? extends E> c): 構造一個包含指定 collection 的元素的列表,    ArrayList(int initialCapacity): 構造一個具有指定初始容量的空列表。     |--->方法摘要: |--->新增: boolean add(E e): 將指定的元素新增到此列表的尾部。 void add(int index, E element): 將指定的元素插入此列表中的指定位置。 boolean addAll(Collection<? extends E> c):按照指定 collection 的迭代器所返回的元素順序,  將該 collection 中的所有元素新增到此列表的尾部  boolean addAll(int index, Collection<? extends E> c): 從指定的位置開始,將指定 collection        中的所有元素插入到此列表中。  |--->刪除: void clear(): 移除此列表中的所有元素。 E remove(int index): 移除此列表中指定位置上的元素。  boolean remove(Object o): 移除此列表中首次出現的指定元素(如果存在)。 protected  void removeRange(int fromIndex, int toIndex):  移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。 boolean removeAll(Collection<?> c): 從列表中移除指定 collection 中包含的其所有元素  |--->獲取: E get(int index): 返回此列表中指定位置上的元素。 int indexOf(Object o): 返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。 int lastIndexOf(Object o) 返回此列表中最後一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。    public List<E> subList(int fromIndex,int toIndex): 返回列表中指定的 fromIndex(包括 )   和 toIndex(不包括)之間的部分檢視。 Iterator<E> iterator(): 返回按適當順序在列表的元素上進行迭代的迭代器。 ListIterator<E> listIterator(int index):返回列表中元素的列表迭代器(按適當順序),從列表的指定位置開始。 |--->修改:(特有方法!!) E set(int index, E element): 用指定的元素替代此列表中指定位置上的元素。  (2)LinkedList: |--->構造方法摘要: LinkedList(): 構造一個空列表。  LinkedList(Collection<? extends E> c): 構造一個包含指定 collection 中的元素的列表,        這些元素按其 collection 的迭代器返回的順序排列。 |--->方法摘要:(特有的) |--->新增 void addFirst(E e): 將指定元素插入此列表的開頭。  void addLast(E e): 將指定元素新增到此列表的結尾。  |--->獲取元素,但不刪除元素  E get(int index): 返回此列表中指定位置處的元素。             E getFirst(): 返回此列表的第一個元素。            E getLast(): 返回此列表的最後一個元素。 |--->獲取元素且刪除元素  E remove(): 獲取並移除此列表的頭(第一個元素)。            E remove(int index): 移除此列表中指定位置處的元素。           boolean remove(Object o): 從此列表中移除首次出現的指定元素(如果存在)。           E removeFirst(): 移除並返回此列表的第一個元素。   E removeLast(): 移除並返回此列表的最後一個元素。 |--->修改  E set(int index, E element) 將此列表中指定位置的元素替換為指定的元素。  (3)Vector |--->構造方法摘要: Vector(): 構造一個空向量,使其內部資料陣列的大小為 10,其標準容量增量為零。           Vector(Collection<? extends E> c):  構造一個包含指定 collection 中的元素的向量,     這些元素按其 collection 的迭代器返回元素的順序排列。 |--->方法摘要: |--->新增: boolean add(E e): 將指定元素新增到此向量的末尾。 void add(int index, E element): 在此向量的指定位置插入指定的元素。          boolean addAll(Collection<? extends E> c):  將指定 Collection 中的所有元素新增到此向量的末尾,   按照指定 collection 的迭代器所返回的順序新增這些元素。  boolean addAll(int index, Collection<? extends E> c): 在指定位置將指定 Collection 中的所有元素插入到此向量中。 |--->獲取: Enumeration<E> elements(): 返回此向量的元件的列舉。    Vector特有的取出方式:    列舉和迭代器很像,其實列舉和迭代器是一樣的,只是因為列舉的名稱和方法的名稱    名字都過長,所以列舉被迭代器取代了。 |--->列舉Enumeration的方法摘要:  boolean hasMoreElements(): 測試此列舉是否包含更多的元素。   E nextElement(): 如果此列舉物件至少還有一個可提供的元素,   則返回此列舉的下一個元素。  *****Set集合子類及其方法 (1)HashSet:它不保證set的迭代順序;特別是它不保證該順序恆久不變.此類允許使用null元素。  |--->構造方法: HashSet() 構造一個新的空 set,其底層 HashMap 例項的預設初始容量是 16,載入因子是 0.75。 HashSet(Collection<? extends E> c) 構造一個包含指定 collection 中的元素的新 set。 |--->方法摘要: boolean add(E e) 如果此 set 中尚未包含指定元素,則新增指定元素。    void clear() 從此 set 中移除所有元素。   Object clone() 返回此 HashSet 例項的淺表副本:並沒有複製這些元素本身。    boolean contains(Object o) 如果此 set 包含指定元素,則返回 true。    boolean isEmpty() 如果此 set 不包含任何元素,則返回 true。    Iterator<E> iterator() 返回對此 set 中元素進行迭代的迭代器。    boolean remove(Object o) 如果指定元素存在於此 set 中,則將其移除。    int size() 返回此 set 中的元素的數量(set 的容量)。  

相關推薦

黑馬程式設計師_java基礎_集合框架

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>

黑馬程式設計師----Java基礎集合類(一)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師_java基礎——異常及遞迴

黑馬程式設計師------- android培訓、java培訓、期待與您交流! ---------- 1:異常 (1)程式出現的不正常情況。(2)異常的體系結構:Throwable:Error:是嚴重的問題。比如記憶體溢位等。要改程式碼。Exception:非Runt

黑馬程式設計師_java基礎加強學習筆記之註解

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j

黑馬程式設計師_Java基礎(Java概述,關鍵字,識別符號,註釋,常量,變數

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 人生沒有選擇題,只有證明題,每天都在奮鬥的

黑馬程式設計師_Java高新技術_反射

Field fieldX=pt1.getClass().getDeclaredField("x");//x是私有的不可見的用該方法獲得field物件 //暴力反射 fieldX.setAccessible(true);//因為x是私有的不可以直接訪問,設定為可訪問的成員方法的反射 Method 類代表某個類中

黑馬程式設計師_java基礎知識二

---------------------android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------------- 今天是來傳智學習上式上課的第四天了,從開學的第一天開始,主要安排的內容都是java基礎入門的一些知識,因為來學習的

黑馬程式設計師_java基礎學習筆記之(建構函式&構造程式碼塊&靜態程式碼塊)的區別

在基礎學習中,我常常會概念模糊,特作此學習筆記,進行一下對比,思路自然就清晰了。 建構函式 建構函式定義:建構函式是與類名相同,但沒有返回值的函式。 例子: class Person {     //建構函式     public Person() {} } 作用:

黑馬程式設計師__JAVA基礎__集合(一)

------------android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------ 1.概述     面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行儲存,集合就是儲存物件最常用的一種方式。  

黑馬程式設計師----JAVA基礎集合框架_迭代器

------ android培訓、java培訓、期待與您交流! ----------  個人認為總的來說,map不是地圖是對映的意思,所以裡面是鍵值成對存在的,list的清單的意思,所以裡面是一項一項列出來的,set是集合的意思,所以裡面不能有重複的(數學裡面的集合

黑馬程式設計師-----Java基礎-----集合框架詳解

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 經常會看到程式中使用了記錄集,常用的有

黑馬程式設計師----java基礎-------集合框架

      List 集合特有的迭代器,List Iterator是Iterator的子介面。       在迭代時,不可以通過集合物件的方法操作集合中的元素。       因為會發生ConcurrentModificationException異常。       class linkedlist Demo

黑馬程式設計師——Java基礎->集合框架

——Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ——- 為什麼出現集合類? • 面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多 個物件的操作,就對物件進行儲存,集合就是儲存物件最常用的一 種方式。 陣列和集合

黑馬程式設計師——java基礎之string及集合

<span style="font-family:SimSun;font-size:18px;">class TreeSetDemo { public static void main(String[] args) { TreeSet ts = new TreeSet(); ts.

黑馬程式設計師--Java基礎--集合(一)

------- android培訓、java培訓、期待與您交流! ---------- 第一部分:集合框架概述 集合的由來:物件用於封裝特有資料,物件多了需要儲存;如果物件的個數不確定,就使用集合容器進行儲存。 Java中有兩種儲存物件:陣列和集合。 它們的區別在於:

黑馬程式設計師——OC基礎---Foundation框架之結構體

一、概述 Foundation—基礎框架。框架中包含了很多開發中常用的資料型別,如結構體,列舉,類等,是其他ios框架的基礎。 如果要想使用foundation框架中的資料型別,那麼包含它的主標頭檔案就可以了。 即#import #import &l

黑馬程式設計師————C語言_基礎知識整理(一)

任何一個C語言程式都是由一個或多個程式段(小程式)構成的,每個程式都有自己的功能,我們一般稱這些程式段為“函式” C程式的結構:由函式構成 一、unix指令 /* ls -l 列出當前目錄下的所需內容 pwd 顯示當前目錄的名稱

黑馬程式設計師_java語言基礎組成

二、java語言基礎組成 1   關鍵字       其實就是某一個計算機語言對指定的單詞賦予了特殊的含義。        特點:體現上都是英文小寫。 2   識別符號       就是在程式中起的名字。       包含:0~9,a~z,$,_。        注意:1

黑馬程式設計師——java基礎——集合

------- android培訓、java培訓、期待與您交流! ---------- 面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,Java就提供了集合類。 集合的繼承

黑馬程式設計師——Java基礎--集合(一)

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 第一講 集合的基本知識 一、概述         我們學習的是面向物件的語言,而面向物件的語言對事物的表述都是通過物件體現的。那麼為了方便的操作多個多個