List: 元素是有序的,元素可以重復,因為該集合體系有索引(腳標)
常用的子類對象:
1————ArrayList 底層的數據結構是使用的數組結構特點:查詢速度快,但是增刪比較慢
2————LinkedList底層的數據結構使用的是鏈表結構特點:增刪速度快,但是查詢比較慢
Vector 底層是數組數據結構。
線程同步,ArrayList線程不同步,替代了vector ArrayList 是可變長度數組,默認長度是10,當添加的元素大于10時,系統自動new一個新的數組且增長原數組的一半長度,并把之前的元素復制到這個新數組中,vector和它一樣,但是延長一倍。
Set:無序,不可重復元素 HashSet:數據結構是哈希表,線程是非同步的。保證元素唯一性的原理,判斷元素的hashCode值是否相同如果相同,還會繼續判斷元素的equals方法,是否為true。
TreeSet:
可以對Set集合中的元素進行排序。底層數據結構是二叉樹。 保證元素唯一行的依據,compareTo方法return 0;
TreeSet 排序的第一種方式
讓元素(對象)自身具備比較性。元素需要實現Comparable接口,覆蓋 compareTo方法這種方式也稱為元素的自然順序,或者叫做默認順序
TreeSet第二種排序方式:
當元素自身不具備比較性時,或者具備的比較性不是所需要的,這時需要讓集合(TreeSet)自身具備比較性。做法是在集合初始化時,就有了比較方式,即定義一個比較器將比較器作為參數傳遞給TreeSet集合的構造函數。比較器--定義一個類,實現Comparator接口,覆蓋compare方法。而當兩種排序都存在時以比較器為主。
關于ArrayList添加對象,自定義判斷條件問題以及HashSet集合添加自定義對象問題雖然兩個集合的底層結構不同,但是他們都調用添加對象類中的equals方法,而 ArrayList是通過contains()方法讓系統自動調用equals方法;HashSet是通過當add添加元素的時候系統自動調用hashCode()方法判斷hash值如果相等則不會被添加,如果相等,再通過hashCode方法調用equals方法判斷。一般添加的時候都會在類中重寫hashCode 和equals以滿足實際條件的需求。但是,ArrayList和HashSet重寫Object類中的equals方法原理都是一樣的。
例如:
class Person {
private String name;
private int age;
Person(String name,int age) { this.name=name; this.age=age; }
public String getName() { return name; }
public int getAge() { return age; } }
此equals是重寫Object中的equals方法 obj形參實參是contains中的,相當于obj=new Person("xiaoxiao11",15);
多態 public boolean equals(Object obj) { 判斷傳進來的對象是否是Person對象不是的話就返回false if (!(obj instanceof Person)) { return false; } 因為傳參傳進來的對象是Object的子類對象,體現多態性,必須向下轉型 Person p=(Person)obj; return this.name.equals(p.name)&&this.age==p.age; 而return中的equlas是字符串中的equals方法~~! 比較字符串對象的內容是否相同 } }
關于TreeSet添加自定意對象,讓其排序的問題。有兩種方式
第一種讓元素(對象)自身具備比較性。元素需要實現Comparable接口,覆蓋 compareTo方法這種方式也稱為元素的自然順序,或者叫做默認順序
class Student implements Comparable {
private String name;
private int age;
Student(String name,int age) { this.name=name; this.age=age; }
當在TreSet中添加對象的時候底層自動調用Comparable接口中的compareTo方法
class Student implements Comparable {
private String name;
private int age;
Student(String name,int age) { this.name=name; this.age=age; }
public int compareTo(Student s) { System.out.println(this.name+"...compareto...."+s.name);
int num= new Integer(this.age).compareTo(new Integer (s.age));
if(num==0) return this.name.compareTo(s.name);//比較名字是否相同時次要條件
return num; }
public String getName() { return name; }
public int getAge() { return age; } }
第二種:當元素自身不具備比較性時,或者具備的比較性不是所需要的,這時需要讓集合(TreeSet)自身具備比較性。做法是在集合初始化時,就有了比較方式,即定義一個比較器將比較器作為參數傳遞給TreeSet集合的構造函數。比較器--定義一個類,實現Comparator接口,覆蓋compare方法。而當兩種排序都存在時以比較器為主使用了泛型--在集合初始化時把new Mycomparator()以構造方法傳參傳進去即可
class Mycomparator implements Comparator {
public int compare(String o1,String o2) { int num=new Integer(o1.length()).compareTo(new Integer (o2.length()));
if (num==0) { return o1.compareTo(o2); }
return num; } }
Map集合的兩種取出方式
Set keySet:將Map中所有的鍵存入到Set集合,因為Set集合具備迭代器所以可以迭代取出所有的鍵,在根據get(key)獲取值。 Map集合的取出原理:將Map集合轉成Set集合,再迭代取出。
Set> entrySet:將Map集合中的映射關系存入到Set集合中,而這個關系的數據類型就是:Map.Entry Map.Entry 其實Entry也是一個就扣,它是Map接口中的一個內部接口。
interface Map {
public static interface Entry {
//定義內部接口是因為取出Map中的成員屬性方便
public abstract Object getKey();
public abstract Object getValue(); } }
class HashMap implements Map {
//HashMap 取出元素的原理
class Haha implements Map.Entry {
public abstract Object getKey(){ }
public abstract Object getValue(){ } }
Map的子類
Hashtable:底層是哈希表數據結構,不可以存null鍵null值。線程同步
HashMap: 底層是哈希表數據結構,允許存null鍵null值,線程不同步
TreeMap: 底層是二叉樹數據結構,線程不同步,可以給Map中的鍵排序其實Set底層就是使用了Map集合