Java基础_集合框架1
一、集合框架(體系概述)
為什么會出現集合框架(集合類)?
面向對象語言對事物的體現都是以對象的形式,所以為了方便對多個對象的操作,就對對象進行存儲,集合就是存儲對象最常用的一種方式。
數組和集合框架是容器,有何不同?
數組雖然也可以存儲對象,但長度是固定的;集合長度可變。數組中可以存儲基本數據類型,集合只能存儲對象。
集合框架的特點:
集合只用于存儲對象,集合長度可變,集合可以存儲不同類型的對象。
?
為什么會出現這么多容器呢?
因為每一個容器對數據的存儲方式不同。這個存儲方式稱之為:數據結構。
二、集合框架(共性方法)
/*集合框架(共性方法):1.add方法的參數類型是Object,以便接受任意類型的對象 2.集合中存儲的都是對象的引用(地址)。*/ import java.util.*; class CollectionDemo {public static void main(String[] args) {base_method();base_method_2(); }public static void base_method(){//創建一個集合容器。使用Collection接口的子類ArrayListArrayList a1=new ArrayList();a1.add("java01");//添加元素 add(Object obj);a1.add("java02");a1.add("java03");a1.add("java04");sop("原集合:"+a1);//打印sop("java03是否存在:"+a1.contains("java03"));sop("集合是否為空? "+a1.isEmpty());sop("size:"+a1.size());//獲取集合長度。a1.remove("java02");//移除java02sop("刪除java02后的集合:"+a1);//打印a1.clear();//清空集合sop("清空后的集合:"+a1);//打印}public static void base_method_2(){ArrayList a1=new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");a1.add("java04");ArrayList a2=new ArrayList();a2.add("java01");a2.add("java02");a2.add("java05");a2.add("java06");a1.retainAll(a2);//a1中存放和a2的交集sop("a1:"+a1);sop("a2:"+a2);a1.removeAll(a2);//移除a1中a2存在的所有元素sop("a1:"+a1);sop("a2:"+a2);}public static void sop(Object obj){System.out.println(obj);} }
三、集合框架(迭代器)
迭代器:集合的取出元素的方式。
/* 迭代器: 集合的取出元素的方式。 */ import java.util.*; class CollectionDemo {public static void main(String[] args) {method_get();}public static void method_get(){ArrayList a1=new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");a1.add("java04");/*Iterator it=a1.iterator();//獲取迭代器,用于取出集合中的元素。while(it.hasNext()){sop(it.next());}*/for(Iterator it=a1.iterator();it.hasNext();)//及時釋放Iterator{sop(it.next());}}public static void sop(Object obj){System.out.println(obj);} }
四、集合框架(List集合共性方法)
/* Collection|--List:元素是有序的,同時元素可以重復,因為該集合體系有索引。|--Set:元素是無序的,元素不可重復,因為該集合體系有沒有索引。List: 特有方法。凡是可以操作角標的方法都是該體系特有的方法: 增:add(index,element); addAll(index,element); 刪:remove(index); 改:set(intdex,element); 查:get(intdex);subList(from,to);ListIterator();*/ import java.util.*; class ListDemo {public static void main(String[] args) {ArrayList a1=new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");a1.add("java04");sop("原集合:"+a1);a1.add(1,"java09");//在指定位置添加sop(a1);a1.remove(2);sop(a1);a1.set(2,"java007");//在指定位置修改sop(a1);sop("get{2}:"+a1.get(2));//在指定位置獲取for(int i=0;i<a1.size();i++)//獲取全部{System.out.println("a["+i+"]="+a1.get(i));}Iterator it=a1.iterator();while(it.hasNext())//用迭代器{sop("next:"+it.next());}//通過indexOf獲取對象的位置sop("index:"+a1.indexOf("java02"));List sub=a1.subList(1,3);sop("sub:"+sub);}public static void sop(Object obj){System.out.println(obj);} }
五、集合框架(ListIterator)
/* Collection|--List:元素是有序的,同時元素可以重復,因為該集合體系有索引。|--Set:元素是無序的,元素不可重復,因為該集合體系有沒有索引。List: 特有的迭代器。ListIterator是Iterator的子接口。 在迭代時,不可以通過集合對象的方法操作集合中的元素,因為會發生 java.util.ConcurrentModificationException異常。 所以在迭代器時,只能用迭代其的方法操作元素,可是Iterator方法是有限的。 如果想要其它的操作如:添加,修改等,就需要使用其自接口ListIterator。 該接口只能通過List集合的listIterator方法獲取。*/ import java.util.*; class ListDemo {public static void main(String[] args) {//演示列表迭代器ArrayList a1=new ArrayList();a1.add("java01");a1.add("java02");a1.add("java03");a1.add("java04");sop(a1);ListIterator li=a1.listIterator();while(li.hasNext()){Object obj=li.next();if(obj.equals("java02"))li.add("java009");}sop("hasNext():"+li.hasNext());sop("hasPrevious():"+li.hasPrevious());sop(a1);/*//在迭代過程中準備添加或刪除元素Iterator it=a1.iterator();while(it.hasNext())//用迭代器{Object obj=it.next();if(obj.equals("java02"))//a1.add("java008");it.remove();//將java02的引用從集合中移除sop("obj="+obj);}sop(a1);*/}public static void sop(Object obj){System.out.println(obj);} }
六、集合框架(List集合具體對象的特點)
Collection
|--List:元素是有序的,同時元素可以重復,因為該集合體系有索引。
|--ArrayList:底層的數據結構使用數組。特點:查詢速度很快。但是增刪稍慢。線程不 同步。
|--LinkedList:底層的數據結構使用鏈表。特點:增刪速度很快,查詢稍慢。
|--Vector:底層是數組數據結構。線程同步。被ArrayList替代。
七、集合框架(Vector中的枚舉)
/* 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());}} }
八、集合框架(LinkedList)
/* LinkedList特有方法: addFirst(): addLast(): 添加元素getFirst(): getLast(): 獲取元素,但不刪除元素removeFirst(): removeLast(): 獲取元素,刪除元素。如果集合中沒有元素,會出現NoSuchElementException異常。所以在JDK1.6出現了替代方法: offerFirst() offerLast() 添加元素peekFirst() peekLast() 獲取元素,但不刪除元素。如果集合中沒有元素,會出返回nullpollFirst() pollLast() 獲取元素,刪除元素。如果集合中沒有元素,會出返回null*/ import java.util.*; class LinkedListDemo {public static void main(String[] args) {LinkedList link1=new LinkedList();link1.addFirst("java01");link1.addFirst("java02");link1.addFirst("java03");link1.addFirst("java04");sop("link1="+link1);LinkedList link2=new LinkedList();link2.addLast("java01");link2.addLast("java02");link2.addLast("java03");link2.addLast("java04");sop("link2="+link2);sop(link2.getFirst());sop(link2.getLast());sop("size="+link2.size());sop(link2.removeFirst());//如果列表為空,會拋出null異常sop(link2.removeLast());sop("size="+link2.size());while(!link2.isEmpty())//全部獲取{sop(link2.removeFirst());}}public static void sop(Object obj){System.out.println(obj);}}
九、集合框架(LinkedList練習)
/* 使用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.removeLast();//堆棧:return link.removeFirst();}public boolean isNull(){return link.isEmpty();} } class LinkedListTest {public static void main(String[] args) {DuiLie d1=new DuiLie();d1.myAdd("java01");d1.myAdd("java02");d1.myAdd("java03");d1.myAdd("java04");while(!d1.isNull()){System.out.println(d1.myGet());}} }
十、集合框架(ArrayList練習)
/* 去除ArrayList集合中重復的元素。 */ import java.util.*; class ArrayListTest {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {ArrayList a1=new ArrayList();a1.add("java01");a1.add("java01");a1.add("java03");a1.add("java02");a1.add("java03");a1.add("java04");a1.add("java04");a1.add("java04");sop("原數據:"+a1);sop("去除重復元素:"+singleElement(a1));}public static ArrayList singleElement(ArrayList a1){//定義一個臨時容器ArrayList a2=new ArrayList();Iterator it=a1.iterator();while(it.hasNext())//next()調用一次,就hasNext()判斷一次。{Object obj=it.next();if(!a2.contains(obj))a2.add(obj);}return a2;} }
十一、集合框架(HashSet)
/* |--Set:元素是無序的,元素不可重復,因為該集合體系有沒有索引。|--HashSet:底層數據結構是哈希表。|--TreeSet:Set集合的功能和Collection是一致的。 */ 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());}} }
十二、集合框架(HashSet存儲自定義對象)
/* 給hashSet集合中存入自定義對象。 比如:存人對象。同姓名同齡人,視為同一個人。為重復元素。HashSet是如何保證元素唯一性的呢? 那是通過元素的兩個方法:hashCode和equals來完成的 如果元素的hashCode值相同,才會判斷equals是否為true。 如果元素的hashCode值不相同,不會調用equals */ import java.util.*; 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;}public int hashCode()//重寫Object類的hashCode方法{System.out.println(this.name+"....hashCode");return 60;}public boolean equals(Object obj)//重寫Object類的equals方法{if(!(obj instanceof Person))return false;Person p=(Person)obj;System.out.println(this.name+".....equals....."+p.name);//測試contains調用equalsreturn this.name.equals(p.name)&&this.age==p.age;} } class HashSetDemo {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {HashSet hs=new HashSet();hs.add(new Person("a1",11));hs.add(new Person("a2",12));hs.add(new Person("a3",13));hs.add(new Person("a2",12));Iterator it=hs.iterator();while(it.hasNext()){Person p=(Person)it.next();sop("姓名:"+p.getName()+"\t年齡:"+p.getAge());}} }
?
hashCode改進后:
public int hashCode()//重寫Object類的hashCode方法 {System.out.println(this.name+"....hashCode");return this.name.hashCode()+age*13;//age*13是確保唯一性。 }?
十三、集合框架(HashSet判斷和刪除的依據)
/* 注意,對于判斷元素是否存在以及刪除等操作,依賴元素的 hashCode和equals方法。 */ import java.util.*; 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;}public int hashCode()//重寫Object類的hashCode方法{System.out.println(this.name+"....hashCode");return this.name.hashCode()+age*13;}public boolean equals(Object obj)//重寫Object類的equals方法{if(!(obj instanceof Person))return false;Person p=(Person)obj;System.out.println(this.name+".....equals....."+p.name);//測試contains調用equalsreturn this.name.equals(p.name)&&this.age==p.age;} } class HashSetDemo {public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {HashSet hs=new HashSet();hs.add(new Person("a1",11));hs.add(new Person("a2",12));hs.add(new Person("a3",13));hs.add(new Person("a2",12));hs.remove(new Person("a3",13));//刪除元素sop("a1:"+hs.contains(new Person("a1",11)));//獲取元素是否存在Iterator it=hs.iterator();while(it.hasNext()){Person p=(Person)it.next();sop("姓名:"+p.getName()+"\t年齡:"+p.getAge());}} }總結
以上是生活随笔為你收集整理的Java基础_集合框架1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uIP1.0 主动发送的问题理解
- 下一篇: php获取图片格式(图片后缀)