Java集合體系介紹

Collection(單列集合頂層接口)
一、Collection接口
1、集合與數組的特點
集合:a、長度可變;b、只能儲存引用數據類型;c、同一個集合中可以存儲多種數據類型
數組:a、長度不可變;b、可以存儲基本數據類型和引用數據類型;c、同一個數組只能存儲一種數據類型。
2、集合的體系結構圖
a、單例集合體系圖
(頂層)Collection(接口)—List(接口) —ArrayList(集合:底層使用長度可變的數組數組數據結構,特點查詢速度快但增刪元素慢,線程不安全,效率高)
—Vector(底層使用數組數據結構,線程安全,效率低,被ArrayList取代)
—LinkList( 底層使用鏈表數據結構,特點增刪快,查詢稍慢,線程不安全,效率高)
—set(接口) —HashSet(集合,底層數據結構是Hash表,線程是非同步的。)
—TreeSet(集合,底層是二叉樹數據結構)

3、Collection接口中的功能概述
a、添加元素
boolean add( Object obj );//添加一個元素
boolean addAll( Collection c )//一個集合的所有元素
b、刪除元素
void clear( );//清空集合
boolean remove ( Object obj )//刪除集合中的指定元素
boolean removeAll( Collection c)//從集合中刪除一個指定的集合元素
c、判斷功能
boolean isEmpty ( );//判斷集合是否爲空
boolean contains( Object obj );//判斷集合是否包含指定的元素
boolean containsAll( Collection c );//判斷集合中是否存在指定的一個集合中的元素
d、遍歷集合
Iterator iterator( ); //就是獲取集合中的每個元素,別名迭代器。
集合的使用步驟

A:創建集合對象
B:創建元素對象
C:向集合中添加數據add()
D:遍歷集合
1 通過集合對象獲取迭代器對象iterator()//注當獲取到集合的最後一個元素,他又繼續獲取元素就會報出異常NoSuchElementException。
2 通過hasNext()方法進行判斷指針後是否有下一個元素
3 通過next()方法獲取到指針後的下一個元素
e、長度功能
int size( );//獲取集合的長度
f、交集功能
boolean retainAll( Collection c );//僅保留此 collection 中那些也包含在指定 collection 的元素。

二、Collection接口的子接口List
一、list藉口特點:
1、 元素是有序的,元素可以重複,因爲該集合體繫有索引。
2、List接口的特有功能
a、添加功能
void add( int index,Object obj);//向集合指定位置添加元素
b、刪除功能
Object remove( int index );//刪除集合中指定所引出的元素,返回被刪除的元素值。
c、修改功能
Object set( int index ,Object obj );//用指定的元素替換指定索引位置的值返回被替換的元素值。
d、獲取功能
Object get( int index );//獲取集合指定索引處的值。
int indexOf( Object obj );//獲取指定元素在集合中的第一次出現的索引。
ListIterator listIterator( );//列表迭代器
e、截取功能
List subList( int formIndex, int toIndex);//獲取集合從指定位置開始到指定位置結束,返回截取出來的集合。
3、併發修改異常的產生和解決方案//遍歷集合時,改變了集合的元素
a:併發修改時怎樣產生的呢?
當我們通過迭代器迭代元素的過程中,又通過集合添加了元素。這種情況是不允許的。因爲迭代器是依賴於集合存在的,如果集合發生了改變,迭代器也應該相應的發生改變。而現在迭代器沒有改變,但集合發生了改變,所以報出了併發修改異常。
b:解決方案
注意問題:通過迭代器遍歷集合的時候,是不能通過集合去操作(添加、刪除)。
1、全部通過迭代器操作,
代碼:
ListIterator lit = list.listIterator();
while ( lit.hasNext()) {
String s = (String) lit.next();
if ( “hello”.equals( s)) {
lit.add(“IOS”);//全部通過迭代器操作:元素是添加到剛遍歷的那個元素後面。
}
}
2、全部通過集合操作:
代碼:
for ( int x = 0; x < list.size(); x++) {
String s = (String) list.get( x);
if ( “hello”.equals( s)) {
list.add(“IOS”);//元素是添加到最後的。
}
}
二、ArrayList概述
ArrayList是List接口的一個實現類,在它內部封裝了一個長度可變的數組對象。其大部分的方法是從其父類中繼承過來的。
三、Vector集合的方法已經被ArrayList方法所取代了。
Vector的特有功能:

  • A:添加功能
  •       public void addElement(Object obj)       --     add(Object obj)
    
  • B:獲取功能
  •       public Object elementAt(int index)        --     get(int index)
    
  •       public Enumeration elements()              --     Iterator
    
  •                 boolean hasMoreElements()        --     hasNext()
    
  •                 Object nextElement()                  --  next()
    
  • C:長度功能
  •       public int size()
    

