---------------------- 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教育訓練、期待與您交流! ----------------------