天天看點

【14】集合1_集合架構,疊代器,List集合,Set集合

7.1集合架構

為什麼出現集合類?

面向對象語言對事物的展現都是以對象的形式,是以為了友善對多個對象的操作,就對對象進行存儲,集合就是存儲對象最常用的一種方式。

數組和集合類同是容器,有何不同?

數組雖然也可以存儲對象,但長度是固定的;集合長度是可變的。數組中可以存儲基本資料類型,集合隻能存儲對象。

集合類的特點

集合隻用于存儲對象,集合長度是可變的,集合可以存儲不同類型的對象。

【14】集合1_集合架構,疊代器,List集合,Set集合
【14】集合1_集合架構,疊代器,List集合,Set集合

7.1.2Collection定義了集合架構的共性功能。

1.添加

         add(e);

         addAll(collection);

2.删除

         remove(e);

         removeAll(collection);

         clear();

3.判斷。

         contains(e);

         isEmpty();

4.擷取

         iterator();

         size();

5.擷取交集。

         retainAll();

6.集合變數組。

         toArray();

1.      add方法的參數類型是Object。以便于接收任意類型對象。

2.      集合中存儲的都是對象的引用(位址)

什麼是疊代器呢?

其實就是集合的取出元素的方式。

如同抓娃娃遊戲機中的夾子。

疊代器是取出方式,會直接通路集合中的元素。

是以将疊代器通過内部類的形式來進行描述。

通過容器的iterator()方法擷取該内部類的對象。

【14】集合1_集合架構,疊代器,List集合,Set集合

練習一:Collection接口中常見操作

import java.util.*;
class CollectionDemo
{
         public static void main(String[] args)
         {
                  
                   method_get();
         }
         public static void method_get()
         {
                   ArrayList al = new ArrayList();
 
                   //1,添加元素。
                   al.add("java01");//add(Objectobj);
                   al.add("java02");
                   al.add("java03");
                   al.add("java04");
 
                   /*
                   Iterator it = al.iterator();//擷取疊代器,用于取出集合中的元素。
 
                   while(it.hasNext())
                   {
                            sop(it.next());
                   }
                   */
 
                   for(Iteratorit = al.iterator(); it.hasNext() ; )
//老外用的是for循環的方法疊代,優點是循環完後建立的對象自動釋放,而while那種是先建立對象,對象在調用完不會自動釋放。
                   {
                            sop(it.next());
                   }
         }
 
 
         public static void method_2()
         {
                   ArrayList al1 = new ArrayList();
 
                   al1.add("java01");
                   al1.add("java02");
                   al1.add("java03");
                   al1.add("java04");
                   ArrayListal2 = new ArrayList();
 
                   al2.add("java03");
                   al2.add("java04");
                   al2.add("java05");
                   al2.add("java06");
 
                  
                   //al1.retainAll(al2);//取交集,al1中隻會保留和al2中相同的元素。
                   al1.removeAll(al2);//删除,al1和al2中相同的元素。
 
                   sop("al1:"+al1);
                   sop("al2:"+al2);
 
 
 
 
         }
 
         public static void base_method()
         {
                   //建立一個集合容器。使用Collection接口的子類。ArrayList
                   ArrayListal = new ArrayList();
 
                   //1,添加元素。
                   al.add("java01");//add(Objectobj);
                   al.add("java02");
                   al.add("java03");
                   al.add("java04");
 
                   //列印原集合。
                   sop("原集合:"+al);
 
 
                   //3,删除元素。
                   //al.remove("java02");
                   //al.clear();//清空集合。
 
 
                   //4,判斷元素。
                   sop("java03是否存在:"+al.contains("java03"));
                   sop("集合是否為空?"+al.isEmpty());
 
 
                   //2,擷取個數。集合長度。
                   sop("size:"+al.size());
 
                   //列印改變後的集合。
                   sop(al);
 
         }
 
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
}
           