四、LinkedList
1、概述:LinkedList集合內部維護了一個雙向循環鏈表,鏈表中的每個元素都使用引用的方式來記住它的前一個元素和後一個元素,從而可以將所有元素彼此連接起來。
2、特有方法
A:添加元素
void addFirst(Object obj );//向集合的開始位置添加元素。
void addLast( Object obj )//向集合的末尾位置添加元素。
B: 獲取功能
Object getFirst();//獲取集合中的第一個元素
Object getLast();//獲取集合中最後一個元素
C:刪除功能
Object removeFirst();//刪除集合中第一個元素
Object removeLast();//刪除集合中最後一個元素
三、Collection接口的另一個子接口set
一Set接口簡介
Set接口繼承自Collection接口,它與Collection接口中的方法基本一致,沒有對Collection接口進行功能上擴充,但Set接口中的元素是無序的,並且都會以某種規則保證存入的元素不重複出現。
二、Set接口有兩個實現類
分別是:HashSet和TreeSet。
其中:HashSet是根據對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。
TreeSet則是以二叉樹的方式來存儲元素,它可以實現對集合中的元素進行排序。
三、HashSet集合
1、當向HashSet集合中添加元素時,首先會調用該對象的hashCode()方法來確定元素的存儲位置,然後再調用對象的equals()方法來確保該位置沒有重複元素。
2、Set集合和List集合存取元素的方式一樣,存add(),取採用迭代器或增強for循環。
3、當向集合中存入元素時,爲了保證HashSet正常工作,要求在存入對象時,重寫該類中的hashCode()和equals()方法。
複寫: hashCode()方法
public int hashCode()

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

複寫:equals(Object obj)方法
public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Student other = (Student) obj;

if (age != other.age)

return false;

if (name == null) {

if (other.name != null)

return false;

} else if (!name.equals(other.name))

return false;

return true;

}
四、TreeSet集合

1、TreeSet集合中沒有重複的元素,並且可以對元素進行排序。
2、那麼,Treeset是如何存儲數據的呢?
A:把第一個存儲進去的數據作爲根節點
B:把數據依次和根節點進行比較
比較得到正數往右放
比較得到負數向左放
如果比較得到相等的數,把後來的數據扔掉
從二叉樹結構中取數據的內存規則
原則:從每個節點的左邊開始,遵循原則 左 中 右

3、TreeSet保證元素排序有兩種方式:
A:自然排序 讓對象所屬的類去實現Comparable接口。並重寫接口中的compareTo方法。
public int compareTo( Studetn s )
{
//需求是比較年齡
int num = this.age - s.age ;
//當某一個相同的時候,你還需要判斷其他的是不是也是相同的。
int num2 = ( num == 0 ) ? ( this.name.compareTo( s.name ) ) : num ;
return num2;
}

按照年齡從小到大排序 this.age - s.age ;
按照年齡從大到小排序 s.age - this.age;
B:比較器接口 Comparator。帶參構造。(匿名內部類)
定義一個MyComparator類實現Comparator接口,並在compare()方法中實現元素的比較,這就相當於定義了一個比較器。

class MyComparator implements Comparator{

public int compare(Student s1,Student s2){

int num = s1.getName().length() - s2.getName().length();

int num1 = ( num == 0) ? (s1.getName().compareTo( s2.getName())) : num;

int num2 = ( num1 == 0) ? ( s1.getAge() - s2.getAge()) : num1;

return num2 ;
}

}
在內部類中實現比較器:
TreeSet
ts = new TreeSet( new Comparator() {

@Override

public int compare(Student s1, Student s2) {

int num = s1.getName().length() - s2.getName().length();

int num1 = ( num == 0) ? (s1.getName().compareTo( s2.getName())): num;

int num2 = ( num1 == 0) ? ( s1.getAge() - s2.getAge()) : num1;

return num2;
}
} );

Map接口(雙列集合的頂層接口)

1、Map接口概述
Map接口是存儲雙列集合,鍵值成對出現且,一一對應,鍵的值必須唯一,值可以重複。
2、Map功能概述
A:增加功能。
V put(K key, V value)
向集合中添加鍵值對
如果該鍵存在,則返回被替換的值
如果該鍵不存在則直接添加返回null

B:刪除功能。
void clear()
清空集合中所有數據

