黑馬程式設計師 Java集合框架Collection
1.面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行儲存,集合就是儲存物件最常用的一種方式。
2.陣列和集合類同是容器,有何不同:
陣列雖然也可以儲存物件,但長度是固定的,集合長度是可變的。
陣列中可以儲存基本資料型別,集合只能儲存物件。
3.集合類的特點:集合只用於儲存物件,集合長度是可變的,集合可以儲存不同型別的物件。
4.每一個容器對資料的儲存方式都有不同。這個儲存方式我們稱之為資料結構。
集合中德共性方法。
1.增加:boolean add(E e) ; 新增元素方法。
2.刪除:boolean remove(Object o) ;
boolean removeAll(Collection<?> c); 移除一堆元素。
void clear(); 清空集合中的元素。
3.查:Iterator<E> iterator(); 返回在此collection的元素上進行迭代的迭代器。
4.長度: int size(); 返回集合中元素的大小。
5. Object[] toArray() ; 把集合轉成陣列。
Collection
|--List:元素是有序的,元素可以重複。因為該集合體繫有索引。
|--ArrayList:底層的資料結構使用的是陣列結構。特點:查詢速度很快。但是增刪稍慢。執行緒不同步。
|--LinkedList :底層使用的是連結串列資料結構。特點:增刪的速度很快,查詢速度慢。
|--Vector:底層是陣列資料結構。執行緒同步。被ArrayList替代了.
|--Set:元素是無序的。元素不可以重複。
二 List集合
List:特有方法。凡是可以操作腳標的方法都是該體系特有的方法。
增: add(index,element);
addAll(index Collection)
刪 : remove(index)
改 : set(index,elements);
查 : get(index);
subList(from,to);
listIterator();
package Collection;
import java.util.*;
public class CollectionDemo {
public static void main(String[] args){
method_2();
}
public static void method_2(){
ArrayList al = new ArrayList();
//新增元素
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
ArrayList al2 = new ArrayList();
//新增元素
al2.add("java03");
al2.add("java04");
al2.add("java05");
al2.add("java06");
//取兩個集合中的交集,al中只保留交集元素
// al.retainAll(al2);
// sop(al);
//移除兩個集合交集的元素。
al.removeAll(al2);
sop(al);
}
public static void method_1(){
ArrayList al = new ArrayList();
//新增元素
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
sop(al); //列印集合中的元素
sop("size:"+al.size()); //列印集合長度
al.remove("java01"); //刪除元素
sop("size:"+al.size());
sop(al);
al.clear(); //清空集合中的元素。
sop(al);
}
public static void sop(Object o){
System.out.println(o);
}
}
在迭代時,不可以通過集合物件的方法操作集合中的元素。因為會發生ConcurrentModificationException異常。
所以在迭代時,只能用迭代器的方法操作元素,可是Iterator方法是有侷限性的。只能對元素進行判斷,取出,刪除的操作。
如果想要其他的操作如新增,修改等,就需要使用其子介面:ListIterator。
該介面只能通過List集合的listIterator方法獲取。
列舉就是Vector特有的取出方式。發現列舉和迭代器很像。
其實列舉和迭代是一樣的。
因為列舉的名稱以及方法的名稱都過長,所以被迭代器取代了。
LinkedList類:
特有方法:
增:
addFirst(E e); 將指定元素插入此列表的開頭。
addLast(E e); 將指定元素新增到此列表的結尾。
刪:
removeFirst() ;移除並返回此列表的第一個元素。若列表為空,則丟擲NosuchElementException異常
removeLast(); 移除並返回此列表的最後一個元素。同上的異常
獲取:
getFirst(); 返回此列表的第一個元素。 若列表為空,則丟擲NosuchElementException異常
getLast(); 返回此列表的最後一個元素。
LinkedList升級後的方法:
增加 :
offerFirst();
offerLast();
獲取:
peekFirst(); 若列表為空,返回null;
peekLast(); 若列表為空,返回null;
刪除:
poolFirst(); 若列表為空,返回null;
poolLast(); 若列表為空,返回null;
三 Set集合
1.Set:元素是無序(存入和取出的順序不一定一致),元素不可以重複。
|--HashSet:底層資料結構是雜湊表。執行緒不同步
HashSet是如何保證元素的唯一性的呢?
是通過元素的兩個方法,hashCode和equals來完成。
如果元素的HashCode值相同,才會判斷equals是否為true。
如果元素的HashCode不同。就不會呼叫equals方法。
注意:對於判斷元素是否存在,以及刪除等操作,依賴的方法是元素的hashcode和equals方法。
|--TreeSet:底層資料結構是二叉樹。保證元素唯一性的依據。
TreeSet排序的第一種方式:讓元素自身具備比較性。元素需要實現Comparable介面,覆蓋compareTo方法。這種方式也成為元素的自然順序,或者叫做預設順序。
TreeSet的第二種排序方式。當元素自身不具備比較性時,或者具備的比較性不是所需要的。這時就需要讓集合自身具備比較性。在集合初始化時,就有了比較方式。
特點:可以對Set集合中的元素進行排序。
當兩種排序都存在時,以比較起為主。
記住,當排序時,當主要條件相同時,一定要判斷一下次要條件。
2.Set集合的功能和Collection是一致的。
3.Set集合取出方式只有一種就是迭代器。
雜湊表:
1)雜湊表是按照雜湊值的大小進行排列的,如果兩個雜湊值不同,則大的值放後面;如果兩個雜湊值相同,則再用equals方法比較兩個元素的物件是否相同,如果不同,則將第二個值順延,兩個值串起來,放在同一個位置上。
2)取值時是按照雜湊值取出來的。
HashSet示例
package Collection;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
public static void main(String[] args){
HashSet hs = new HashSet();
hs.add(new Person("java01",11));
hs.add(new Person("java02",12));
hs.add(new Person("java01",11));
hs.add(new Person("java03",13));
for(Iterator it =hs.iterator();it.hasNext();){
Person p = (Person)it.next();
System.out.println(p.getName()+"......"+p.getAge());
}
}
}
class Person {
private String name;
private int age;
//定義構造方法,在學生建立時就賦予它基本資訊(名字,成績,總成績)
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
//重寫hashCode方法
public int hashCode(){
System.out.println(this.name+".....hashcode");
return 60;
}
public boolean equals(Object o){
if(! (o instanceof Person))
return false;
Person p = (Person)o;
System.out.println(this.name+"equals"+p.name);
return this.name.equals(p.name)&&this.age==p.age;
}
}
TreeSet排序示例
package Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args){
//第二種排序方式。就是讓集合具有可比性
TreeSet ts = new TreeSet(new Mycomparator());
ts.add(new Student("java01",40));
ts.add(new Student("java073",55));
ts.add(new Student("java02",20));
ts.add(new Student("java01",35));
ts.add(new Student("java013",55));
ts.add(new Student("java03",55));
for(Iterator it = ts.iterator();it.hasNext();){
Student s =(Student)it.next();
System.out.println(s.getName()+"........."+s.getAge());
}
}
}
//第一種排序方式。讓元素自身實現可比性。
class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
Student(){
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
@Override
public int compareTo(Object o) {
if(!(o instanceof Student))
throw new RuntimeException("型別不匹配");
Student s = (Student)o;
int num = new Integer(this.age).compareTo(new Integer(s.getAge()));
if(num==0)
return this.name.compareTo(s.getName());
return num;
}
}
class Mycomparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
Student s = (Student)o1;
Student s2 = (Student)o2;
int num = new Integer(s.getAge()).compareTo(new Integer(s2.getAge()));
if(num==0)
return s.getName().compareTo(s2.getName());
return num;
}
}