------- Java EE教育訓練、 java教育訓練、期待與您交流! ----------
1.Vector中的枚舉
枚舉就是Vector特有的取出方式。
發現枚舉和疊代器很像。其實枚舉和疊代是一樣的。
因為枚舉的名稱以及方法的名稱都過長,是以被疊代器取代了,枚舉郁郁而終了。
Vector中的方法與List集合中的方法大都相似,而Enumeration枚舉是Vector的特有方法。以下是Vector周遊的代碼示例:
public class VectorDemo {
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
Vector vec = new Vector();
vec.add("Java01");
vec.add("Java02");
vec.add("Java03");
vec.add("Java04");
for(Enumeration enu = vec.elements();enu.hasMoreElements();){
sop(enu.nextElement());
}
}
}
運作結果可想而知:
Java01
Java02
Java03
Java04
然而Vector現在已經被ArrayList所替代,是以通常我們不使用Vector集合。
2.LinkedList
LinkedList的特有方法:
addFirst();
addLast();
getFirst();
getLast();
擷取元素,但不删除元素,如果集合中沒有元素,會出現NoSuchElementException
removeFirst();
removeLast();
擷取元素,會删除元素,如果集合沒有元素,會出現NoSuchElementException
在JDK1.6出現了替代方法:
offerFirst();
offerLast();
peekFirst();
peekLast();
擷取元素,但不删除元素,如果集合中沒有元素,傳回Null。
pollFirst();
pollLast();
擷取元素,元素會被删除,如果集合沒有元素,傳回Null。
以下是示例代碼,注意,NoSuchELementException我用try,catch方法抓掉了:
import java.util.LinkedList;
import java.util.NoSuchElementException;
public class LinkedListDemo {
public static void sop(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
for(int i=0;i<2;i++){
if(i==0){
method_6();
}else{
method();
}
}
}
public static void method() {
LinkedList lList = new LinkedList();
lList.add("Java");
lList.addFirst("Java01");
lList.addLast("Java02");
sop("--原有方法--");
sop("添加後lList集合裡有:"+lList);
for(int i=0;i<2;i++){
if(i==0){
sop("擷取(get)第一個元素:"+lList.getFirst());
sop("擷取(get)最後一個元素:"+lList.getLast());
sop("最後剩下:"+lList);
sop("");
}else{
sop("擷取并移除(remove)第一個元素:"+lList.removeFirst());
sop("擷取并移除(remove)最後一個元素:"+lList.removeLast());
sop("最後剩下:"+lList);
sop("最後這麼搞:");
sop("連續兩次擷取并移除(remove)第一個元素:"+lList.removeFirst());
try{
sop(lList.removeFirst());
}catch(NoSuchElementException e){
sop("這裡NoSuchElementException異常抛出,我用try,catch抓了。");
}
}
}
}
public static void method_6(){
LinkedList lList = new LinkedList();
int iNum = 100;
sop("--1.6新方法--");
lList.add(iNum);
sop("offerFirst也可以這麼玩:"+lList.offerFirst("Java01"));
lList.offerLast("Java02");
sop("添加後lList集合裡有:"+lList);
for(int i=0;i<2;i++){
if(i==0){
sop("擷取(peek)第一個元素:"+lList.peekFirst());
sop("擷取(peek)最後一個元素:"+lList.peekLast());
sop("最後剩下:"+lList);
sop("");
}else{
sop("擷取并移除(poll)第一個元素:"+lList.pollFirst());
sop("擷取并移除(poll)最後一個元素:"+lList.pollLast());
sop("最後剩下:"+lList);
sop("最後這麼搞:");
sop("連續兩次擷取并移除(poll)第一個元素:"+lList.pollFirst());
sop("輸出:"+lList.pollFirst());
sop("========================================");
}
}
}
}
輸出結果如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX31EVPFTS61kMZpXT6VEVZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM5QDN1UTN0ETNyATM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我們針對LinkedList做個練習,要求如下:
使用LinkedList模拟一個堆棧或者隊列資料結構。
堆棧:先進後出 如同一個杯子
隊列:先進先出 FIFO(First in First out)如同一個水管
這裡是源代碼,需要注意的是,有些方法被分裝:
public class LinkedListTest {
public static void main(String[] args) {
Method med = new Method();
Scanner scan = new Scanner(System.in);
Method.sop("請輸入要輸入的字元串長度:");
int iFor = scan.nextInt();
Method.sop("請輸入字元串:");
for(int i=0;i<iFor;i++){
med.add(scan.next());
}
Method.sop("請輸入正反向(正向敲1,反向敲2):");
int iFlag = scan.nextInt();
Method.sop("結果為:");
med.result(iFlag);
}
}
class Method{
private LinkedList list;
Method(){
list=new LinkedList();
}
public void add(Object obj){
list.addFirst(obj);
}
public Object getQueue(){
return list.removeFirst();
}
public Object getStack(){
return list.removeLast();
}
public Boolean isNull(){
return list.isEmpty();
}
public void result(int iFlag){
while(!isNull()){
if(iFlag==1){
sop(getStack());
}else{
sop(getQueue());
}
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
以下是運作結果:
3.ArrayList
關于ArrayList呢,我們前面已經見過了,這裡就直接做練習:
練習1:去除ArrayList集合中的重複元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList aList = new ArrayList();
aList.add("Java01");
aList.add("Java02");
aList.add("Java03");
aList.add("Java01");
aList.add("Java02");
aList.add("Java01");
sop(aList);
aList = simpleElement(aList);
sop(aList);
}
public static ArrayList simpleElement(ArrayList al){
ArrayList newAl = new ArrayList();//new一個新的數組
//進行周遊判斷,并寫入新的數組
for(Iterator it = al.iterator();it.hasNext();){
Object object = it.next();
if(!newAl.contains(object)){
newAl.add(object);
}
}
return newAl; //傳回到主函數
}
public static void sop(Object obj){
System.out.println(obj);
}
}
運作結果為:
[Java01, Java02, Java03, Java01, Java02, Java01]
[Java01,Java02,Java03]
練習2:将自定義對象作為元素存到ArrayList集合中,并去除重複元素。
例如:存人對象,同姓名同年齡視為同一人,為重複元素
思路:
1.對人描述,将資料封裝進對象
2.定義容器,将人存入
3.取出。
依照思路一步一步來,我們得到以下代碼:
public class ArrayListPersonTest{
public static void main(String[] args) {
ArrayList aList = new ArrayList();
aList.add(new Person("ZhangSan",17));
aList.add(new Person("LiSi",21));
aList.add(new Person("Wangwu",22));
aList.add(new Person("Wangwu",22));
aList.add(new Person("ZhangSan",17));
aList = simpleElement(aList);
for(Iterator it = aList.iterator();it.hasNext();){
Person p = (Person)it.next(); //it.next()是Object類,需要進行強轉
sop("姓名:"+p.getsName()+",年齡:"+p.getiAge()); //調用get方法來擷取包裝内容
}
}
public static void sop(Object obj){
System.out.println(obj);
}
public static ArrayList simpleElement(ArrayList aList){
//建立一個緩存數組來進行比較
ArrayList temp = new ArrayList();
for(Iterator it = aList.iterator();it.hasNext();){
Object obj = it.next();
//判斷緩存數組裡面是否已經包含obj所含内容
if(!temp.contains(obj)){
temp.add(obj);
}
}
return temp;
}
}
class Person{
private String sName;
private int iAge;
Person(){}
Person(String sName,int iAge){
this.sName=sName;
this.iAge=iAge;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public int getiAge() {
return iAge;
}
public void setiAge(int iAge) {
this.iAge = iAge;
}
}
通過運作我們發現結果令人出乎意料——相同的項目并沒有被删除,也就是說我們的去除重複是失敗的。
這時,我們需要重寫equals方法
以下是重寫後的全部代碼:
public class ArrayListPersonTest{
public static void main(String[] args) {
ArrayList aList = new ArrayList();
aList.add(new Person("ZhangSan",17));
aList.add(new Person("LiSi",21));
aList.add(new Person("Wangwu",22));
aList.add(new Person("Wangwu",22));
aList.add(new Person("ZhangSan",17));
aList = simpleElement(aList);
for(Iterator it = aList.iterator();it.hasNext();){
Person p = (Person)it.next(); //it.next()是Object類,需要進行強轉
sop("姓名:"+p.getsName()+",年齡:"+p.getiAge()); //調用get方法來擷取包裝内容
}
}
public static void sop(Object obj){
System.out.println(obj);
}
public static ArrayList simpleElement(ArrayList aList){
//建立一個緩存數組來進行比較
ArrayList temp = new ArrayList();
for(Iterator it = aList.iterator();it.hasNext();){
Object obj = it.next();
//判斷緩存數組裡面是否已經包含obj所含内容
if(!temp.contains(obj)){
temp.add(obj);
}
}
return temp;
}
}
class Person{
private String sName;
private int iAge;
Person(){}
Person(String sName,int iAge){
this.sName=sName;
this.iAge=iAge;
}
//這裡需要重寫Object類中的equals方法
public boolean equals(Object obj){
//java中的instanceof運算符是用來在運作時指出對象是否是特定類的一個執行個體。
//instanceof通過傳回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個執行個體。
if(!(obj instanceof Person)){
return false;
}
Person p = (Person)obj;
//System.out.println(this.sName+"...."+p.sName);
//調用String的equals對比
return this.sName.equals(p.sName) && this.iAge==p.iAge;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public int getiAge() {
return iAge;
}
public void setiAge(int iAge) {
this.iAge = iAge;
}
}
通過運作,我們發現重複的去掉了,這是為什麼呢?
因為List集合判斷元素是否相同(無論是contains還是remove),依據是元素的equals方法。而在我們重寫之前,equals比的是Person的位址,因為Person是一個Object,每一個Person的位址都是new過的,位址值是不可能相同的。我們重寫的目的就是要調用String的equals來比較其值是否相同。
我們把
System.out.println(this.sName+"...."+p.sName);
的注釋取消掉。
結果為下圖:
可以發現,值與值在挨個比較,直到找到相同的為止。