V remove( Object key )
根據鍵刪除鍵值對元素

C:判斷功能。
boolean containsKey( Object key )
判斷集合中是否包含指定的鍵

boolean containsValue( Object value )
判斷集合中是否包含指定的值

boolean isEmpty()
判斷集合是否爲空

D:獲取功能。
Set<Map.Entry<K,V>> entrySet()
獲取鍵值對兒對象的集合

Object get( Object key )
根據鍵獲取值

Set keySet():
獲取集合中所有鍵的Set集合

Collection values()
獲取集合中所有值的集合

E:長度功能。
int size()
獲取集合的長度
3、Map三個子實現類
A: HashMap:底層是哈希表數據結構,允許使用null鍵和null值,該集合是不同步的。
B: Hashtable: 底層是哈希表數據結構,不可以存入null鍵和null值,該集合是線程同步的。
C: TreeMap:底層是二叉樹結構,線程不同步,可以用於給Map集合中的鍵進行排序,和set集合很像,set集合底層就是使用了Map集合。

4、Map集合中元素的兩種取出方式
a: Set keySet()方法,將map集合中所有的鍵存入到set集合中,因爲set集合具有迭代器,所以可以用迭代的方法,取出所有的鍵(增強for(){ }循環),再根據 Object get(Object key)方法,獲取每個鍵所對應的值,
b:Set<Map.Entry<K,V>> entrySet() 方法,將map集合中的映射關係存入到set集合中,而這個關係的數據類型就是Map.Entry<K,V>,然後使用增強for(){ }循環遍歷,再使用Map.Entry<K,V>接口的getKey()和getValue(0方法獲取鍵和值。
5、HashMap和TreeMap集合
a:HashMap集合存儲自定義對象做鍵,要重寫hashCode()方法和equals()方法,因爲如果用自定義對象當做鍵的話,要保持元素的唯一性(因爲鍵是唯一的)。
b:TreeMap集合存儲自定義對象做鍵,要做一下操作:
實現排序方式一:讓對象所屬的類去實現Comparable接口
實現排序方式二:用TreeMap的帶參構造,在參數位置接收 Comparator 接口對象.
6、HashMap和Hashtable的區別
A:HashMap 線程不安全,效率高.允許鍵和值爲null.
B:Hashtable線程安全,效率低,不允許鍵和值爲null。
Collection(單列集合頂層接口)

一、Collection接口
1、集合與數組的特點
集合:a、長度可變;b、只能儲存引用數據類型;c、同一個集合中可以存儲多種數據類型
數組:a、長度不可變;b、可以存儲基本數據類型和引用數據類型;c、同一個數組只能存儲一種數據類型。
2、集合的體系結構圖
a、單例集合體系圖
(頂層)Collection(接口)—List(接口) —ArrayList(集合:底層使用長度可變的數組數組數據結構,特點查詢速度快但增刪元素慢,線程不安全,效率高)
—Vector(底層使用數組數據結構,線程安全,效率低,被ArrayList取代)
—LinkList( 底層使用鏈表數據結構,特點增刪快,查詢稍慢,線程不安全,效率高)
—set(接口) —HashSet(集合,底層數據結構是Hash表,線程是非同步的。)
—TreeSet(集合,底層是二叉樹數據結構)

3、Collection接口中的功能概述
a、添加元素
boolean add( Object obj );//添加一個元素
boolean addAll( Collection c )//一個集合的所有元素
b、刪除元素
void clear( );//清空集合
boolean remove ( Object obj )//刪除集合中的指定元素
boolean removeAll( Collection c)//從集合中刪除一個指定的集合元素
c、判斷功能
boolean isEmpty ( );//判斷集合是否爲空
boolean contains( Object obj );//判斷集合是否包含指定的元素
boolean containsAll( Collection c );//判斷集合中是否存在指定的一個集合中的元素
d、遍歷集合
Iterator iterator( ); //就是獲取集合中的每個元素,別名迭代器。
集合的使用步驟

A:創建集合對象
B:創建元素對象
C:向集合中添加數據add()
D:遍歷集合
1 通過集合對象獲取迭代器對象iterator()//注當獲取到集合的最後一個元素,他又繼續獲取元素就會報出異常NoSuchElementException。
2 通過hasNext()方法進行判斷指針後是否有下一個元素
3 通過next()方法獲取到指針後的下一個元素
e、長度功能
int size( );//獲取集合的長度
f、交集功能
boolean retainAll( Collection c );//僅保留此 collection 中那些也包含在指定 collection 的元素。

二、Collection接口的子接口List
一、list藉口特點:
1、 元素是有序的,元素可以重複,因爲該集合體繫有索引。
2、List接口的特有功能
a、添加功能
void add( int index,Object obj);//向集合指定位置添加元素
b、刪除功能
Object remove( int index );//刪除集合中指定所引出的元素,返回被刪除的元素值。
c、修改功能
Object set( int index ,Object obj );//用指定的元素替換指定索引位置的值返回被替換的元素值。
d、獲取功能
Object get( int index );//獲取集合指定索引處的值。
int indexOf( Object obj );//獲取指定元素在集合中的第一次出現的索引。
ListIterator listIterator( );//列表迭代器
e、截取功能
List subList( int formIndex, int toIndex);//獲取集合從指定位置開始到指定位置結束,返回截取出來的集合。
3、併發修改異常的產生和解決方案//遍歷集合時,改變了集合的元素
a:併發修改時怎樣產生的呢?
當我們通過迭代器迭代元素的過程中,又通過集合添加了元素。這種情況是不允許的。因爲迭代器是依賴於集合存在的,如果集合發生了改變,迭代器也應該相應的發生改變。而現在迭代器沒有改變,但集合發生了改變,所以報出了併發修改異常。
b:解決方案
注意問題:通過迭代器遍歷集合的時候,是不能通過集合去操作(添加、刪除)。
1、全部通過迭代器操作,
代碼:
ListIterator lit = list.listIterator();
while ( lit.hasNext()) {
String s = (String) lit.next();
if ( “hello”.equals( s)) {
lit.add(“IOS”);//全部通過迭代器操作:元素是添加到剛遍歷的那個元素後面。
}
}
2、全部通過集合操作:
代碼:
for ( int x = 0; x < list.size(); x++) {
String s = (String) list.get( x);
if ( “hello”.equals( s)) {
list.add(“IOS”);//元素是添加到最後的。
}
}
二、ArrayList概述
ArrayList是List接口的一個實現類,在它內部封裝了一個長度可變的數組對象。其大部分的方法是從其父類中繼承過來的。
三、Vector集合的方法已經被ArrayList方法所取代了。
Vector的特有功能:

  • A:添加功能
  •       public void addElement(Object obj)       --     add(Object obj)
    
  • B:獲取功能
  •       public Object elementAt(int index)        --     get(int index)
    
  •       public Enumeration elements()              --     Iterator
    
  •                 boolean hasMoreElements()        --     hasNext()
    
  •                 Object nextElement()                  --  next()
    
  • C:長度功能
  •       public int size()
    

四、LinkedList
1、概述:LinkedList集合內部維護了一個雙向循環鏈表,鏈表中的每個元素都使用引用的方式來記住它的前一個元素和後一個元素,從而可以將所有元素彼此連接起來。
2、特有方法
A:添加元素
void addFirst(Object obj );//向集合的開始位置添加元素。
void addLast( Object obj )//向集合的末尾位置添加元素。
B: 獲取功能
Object getFirst();//獲取集合中的第一個元素
Object getLast();//獲取集合中最後一個元素
C:刪除功能
Object removeFirst();//刪除集合中第一個元素
Object removeLast();//刪除集合中最後一個元素
三、Collection接口的另一個子接口set
一Set接口簡介
Set接口繼承自Collection接口,它與Collection接口中的方法基本一致,沒有對Collection接口進行功能上擴充,但Set接口中的元素是無序的,並且都會以某種規則保證存入的元素不重複出現。
二、Set接口有兩個實現類
分別是:HashSet和TreeSet。
其中:HashSet是根據對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。
TreeSet則是以二叉樹的方式來存儲元素,它可以實現對集合中的元素進行排序。
三、HashSet集合
1、當向HashSet集合中添加元素時,首先會調用該對象的hashCode()方法來確定元素的存儲位置,然後再調用對象的equals()方法來確保該位置沒有重複元素。
2、Set集合和List集合存取元素的方式一樣,存add(),取採用迭代器或增強for循環。
3、當向集合中存入元素時,爲了保證HashSet正常工作,要求在存入對象時,重寫該類中的hashCode()和equals()方法。
複寫: hashCode()方法
public int hashCode()

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

複寫:equals(Object obj)方法
public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Student other = (Student) obj;

if (age != other.age)

return false;

if (name == null) {

if (other.name != null)

return false;

} else if (!name.equals(other.name))

return false;

return true;

}
四、TreeSet集合

