Java集合詳解(二)
ArrayList,LinkedList,Vector的常用方法
ArrayList:
add(Object element): 向列表的尾部新增指定的元素。
clear() :從列表中刪除所有元素。
contains(Object o) :如果此列表包含指定的元素,則返回 true 。
get(int index) 返回此列表中指定位置的元素。
isEmpty() :如果此列表不包含元素,則返回 true 。
iterator() :以正確的順序返回該列表中的元素的迭代器。
remove(int index) :刪除該列表中指定位置的元素。
toArray() :以正確的順序(從第一個到最後一個元素)返回一個包含此列表中所有元素的陣列。
LinkedList:
新增:
public void addFirst(Object e):將該元素新增到列表的開頭!
public void addLast(Object e):將該元素新增到列表的末尾!
刪除:
public Object removeFirst():刪除列表第一個
public Object removeLast():刪除列表最後一個
獲取:
public Object getFirst():獲取第一個
public Object getLast() :獲取第二個
Vector集合:底層陣列結構,查詢快,增刪慢執行緒安全的----同步的----執行效率低!
特有功能:
public void add(int index, E element):插入元素
public Enumeration<Object> elements()--- 相當於:Iterator iterator()
public Object elementAt(int index):通過角標獲取指定的元素
elementAt()+size() :vector的普通for遍歷方式
Vector集合特有的遍歷方式:
1.boolean hasMoreElements():判斷是否有下一個元素
2.Object nextElement():獲取一個元素
import java. util. Enumeration;
import java. util. Vector;
public class VectorDemo {
public static void main ( String[ ] args) {
Vector< String> v = new Vector < String> ( ) ;
v. add ( "1" ) ;
v. add ( "2" ) ;
v. add ( "3" ) ;
v. add ( "4" ) ;
v. add ( "5" ) ;
Enumeration< String> elements = v. elements ( ) ;
while ( elements. hasMoreElements ( ) ) {
String nextElement = elements. nextElement ( ) ;
System. out. println ( nextElement) ;
}
}
}
Set集合的特點:
Set集合的特點:元素是不重複的,無序的!
Set集合的子實現類:
TreeSet
HashSet
LInkedHashSet
TreeSet集合
1.TreeSet:基於TreeMap實現,TreeMap本質就是紅黑樹。所以TreeSet其實於是基於紅黑樹的。
2.有兩種排序方式:自然排序和選擇器排序
排序方式取決於建立當前Set集合物件的時候的構造方法
TreeSet集合無參構造方法:public TreeSet()---預設的自然順序排序
TreeSet集合有參構造方法:public TreeSet(Comparator<? super E> comparator)---選擇器排序
注意事項:
1.使用TreeSet集合儲存自定義物件,要進行自然排序,該自定義物件所在的類必須實現Comparable介面,重寫Comparaeable介面中CompareTo(T t)方法!
2.使用TreeSet集合儲存自定義物件,要進行比較器排序,那麼自定義物件所在的類必須實現comparator介面,重寫介面中:compare方法
HashSet集合
HashSet:public class HashSet<E> extends AbstractSet<E> implements Set<E>,Cloneable,Serializable類實現Set介面,由雜湊表(實際上是一個HashMap例項)支援,不保證set的迭代順序;
HashSet:
1)基於HashMap實現
2)不允許重複,可以有一個Null元素
3)不保證順序恆久不變
4)新增元素時把元素作為HashMap的key儲存,HashMap的Value使用一個固定的Object物件
5)排除重複元素時通過equals來檢查物件是否相同
6)判斷兩個物件是否相等,判斷兩個物件的Hashcode是否相等,如果兩個物件的Hashcode相同,不一定是同一個物件,如果不同,那一定不是同一個物件,如果兩個物件的Hashcode的相同,還要進行equals判斷,如果equals相同,則是同一個物件
7)儲存自定義物件,必須重寫hashcode()方法和equals()方法
Hashcode()方法:
定義:public native int hashCode();//非本地實現
Map集合
Map集合的特點:
一個鍵值對元素(一個鍵對應一個值,值是可以重複,但是鍵必須唯一) 只針對鍵有效,跟值無關!
Map集合的功能:
新增功能
V put(K key, V value) :新增一個鍵值對元素
問題:返回值是什麼意思
/如果當前鍵是一次儲存的時候,返回的結果null
//如果鍵是不是第一次儲存,後面重複,將當前對應的值把以前的值覆蓋掉並儲存下來,返回以前的值!
刪除功能:
V remove(Object key):刪除指定的鍵,返回的是跟鍵關聯的值,如果沒有對映關係,則返回null
void clear():刪除全部的鍵以及值
判斷功能
boolean containsKey(Object key):是否包含指定的鍵
boolean containsValue(Object value):是否包含指定的值
boolean isEmpty():判斷Map集合是否為空
TreeMap集合
TreeMap:紅黑樹結構
構造方法:
public TreeMap():預設的自然順序排序
public TreeMap(Comparator<? super K> comparator):是一種比較器排序(推薦)
TreeMap集合儲存自定義型別,什麼情況下自然排序(Comparable),什麼情況下是選擇器排序(Comparator)?
執行無參構造方法:TreeMap<E>():無參構造----是自然排序:
要求當前自定義型別需要實現Comparable介面,重寫comparesTo方法
執行有參構造方法:TreeMap<自定義型別>(Comparator<? super K> comparator):
方式1:自定義一個類實現Comparator介面中 的compare(T t1,T t2)方法
方式2:通過介面匿名內部類實現
TreeMap集合排序練習
import java. util. Comparator;
import java. util. Set;
import java. util. TreeMap;
public class TreepMapDemo {
public static void main ( String[ ] args) {
TreeMap< Student, String> tm = new TreeMap < Student, String> ( ) ;
Student s1 = new Student ( "gaoyuanyuan" , 41 ) ;
Student s2 = new Student ( "wuqilong" , 41 ) ;
Student s3 = new Student ( "gaoyuanyuan" , 39 ) ;
Student s4 = new Student ( "liushishi" , 37 ) ;
Student s5 = new Student ( "liushishi" , 37 ) ;
Student s6 = new Student ( "zhangyu" , 35 ) ;
Student s7 = new Student ( "zhaobo" , 35 ) ;
tm. put ( s1, "ee008" ) ;
tm. put ( s2, "ee009" ) ;
tm. put ( s3, "ee0010" ) ;
tm. put ( s4, "ee005" ) ;
tm. put ( s5, "ee008" ) ;
tm. put ( s6, "ee008" ) ;
tm. put ( s7, "ee008" ) ;
Set< Student> set = tm. keySet ( ) ;
for ( Student key: set) {
String value = tm. get ( key) ;
System. out. println ( key. getName ( ) + "---" + key. getAge ( ) + "---" + value) ;
}
}
}
public class Student implements Comparable < Student> {
private String name;
private int age;
public Student ( ) {
super ( ) ;
}
public Student ( String name, int age) {
super ( ) ;
this . name = name;
this . age = age;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
@Override
public String toString ( ) {
return "Student [name=" + name + ", age=" + age + "]" ;
}
@Override
public int hashCode ( ) {
final int prime = 31 ;
int result = 1 ;
result = prime * result + age;
result = prime * result + ( ( name == null) ? 0 : name. hashCode ( ) ) ;
return result;
}
@Override
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 ;
}
@Override
public int compareTo ( Student s) {
int num = s. getAge ( ) - this . getAge ( ) ;
int num2 = ( num== 0 ) ? s. getName ( ) . compareTo ( this . getName ( ) ) : num;
return num2;
}
}
執行結果:
wuqilong---41---ee009
gaoyuanyuan---41---ee008
gaoyuanyuan---39---ee0010
liushishi---37---ee008
zhaobo---35---ee008
zhangyu---35---ee008
import java. util. Comparator;
import java. util. Set;
import java. util. TreeMap;
public class TreepMapDemo {
public static void main ( String[ ] args) {
TreeMap< Student, String> tm = new TreeMap < Student, String> ( new Comparator < Student> ( ) {
@Override
public int compare ( Student s1, Student s2) {
int num = s1. getAge ( ) - s2. getAge ( ) ;
int num2 = ( num== 0 ) ? ( s1. getName ( ) . compareTo ( s2. getName ( ) ) ) : num;
return num2;
}
} ) ;
Student s1 = new Student ( "gaoyuanyuan" , 41 ) ;
Student s2 = new Student ( "wuqilong" , 41 ) ;
Student s3 = new Student ( "gaoyuanyuan" , 39 ) ;
Student s4 = new Student ( "liushishi" , 37 ) ;
Student s5 = new Student ( "liushishi" , 37 ) ;
Student s6 = new Student ( "zhangyu" , 35 ) ;
Student s7 = new Student ( "zhaobo" , 35 ) ;
tm. put ( s1, "ee008" ) ;
tm. put ( s2, "ee009" ) ;
tm. put ( s3, "ee0010" ) ;
tm. put ( s4, "ee005" ) ;
tm. put ( s5, "ee008" ) ;
tm. put ( s6, "ee008" ) ;
tm. put ( s7, "ee008" ) ;
Set< Student> set = tm. keySet ( ) ;
for ( Student key: set) {
String value = tm. get ( key) ;
System. out. println ( key. getName ( ) + "---" + key. getAge ( ) + "---" + value) ;
}
}
}
public class Student {
private String name;
private int age;
public Student ( ) {
super ( ) ;
}
public Student ( String name, int age) {
super ( ) ;
this . name = name;
this . age = age;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
@Override
public String toString ( ) {
return "Student [name=" + name + ", age=" + age + "]" ;
}
@Override
public int hashCode ( ) {
final int prime = 31 ;
int result = 1 ;
result = prime * result + age;
result = prime * result + ( ( name == null) ? 0 : name. hashCode ( ) ) ;
return result;
}
@Override
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 ;
}
}
執行結果:
wuqilong---41---ee009
gaoyuanyuan---41---ee008
gaoyuanyuan---39---ee0010
liushishi---37---ee008
zhaobo---35---ee008
zhangyu---35---ee008
Collections類
Collections:java.util.Collections 類
可以針對Collection集合進行操作的工具類!
public static <T> int binarySearch(List<?> list,T key):針對集合的二分查詢方法:
查詢key在集合中出現的索引值
public static <T> T max(Collection<? extends T> list):獲取集合中最大值
public static <T> T min(Collection<? extends T> list):獲取集合中最小值
public static <T> void sort(List<T> list):針對List集合進行排序:升序排序
public static <T> void sort(List<T> list,Comparator<T> com):比較器排序
public static void shuffle(List<?> list):針對List集合的元素進行隨機置換
HashMap集合
HashMap<K,V>是Map集合的子實現類,裡面雜湊表結構,保證(鍵唯一)
Map集合只針對鍵有效
HashMap<Integer,String>鍵:Integer
HashMap<String,Student> :鍵:String
HashMap<Student,String>:鍵是自定義物件
對於Map儲存的鍵如果是自定義物件:該自定義物件的所在類必須重寫Object:equals()和hashCode()
會依賴於HashMap的put方法
hash()---->依賴於hashCode():算出每一個物件雜湊碼值一樣
putValue()---->equals()方法:雜湊碼值一樣,還有比較每一個成員資訊是否相同!
Map和Collection集合的區別?
Map<K key,V value>集合:雙列集合,鍵對映到值的物件 ,鍵必須保證唯一,可以看成是一個(夫妻對),遍歷方式和Collection集合遍歷方式不同
Collection<E>集合:
單列集合:只能儲存一種引用型別,裡面的set集合依賴於Map集合的實現 (理解為:光棍)
HashSet---->HashMap裡面put方法
TreeSet---->TreeMap裡面的put方法