Java集合詳解(二)

薛亮亮1006發表於2020-11-01

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():獲取一個元素  
/*
使用Vector專有遍歷方式遍歷Vector集合!
*/
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");
		//相當於Iterator迭代器
		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集合排序練習
/*
方式1:按照主要條件:學生的年齡從小到進行排序!,次要條件姓名!
*/
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) ;
		//新增到TreeMap集合中
		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") ;
		//遍歷集合
		//TreeMap<Student,String>
		//keySet(),獲取集合所有的鍵
		Set<Student> set = tm.keySet();
		for(Student key:set) {
			//通過鍵獲取值
			String value = tm.get(key);
			System.out.println(key.getName()+"---"+key.getAge()+"---"+value);
			
		}
		
	}
}
/*
	學生類,並重寫了compareTo方法
*/
public class Student implements Comparable<Student>{
	private String name;
	private int age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	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;
	}
	//重寫compareTo方法進行對年齡和姓名進行比較
	@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

/*
方式2:按照主要條件:學生的年齡從小到進行排序!,次要條件姓名!
*/
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) ;
		//新增到TreeMap集合中
		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") ;
		//遍歷集合
		//TreeMap<Student,String>
		//keySet(),獲取集合所有的鍵
		Set<Student> set = tm.keySet();
		for(Student key:set) {
			//通過鍵獲取值
			String value = tm.get(key);
			System.out.println(key.getName()+"---"+key.getAge()+"---"+value);
			
		}
		
	}
}
/*
	Student學生類
*/
public class Student {
	private String name;
	private int age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	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方法

相關文章