1、TreeSet集合中沒有重複的元素,並且可以對元素進行排序。
2、那麼,Treeset是如何存儲數據的呢?
A:把第一個存儲進去的數據作爲根節點
B:把數據依次和根節點進行比較
比較得到正數往右放
比較得到負數向左放
如果比較得到相等的數,把後來的數據扔掉
從二叉樹結構中取數據的內存規則
原則:從每個節點的左邊開始,遵循原則 左 中 右

3、TreeSet保證元素排序有兩種方式:
A:自然排序 讓對象所屬的類去實現Comparable接口。並重寫接口中的compareTo方法。
public int compareTo( Studetn s )
{
//需求是比較年齡
int num = this.age - s.age ;
//當某一個相同的時候,你還需要判斷其他的是不是也是相同的。
int num2 = ( num == 0 ) ? ( this.name.compareTo( s.name ) ) : num ;
return num2;
}

按照年齡從小到大排序 this.age - s.age ;
按照年齡從大到小排序 s.age - this.age;
B:比較器接口 Comparator。帶參構造。(匿名內部類)
定義一個MyComparator類實現Comparator接口,並在compare()方法中實現元素的比較,這就相當於定義了一個比較器。

class MyComparator implements Comparator{

public int compare(Student s1,Student s2){

int num = s1.getName().length() - s2.getName().length();

int num1 = ( num == 0) ? (s1.getName().compareTo( s2.getName())) : num;

int num2 = ( num1 == 0) ? ( s1.getAge() - s2.getAge()) : num1;

return num2 ;
}

}
在內部類中實現比較器:
TreeSet
ts = new TreeSet( new Comparator() {

@Override

public int compare(Student s1, Student s2) {

int num = s1.getName().length() - s2.getName().length();

int num1 = ( num == 0) ? (s1.getName().compareTo( s2.getName())): num;

int num2 = ( num1 == 0) ? ( s1.getAge() - s2.getAge()) : num1;

return num2;
}
} );