7.1.3 Collection分類

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

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

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

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

         |--Set:元素是無序,元素不可以重複。、

List:

         特有方法。凡是可以操作角标的方法都是該體系特有的方法。

         add(index,element);

         addAll(index,Collection);

         remove(index);

         set(index,element);

         get(index):

         subList(from,to);

         listIterator();

         intindexOf(obj):擷取指定元素的位置。

         ListIteratorlistIterator();

List集合特有的疊代器。ListIterator是Iterator的子接口。

在疊代時,不可以通過集合對象的方法操作集合中的元素。

因為會發生ConcurrentModificationException異常。

是以,在疊代器時,隻能用疊代器的放過操作元素,可是Iterator方法是有限的,

隻能對元素進行判斷,取出,删除的操作,

如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

該接口隻能通過List集合的listIterator方法擷取。

import java.util.*;
class ListDemo
{
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
         public static void method()
         {
                  
                   ArrayList al = new ArrayList();
 
                   //添加元素
                   al.add("java01");
                   al.add("java02");
                   al.add("java03");
                  
                   sop("原集合是:"+al);
                   //在指定位置添加元素。
                   al.add(1,"java09");
 
                   //删除指定位置的元素。
                   //al.remove(2);
 
                   //修改元素。
                   //al.set(2,"java007");
 
                   //通過角标擷取元素。
                   sop("get(1):"+al.get(1));
 
                   sop(al);
 
                   //擷取所有元素。
                   for(int x=0; x<al.size(); x++)
                   {
                            System.out.println("al("+x+")="+al.get(x));
                   }
 
                   Iterator it = al.iterator();
 
                   while(it.hasNext())
                   {
                            sop("next:"+it.next());
                   }
 
 
                   //通過indexOf擷取對象的位置。
                   sop("index="+al.indexOf("java02"));
 
                   List sub = al.subList(1,3);
 
                   sop("sub="+sub);
         }
 
        
         public static void main(String[] args)
         {
 
                   //示範清單疊代器。
                   ArrayList al = new ArrayList();
 
                   //添加元素
                   al.add("java01");
                   al.add("java02");
                   al.add("java03");
 
                   sop(al);
                  
                   ListIterator li = al.listIterator();
 
                  
                   //sop("hasPrevious():"+li.hasPrevious());
 
                   while(li.hasNext())
                   {
                            Object obj = li.next();
 
                            if(obj.equals("java02"))
                                     //li.add("java009");
                                     li.set("java006");
 
                   }
 
                   while(li.hasPrevious())
                   {
                            sop("pre::"+li.previous());
                   }
 
                   sop(al);
 
/*
//在疊代過程中,準備添加或者删除元素。
 
                   Iterator it = al.iterator();
 
                   while(it.hasNext())
                   {
                            Object obj = it.next();
 
                            if(obj.equals("java02"))
                                     //al.add("java008");
                                     it.remove();//将java02的引用從集合中删除了。
 
                            sop("obj="+obj);
 
                   }
                   sop(al);
                   */
         }
}
 
           

7.1.4Vector的應用

枚舉就是Vector特有的取出方式。

發現枚舉和疊代器很像。

其實枚舉和疊代是一樣的。

因為枚舉的名稱以及方法的名稱都過長。

是以被疊代器取代了。

枚舉郁郁而終了。

練習二:List接口中 Vector集合

import java.util.*;
 
class VectorDemo
{
         public static void main(String[] args)
         {
                   Vector v = new Vector();
 
                   v.add("java01");
                   v.add("java02");
                   v.add("java03");
                   v.add("java04");
 
                   Enumeration en = v.elements();
 
                   while(en.hasMoreElements())
                   {
                            System.out.println(en.nextElement());
                   }
         }
}
           

7.1.5LinkedList:特有方法:

addFirst();

addLast();

getFirst();

getLast();

擷取元素,但不删除元素。如果集合中沒有元素,會出現NoSuchElementException

removeFirst();

removeLast();

