JAVA 集合(1) List

摘要:JAVA 集合(1) List

集合類

物件導向對事物都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行存儲,集合就是存儲物件最常用的一 種方式
 
陣列和集合類同是容器,有何不同?
陣列雖然也可以存儲物件,但長度是固定的
集合長度是可變的。 陣列中可以存儲基底資料型別,集合只能存儲物件,集合可以存儲不同類型的物件。
 
集合框架中的常用介面
Collection介面有兩個子介面:
List(列表),Set(集)
List:可存放重複元素,元素存取是有序
Set:不可以存放重複元素,元素存取是無序
 
基本方法使用:
class Hello{
    public static void main(String[] args){
        //創建一個容器 使用Collection介面的子類
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");
        sop(a.contains("x"));  //T
        sop(a.isEmpty());   //F
        sop(a);  //[x, y]
        a.remove("y");
        sop(a); //[x]
        sop(a.clear());//[]
}

class Hello{
    public static void main(String[] args){
        //創建一個容器 使用Collection介面的子類
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");

        ArrayList b = new ArrayList();
        b.add("x");
        sop(a);  //[x, y, z]
        a.retainAll(b); //保留交集
        sop(a); //[x]
       
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

 

Iterator

class Hello{
    public static void main(String[] args){
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");
        Iterator it = a.iterator();//返回一個Iterator介面的子類物件
       
        sop(it.next()); //x
        sop(it.next()); //y
        sop(it.next()); //z
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}


class Hello{
    public static void main(String[] args){
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");
        //返回一個Iterator介面的子類物件
        //用於取出集合中的元素
        Iterator it = a.iterator();
       
        while(it.hasNext()){
            sop(it.next()); //x y z
        }
       
        it.remove();//移除最後一個元素
        sop(a);
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

 

Collection(介面)
  • List(介面)
    • 有序(依存入的順序),可重複,有索引
  • Set(介面)
    • 無序,不可重複
 
List介面中常用類
  • Vector:執行緒安全(同步),但速度慢,已被 ArrayList替代
  • ArrayList:執行緒不安全(不同步),查詢速度快,但增加刪除慢,使用陣列
  • LinkedList:增刪速度快,查詢慢,使用鏈結串列
 
Set介面中常用類
  • HashSet:底層數據結構是hash table,而hashSet是如何保證元素唯一性,是通過元素的兩個方法,hashCode和equals方法來完成,如果元素的HashCode值相同,才會判斷equals是否為true,如果元素的hashCode值不同,不會調用equals
  • TreeSet:可以對Set集合中的元素進行排序,底層數據結構是二元樹,保證元素唯一性的依據,compareTo方法return 0
    • TreeSet排序的第一種方式,讓元素自身具備比較性,元素需要實現比較性,元素需要實現Comparable介面,覆寫compareTo方法,這種方法也成為元素的自然順序,或者叫作默認順序
    • TreeSet的第二種排序方式: 當元素本身不具備比較性,或者具備的比較性不是所需要的,這時就需要讓集合自身具備比較性。在集合初始化時,就有了比較方式,定義一個類別,實現Comparator介面,覆寫compare方法
    • 當兩種排序都存在時,以比較器為主
class Hello{
    public static void main(String[] args){
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");
        sop(a); //[x, y, z]
       
        a.add(1, "w");
        sop(a); //[x, w, y, z]
        a.remove(2); //移除索引2元素
        sop(a);//[x, w, z]
        a.set(2, "xyz");
        sop(a);//[x, w, xyz]
        sop(a.get(1));//w
       
        for(int x = 0; x 
}

 

List方法
    • add(index, element);
    • addAll(index, Collection);
    • remove(index);
    • set(index, element);
    • get(index);
    • subList(from, to);
    • listIterator();
class Hello{
    public static void main(String[] args){
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");
        sop(a);//[x, y, z]
        Iterator it = a.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            if(obj.equals("x")){
                //a.add("w"); 發生異常 不可這樣用
                it.remove();//移除 x (it移除, a也移除)
                sop(obj);//x
            }
           
        }
        sop(a);//[y, z]
    }
List集合特有的迭代器,ListIterator是Iterator的子介面
在迭代時,不可以通過集合物件的方法操作集合中的元素,會發生ConcurrentModificationException異,所以在迭代器時,只能用迭代器的方法操作元素,但其方法只有判斷、取出、移除等操作,如果想做其他操做,就需要使用其子介面,即ListIterator
該介面只通過List集合的ListIterator方法取得
 
ListIterator的hasNext及hasPrevious方法
集合一開始指向null位置,所以hasNext為true,而hasPrevious為flase!!
 
 
如下:
class Hello{
    public static void main(String[] args){
        ArrayList a = new ArrayList();
        a.add("x");
        a.add("y");
        a.add("z");
        sop(a);//[x, y, z]
        Iterator it = a.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            if(obj.equals("x")){
                //a.add("w"); 發生異常 不可這樣用
                it.remove();//移除 x (it移除, a也移除)
                sop(obj);//x
            }
        }
        sop(a);//[y, z]
        ListIterator li = a.listIterator();
        while(li.hasNext()){
            Object obj = li.next();
            if(obj.equals("y")){
                li.set("y1");//修改元素
                li.add("x");//增加元素 x
            }
        }
        sop(a);//[y, x, z]
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

 

Vector

class Hello{
    public static void main(String[] args){
        Vector v = new Vector();
        v.add("a");
        v.add("b");
        v.add("c");
        v.add("d");
        Enumeration en = v.elements();//vector的迭代器以被Iterator取代
        while(en.hasMoreElements()){
            sop(en.nextElement());
        }
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

 

LinkList

/*LinkedList方法
 * addFirst()
 * addList()
 * getFirst() 取得元素但不移除 如果集合中沒有元素 會出現NoSuchElementException
 * getLast()
 * removeFirst() 取得元素並移除 如果集合中沒有元素 會出現NoSuchElementException
 * removeLast()
 *
 * JDK1.6的替代方法 解決集合空異常
 * offerFirst()
 * offerLast()
 * peekFirst() 取得元素但不移除 集合為空返回null
 * peekLast()
 * pollFirst() 取得元素並移除 集合為空返回null
 * pollLast() 
 * */
class Hello{
    public static void main(String[] args){
        LinkedList link = new LinkedList();
        link.addFirst("a");
        link.addFirst("b");
        link.addFirst("c");
        link.addFirst("d");
       
        sop(link);//[d, c, b, a]
        sop(link.getFirst());//d
        sop(link.getLast());//a
        link.removeFirst();
        link.removeLast();
        sop(link);//[c, b]
        sop(link.size());//2
       
        while(!(link.isEmpty())){
            sop(link.removeFirst());//c, b
        }
       
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}

使用LinkList模擬stack

class StackTest{
    private LinkedList link;
    public StackTest() {
        link = new LinkedList();
    }
    public void add(Object obj){
        link.addFirst(obj);
    }
    public Object get(){
        return link.removeFirst();
    }
    public boolean isNull(){
        return link.isEmpty();
    }
   
}

class Hello{
    public static void main(String[] args){
        StackTest link = new StackTest();
        link.add("a");
        link.add("b");
        link.add("c");
        while(!(link.isNull())){
            System.out.println(link.get()); //c, b, a
        }
    }
}

 

ArrayList去除重複元素

class Hello{
    public static void main(String[] args){
        ArrayList array = new ArrayList();
        array.add("a");
        array.add("a");
        array.add("a");
        array.add("b");
        array.add("b");
        array.add("c");
        sop(array); //[a, a, a, b, b, c]
       
        array = singleElement(array);
        sop(array); //[a, b, c]
    }
   
    public static ArrayList singleElement(ArrayList tempArray){
        ArrayList newArray = new ArrayList();
        Iterator it = tempArray.iterator();
        while(it.hasNext()){
            Object obj  = it.next();
            if(!(newArray.contains(obj))){
                newArray.add(obj);
            }
        }
        return newArray;
    }
   
    public static void sop(Object obj){
        System.out.println(obj);
    }
}
List集合判斷元素是否相同,依據是元素的equals方法!!
將自定義物件存到ArrayList中,並去除重覆
class Person{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    //object類的equals為位址比較 需自定義equals方法 才能夠判斷出相等物件
    public boolean equals(Object obj){
        if(!(obj instanceof Person)){
            return false;
        }else{
            Person p = (Person)obj;
            //使用string類的equals比較
            return this.name.equals(p.name) && this.age == p.age;
        }
    }
}

class Hello{
    public static void main(String[] args){
        ArrayList array = new ArrayList();
        array.add(new Person("kent", 20));
        array.add(new Person("hardy", 25));
        array.add(new Person("kemp", 22));
        array.add(new Person("kemp", 22));
        array.add(new Person("hardy", 25));
       
        array = singleElement(array);
        Iterator it = array.iterator();
       
        while(it.hasNext()){
            //Object obj = it.next();
            //Person p = (Person)obj;
            Person p = (Person)it.next();
            sop(p.getName() + ":: "  +  p.getAge());
        }
    }
    public static ArrayList singleElement(ArrayList a){
        ArrayList newA = new ArrayList();
        Iterator it = a.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            if(!(newA.contains(obj))){//contain會調用Person類中的equals方法
                newA.add(obj);
            }
        }
        return newA;
    }
    public static void sop(Object obj){
        System.out.println(obj);
    }
}