天天看點

黑馬程式員Java基礎__集合(上)

---------------------- ASP.Net+Android+IO開發S、 .Net教育訓練、期待與您交流! ----------------------

 一、  集合類  

一)概述: java語言的java.util包中提供了一些集合類,這些集合又被成為容器。提到容器不難會想象到數組,集合類與數組的不同之處, 數組的長度是固定的,集合的長度是可變的。數組用來存放基本類型的資料,集合用來存放對象的引用,集合有List集合、Set集合、Map集合, 其中List和Set集合是想了Collection接口,個個接口還提供了不同的實作類。

 二)部分基本架構:

Collection

 |-----List---:元素是有序的,元素可以重複。因為該集合體系有索引。

          |----ArrayList:底層的資料結構使用的是數組結構。特點:查詢速度很快。但是增删稍慢。線程不同步。

          |----LinkedList:底層使用的連結清單資料結構。特點:增删速度很快,查詢稍慢。線程不同步。

          |----Vector:底層是數組資料結構。線程同步。被ArrayList替代了因為效率低。

 |-----Set ---:Set集合的功能和Collection是一緻的。元素是無序(存入和取出的順序不一定一緻),元素不可以重複,其存儲順序是按哈希值順序。

          |----HashSet:底層資料結構是哈希表。是線程不安全的。不同步。

HashSet是如何保證元素唯一性的呢?

是通過元素的兩個方法,hashCode和equals來完成。

如果元素的HashCode值相同,才會判斷equals是否為true。

如果元素的hashcode值不同,不會調用equals。

注意:對于判斷元素是否存在,以及删除等操作,依賴的方法是元素的hashcode和equals方法。

          |----TreeSet---:可以對Set集合中的元素進行排序。

                                 底層資料結構是二叉樹。

                                 保證元素唯一性的依據:compareTo方法return 0。

                                 TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實作Comparable接口,覆寫compareTo方法。

也種方式也成為元素的自然順序,或者叫做預設順序。

                                 TreeSet的第二種排序方式: 當元素自身不具備比較性時,或者具備的比較性不是所需要的。這時就需要讓集

合自身具備比較性。在集合初始化時,就有了比較方式。定義一個類,實作Comparator接口,覆寫compare方法。

--------------------------華麗的分割線-----------------------------

三、集合中的共性方法

1、增加    add(Object obj);   ----->  添加元素。

2、删除    remove();      ----->  删除集合中指定參數的元素。

   removeAll();   ----->  删除目前集合中與另一集合相同的元素,即隻保留與另一集合不同的元素。

   clear();       ----->  清空集合中的元素,集合還存在。

3、擷取集合長度    size();        ----->  擷取集合長度,即集合元素的個數。

4、修改    set(int index,e);  ----->  将指定位置(index)上的元素修改為給定的參數e。

5、判斷    boolean contains(e); ----->  判斷給定元素e是否存在于集合中。

6、疊代器    iterator()   ----->  集合取出元素的方式。    boolean hasNext();   ----->  判斷是否還有下一個元素。

   next();              ----->  取出下一個元素。

示例1:

import java.util.*;


class CollectionDemo {
 public static void sop(Object obj) {
  System.out.println(obj);
 }


 public static void main(String[] args) {
  base_method();
  sop("------------------");
  method2();
  sop("------------------");
  method_get();
 }


 public static void base_method() {
  // 建立一個集合容器,使用Collection接口的子類,ArrayList
  ArrayList al = new ArrayList();
  // 1.添加元素--->add(Object obj),多态
  al.add("java01");
  al.add("java02");
  al.add("java03");
  al.add("java04");


  // 列印原集合
  sop("原集合" + al);


  // 3.删除元素
  al.remove("java02");


  // 清空集合中的元素
  al.clear();


  // 4.判斷元素
  // 判斷集合中是否存在某個元素:contains()
  sop("是否存在java03:" + al.contains("java03"));
  // 判斷集合是否為空:isEmpty()
  sop("判斷集合是否為空:" + al.isEmpty());


  // 2.擷取個數,集合長度
  sop("size :" + al.size());


  // 列印改變後集合
  sop(al);


  System.out.println("Hello World!");
 }


 public static void method2() {
  // 建立另一個新集合
  ArrayList at1 = new ArrayList();
  at1.add("java01");
  at1.add("java02");
  at1.add("java03");
  at1.add("java04");


  // 列印原集合
  sop("原集合at1:" + at1);


  ArrayList at2 = new ArrayList();
  at2.add("java01");
  at2.add("java02");
  at2.add("java05");
  at2.add("java06");
  sop("原集合at2:" + at2);


  // removeAll()--->隻保留和at2不相同的元素。
  at1.removeAll(at2);
  sop("remove後at1:" + at1);
  sop("now集合at2:" + at2);


  // 取兩個集合的交集,at1中隻保留交集的部分
  at1.retainAll(at2);


  sop("取完交集後的at1:" + at1);
 }