擷取元素,但是元素被删除。如果集合中沒有元素,會出現NoSuchElementException

在JDK1.6出現了替代方法。

offerFirst();

offerLast();

peekFirst();

peekLast();

擷取元素,但不删除元素。如果集合中沒有元素,會傳回null。

pollFirst();

pollLast();

擷取元素,但是元素被删除。如果集合中沒有元素,會傳回null。

練習三:LinkedList:特有方法

import java.util.*;
class LinkedListDemo
{
         public static void main(String[] args)
         {
                   LinkedList link = new LinkedList();
 
                   link.addLast("java01");
                   link.addLast("java02");
                   link.addLast("java03");
                   link.addLast("java04");
 
                   //sop(link);
//               sop(link.getFirst());
//               sop(link.getFirst());
                   //sop(link.getLast());
                   //sop(link.removeFirst());
                   //sop(link.removeFirst());
 
                   //sop("size="+link.size());
 
                   while(!link.isEmpty())
                   {
                            sop(link.removeLast());
                   }
 
         }
 
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
}
           

7.1.6使用LinkedList模拟一個堆棧或者隊列資料結構。

堆棧:先進後出  如同一個杯子。

隊列:先進先出 Firstin First out  FIFO 如同一個水管。

練習四:使用LinkedList模拟一個堆棧或者隊列資料結構

import java.util.*;
class DuiLie
{
         private LinkedList link;
 
         DuiLie()
         {
                   link= new LinkedList();
         }
        
         public void myAdd(Object obj)
         {
                   link.addFirst(obj);
         }
         public Object myGet()
         {
                   return link.removeFirst();
         }
         public boolean isNull()
         {
                   return link.isEmpty();
         }
 
}
 
class LinkedListTest
{
         public static void main(String[] args)
         {
                   DuiLie dl = new DuiLie();
                   dl.myAdd("java01");
                   dl.myAdd("java02");
                   dl.myAdd("java03");
                   dl.myAdd("java04");
 
                   while(!dl.isNull())
                   {
                            System.out.println(dl.myGet());
                   }
         }
}
           

練習五:去除ArrayList集合中的重複元素。

import java.util.*;
class ArrayListTest
{
 
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
         public static void main(String[] args)
         {
                   ArrayList al = new ArrayList();
 
                   al.add("java01");
                   al.add("java02");
                   al.add("java01");
                   al.add("java02");
                   al.add("java01");
//               al.add("java03");
 
 
                   /*
                   在疊代時循環中next調用一次,就要hasNext判斷一次。
                   Iteratorit = al.iterator();
 
                   while(it.hasNext())
                   {
                            sop(it.next()+"...."+it.next());
                   }
                   */
 
                   /**/
                   sop(al);
                  
                   al= singleElement(al);
 
                   sop(al);
                  
 
         }
 
         public static ArrayList singleElement(ArrayList al)
         {
                   //定義一個臨時容器。
                   ArrayList newAl = new ArrayList();
 
                   Iterator it = al.iterator();
 
                   while(it.hasNext())
                   {
                            Object obj = it.next();
 
                            if(!newAl.contains(obj))
                                     newAl.add(obj);
 
                   }
 
                   return newAl;
         }
}
           

練習六:将自定義對象作為元素存到ArrayList集合中,并去除重複元素

import java.util.*;
/*
将自定義對象作為元素存到ArrayList集合中,并去除重複元素。
 
比如:存人對象。同姓名同年齡,視為同一個人。為重複元素。
 
 
思路:
1,對人描述,将資料封裝進人對象。
2,定義容器,将人存入。
3,取出。
 
 
 
List集合判斷元素是否相同,依據是元素的equals方法。
 
 
 
*/
class Person
{
         private String name;
         private int age;
         Person(Stringname,int age)
         {
                   this.name= name;
                   this.age= age;
         }
        