Map接口(雙列集合的頂層接口)

1、Map接口概述
Map接口是存儲雙列集合,鍵值成對出現且,一一對應,鍵的值必須唯一,值可以重複。
2、Map功能概述
A:增加功能。
V put(K key, V value)
向集合中添加鍵值對
如果該鍵存在,則返回被替換的值
如果該鍵不存在則直接添加返回null

B:刪除功能。
void clear()
清空集合中所有數據

V remove( Object key )
根據鍵刪除鍵值對元素

C:判斷功能。
boolean containsKey( Object key )
判斷集合中是否包含指定的鍵

boolean containsValue( Object value )
判斷集合中是否包含指定的值

boolean isEmpty()
判斷集合是否爲空

D:獲取功能。
Set<Map.Entry<K,V>> entrySet()
獲取鍵值對兒對象的集合

Object get( Object key )
根據鍵獲取值

Set keySet():
獲取集合中所有鍵的Set集合

Collection values()
獲取集合中所有值的集合

E:長度功能。
int size()
獲取集合的長度
3、Map三個子實現類
A: HashMap:底層是哈希表數據結構,允許使用null鍵和null值,該集合是不同步的。
B: Hashtable: 底層是哈希表數據結構,不可以存入null鍵和null值,該集合是線程同步的。
C: TreeMap:底層是二叉樹結構,線程不同步,可以用於給Map集合中的鍵進行排序,和set集合很像,set集合底層就是使用了Map集合。

4、Map集合中元素的兩種取出方式
a: Set keySet()方法,將map集合中所有的鍵存入到set集合中,因爲set集合具有迭代器,所以可以用迭代的方法,取出所有的鍵(增強for(){ }循環),再根據 Object get(Object key)方法,獲取每個鍵所對應的值,
b:Set<Map.Entry<K,V>> entrySet() 方法,將map集合中的映射關係存入到set集合中,而這個關係的數據類型就是Map.Entry<K,V>,然後使用增強for(){ }循環遍歷,再使用Map.Entry<K,V>接口的getKey()和getValue(0方法獲取鍵和值。
5、HashMap和TreeMap集合
a:HashMap集合存儲自定義對象做鍵,要重寫hashCode()方法和equals()方法,因爲如果用自定義對象當做鍵的話,要保持元素的唯一性(因爲鍵是唯一的)。
b:TreeMap集合存儲自定義對象做鍵,要做一下操作:
實現排序方式一:讓對象所屬的類去實現Comparable接口
實現排序方式二:用TreeMap的帶參構造,在參數位置接收 Comparator 接口對象.
6、HashMap和Hashtable的區別
A:HashMap 線程不安全,效率高.允許鍵和值爲null.
B:Hashtable線程安全,效率低,不允許鍵和值爲null。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章