 public static void method_get() {
  // 建立另一個新集合
  ArrayList at1 = new ArrayList();
  at1.add("java01");
  at1.add("java02");
  at1.add("java03");
  at1.add("java04");


  // 列印原集合
  sop("原集合at1:" + at1);


  // 擷取疊代器,用于去除集合中的元素
  Iterator it = at1.iterator();


  while (it.hasNext()) {
   sop(it.next());
  }
 }
}


           

二、 List集合

一、對于List集合特有的方法: 凡是可操作角标的方法都是該體系特有的方法,基本方法和Collection中的一樣。

1、增加:    add(int index,e);               ----->  在指定位置增加給定的元素。    addAll(int index,Collection);   ----->  在指定位置增加給定集合中的所有元素,若省略位置參數,則在目前集合的後面依次添加元素。

2、删除:    remove(int index); ----->  删除集合中指定位置上的元素。

    3、修改:    set(int index,e);  ----->  将指定位置(index)上的元素修改為給定的參數e。

4、查詢:    get(int index);    ----->  擷取指定位置上的元素。

   indexOf(e);        ----->  通過指定元素擷取其在集合中的位置。

   subList(int from,int to);    ----->  擷取從from到to位置上的元素。

   Iterator listIterator();     ----->  傳回Iterator接口類型值。

---------------華麗的分割線-----------------------------

二、LinkedList類 特有方法: 一)JDK1.6之前的方法 1、增加:    addFirst(obj);   ----->  在集合頭部添加給定的元素。    addLast(obj);    ----->  在集合尾部添加給定的元素。

2、擷取:    getFirst();   ----->  擷取集合第一個元素,若集合中沒有元素,則出現NoSuchElementException。    getLast();    ----->  擷取集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException。     3、删除:    removeFirst();  ----->  擷取并删除集合第一個元素,若集合中沒有元素,則出現NoSuchElementException。    removeLast();   ----->  擷取并删除集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException。

二)JDK1.6出現的替代方法: 1、增加:    offerFirst(obj);   ----->  在集合頭部添加給定的元素。

   offerLast(obj);    ----->  在集合尾部添加給定的元素。

2、擷取:    peekFirst();   ----->  擷取集合第一個元素,若集合中沒有元素,則傳回null。    peekLast();    ----->  擷取集合最後一個元素,若集合中沒有元素,則傳回null。     3、删除:    pollFirst();  ----->  擷取并删除集合第一個元素 ,若集合中沒有元素,則傳回null。    pollLast();   ----->  擷取并删除集合最後一個元素,若集合中沒有元素,則傳回null。

--------------------------華麗的分割線-----------------------------

三、 Set集合

 TreeSet排序的第一種方式:實作Comparable接口,覆寫compareTo方法。

示例1:

class Student implements Comparable//該接口強制讓學生具備比較性。  
{  
 private String name;  
 private int age;  
 Student(String name,int age)  
 {  
  this.name = name;  
  this.age = age;  
 }  
 public int compareTo(Object obj)  
 {  
  if(!(obj instanceof Student))  
   throw new RuntimeException("不是學生對象");  
  Student s = (Student)obj;  
  if(this.age>s.age)  
   return 1;  
  if(this.age==s.age)  
  {  
   return this.name.compareTo(s.name);  
  }  
  return -1;  
 }  
  public String getName()  
 {  
  return name;  
 }  
 public int getAge()  
 {  
  return age;  
 }  
} 
           

TreeSet排序的第二種方式:實作Comparator接口,覆寫compare方法。

示例2:

TreeSet ts = new TreeSet(MyCompare);  
class MyComart implements Comparator//定義一個類,實作Comparator接口,覆寫compare方法。  
{  
 public int compare(Object o1,Object o2)//覆寫compare方法。  
 {  
  Student s1 = (Student)o1;  
        Student s2 = (Student)o2;  
  int num = s1.getName().compareTo(s2.getName());  
        if(num==0)  
  {  
   return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));//比較年齡因為Intege已經具有比較性了.直接比就可以啦  
               /* 
               if(s1.getAge()>s2.getAge()) 
                      return 1; 
               if(s1.getAge()==s2.getAge()) 
                      return 0; 
               return -1; 
               */  
        }  
        return num;  
 }  
}  
           

---------------------- ASP.Net+Android+IO開發S、 .Net教育訓練、期待與您交流! ----------------------