         public boolean equals(Object obj)
         {
 
                   if(!(obj instanceof Person))
                            return false;
 
                   Personp = (Person)obj;
                   //System.out.println(this.name+"....."+p.name);
 
                   return this.name.equals(p.name) && this.age == p.age;
         }
         /**/
         public String getName()
         {
                   return name;
         }
         public int getAge()
         {
                   return age;
         }
}
class ArrayListTest2
{
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
         public static void main(String[] args)
         {
                   ArrayList al = new ArrayList();
 
                   al.add(newDemo());
 
                   al.add(newPerson("lisi01",30));//al.add(Object obj);//Object obj = newPerson("lisi01",30);
                   //al.add(newPerson("lisi02",32));
                   al.add(newPerson("lisi02",32));
                   al.add(newPerson("lisi04",35));
                   al.add(newPerson("lisi03",33));
                   //al.add(newPerson("lisi04",35));
 
                  
                   //al= singleElement(al);
 
                   sop("remove03 :"+al.remove(new Person("lisi03",33)));//remove方法底層也是依賴于元素的equals方法。
 
 
                   Iterator it = al.iterator();
 
 
                   while(it.hasNext())
                   {
                            Person p = (Person)it.next();
                            sop(p.getName()+"::"+p.getAge());
                   }
         }
 
 
         public static ArrayList singleElement(ArrayList al)
         {
                   //定義一個臨時容器。
                   ArrayList newAl = new ArrayList();
 
                   Iterator it = al.iterator();
 
                   while(it.hasNext())
                   {
                            Object obj = it.next();
 
                            if(!newAl.contains(obj))
                                     newAl.add(obj);
 
                   }
 
                   return newAl;
         }
}
           

7.1.7HashSet集合

|--Set:元素是無序(存入和取出的順序不一定一緻),元素不可以重複。、

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

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

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

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

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

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

         |--TreeSet:

Set集合的功能和Collection是一緻的。

練習七:HashSet集合練習

import java.util.*;
 
class HashSetDemo
{
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
         public static void main(String[] args)
         {
                  
                   HashSet hs = new HashSet();
 
                   sop(hs.add("java01"));
                   sop(hs.add("java01"));
                   hs.add("java02");
                   hs.add("java03");
                   hs.add("java03");
                   hs.add("java04");
 
                   Iterator it = hs.iterator();
 
                   while(it.hasNext())
                   {
                            sop(it.next());
                   }
         }
}
           

練習八:

import java.util.*;
/*
往hashSet集合中存入自定對象
姓名和年齡相同為同一個人,重複元素。
 
*/
class HashSetTest
{
         public static void sop(Object obj)
         {
                   System.out.println(obj);
         }
         public static void main(String[] args)
         {
                   HashSet hs = new HashSet();
 
                   hs.add(newPerson("a1",11));
                   hs.add(newPerson("a2",12));
                   hs.add(newPerson("a3",13));
//               hs.add(newPerson("a2",12));
//               hs.add(newPerson("a4",14));
 
                   //sop("a1:"+hs.contains(newPerson("a2",12)));
                           
//               hs.remove(newPerson("a4",13));
                  
 
                   Iterator it = hs.iterator();
 
                   while(it.hasNext())
                   {
                            Person p = (Person)it.next();
                            sop(p.getName()+"::"+p.getAge());
                   }
         }
}
class Person
{
         private String name;
         private int age;
         Person(String name,int age)
         {
                   this.name= name;
                   this.age= age;
         }
        
         public int hashCode()
         {
                   System.out.println(this.name+"....hashCode");
                   return name.hashCode()+age*37;
         }
 
         public boolean equals(Object obj)
         {
 
                   if(!(obj instanceof Person))
                            return false;
 
                   Person p = (Person)obj;
                   System.out.println(this.name+"...equals.."+p.name);
 
                   return this.name.equals(p.name) && this.age == p.age;
         }
 
        
         public String getName()
         {
                   return name;
         }
         public int getAge()
         {
                   return age;
         }
}