JAVA常用集合框架用法詳解基礎篇二之Colletion子介面List
接著上一篇,接著講講集合的知識。上一篇講了Collection介面。它可以說是集合的祖先了,我們這一篇就說說它的子孫們。
一、Collection的子介面
List:有序(存入和取出的順序一致),元素都有索引(即角標),元素可以重複。
Set:元素不能重複,無序的。
首先講講List。
A、List特有的常見方法(都有一個共性的特點就是可以操作角標)。List介面是可以完成對元素的增刪改查,List介面的實現是通過子類來完成:
現在我們初始化一個List介面:List ll=new ArrayList();
接下來說說List的主要常用的方法。
1、新增(通過索引的位置來新增元素)
void add(index,element);
void add(index,Collection)
//List特有的取出方式之一
for(inti=0;i<ll.size();i++){
System.out.println(ll.get(i));
}
2、刪除(刪除相應索引位置的元素)
Object remove(index);//返回被刪除的元素
3、修改(修改指定索引位置的元素,並返回修改前的元素)
ObjectSet(index,element)//返回被修改的元素
4、獲取:
Object get (index);
int IndexOf(object);//返回此列表中第一次出現指定元素的索引,如果此列表不包含該素,則返回-1.
int lastIndexOf(object);//返回此列表中最後一次出現指定的元素,如果此列表不包含該元素,則返回-1.
List subList(int from,int to);//包含頭,不包含尾,獲取子列表。
測試程式程式碼如下:
程式碼如下:
package com.wq.list;
/**
* 新增一個課程類,提供課程的選擇
* @author LULEI
*
*/
public class Courses {
private String id;//課程式號
private String name;//課名
public Courses(){
}
public Courses(String id,String name){
this.setId(id);
this.setName(name);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//測試List的一些方法:
package com.wq.list;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class ListTest {
//用於存放備選課程的List
public List courseToSelect;
public ListTest(){
this.courseToSelect=new ArrayList();
}
//用於courseToSelect新增備選課程
public void testAdd(){
//建立一個課程的例項,並通過使用add方法,將該例項
//新增到備選課程List中
Courses cr1=new Courses("1", "資料庫");
courseToSelect.add(cr1);//將課程新增到備選課程List中
Courses temp=(Courses)courseToSelect.get(0);//選取List列表中的第一個元素
System.out.println("添加了課程:"+temp.getId()+"."+temp.getName());
Courses cr2=new Courses("2","JAVA");
courseToSelect.add(0, cr2);
Courses temp2=(Courses)courseToSelect.get(0);
System.out.println("添加了課程:"+temp2.getId()+"."+temp2.getName());
/*
* 下面程式碼會出現越界的異常
Courses cr3= new Courses("4", "test");
courseToSelect.add(4,cr3);
//Courses cr3=(Courses)courseToSelect.get(4);
//System.out.println("添加了課程:"+cr3.getId()+"."+cr3.getName());
*
*/
Courses cr7=new Courses("1", "資料庫");
courseToSelect.add(cr7);//將課程新增到備選課程List中
Courses temp7=(Courses)courseToSelect.get(2);//選取List列表中的第一個元素
System.out.println("添加了課程:"+temp7.getId()+"."+temp7.getName());
//addAll()方法的使用
Courses[] cr3={new Courses("3","高數"),new Courses("4","英語")};
courseToSelect.addAll(Arrays.asList(cr3));//將陣列轉換成List集合
Courses temp3=(Courses)courseToSelect.get(3);
Courses temp4=(Courses)courseToSelect.get(4);
System.out.println("添加了兩門課:"+temp3.getId()+"."+temp3.getName()
+temp4.getId()+"."+temp4.getName());
Courses[] cr4={new Courses("5","高等語文"),new Courses("6","資料處理")};
courseToSelect.addAll(2,Arrays.asList(cr4)); //將陣列轉換成List集合
Courses temp5=(Courses)courseToSelect.get(2);
Courses temp6=(Courses)courseToSelect.get(3);
System.out.println("添加了兩門課:"+temp5.getId()+"."+temp5.getName()
+temp6.getId()+"."+temp6.getName());
}
/**
* 建立一個Get方法,用於獲取List中的元素的方法
*/
public void testGet(){
int num=courseToSelect.size();//獲取List的長度
System.out.println("可以選擇的課程如下:");
for(int i=0;i<num;i++){
Courses cr=(Courses) courseToSelect.get(i);
System.out.println(cr.getId()+"."+cr.getName());
}
}
/**
* 使用迭代器的方法來獲取List中的元素
* @param args
*/
public void testIterator(){
//迭代器是個藉口,依賴集合存在
Iterator i=courseToSelect.iterator();
System.out.println("可以選擇的課程如下(通過迭代器實現的):");
while(i.hasNext()){
Courses cr=(Courses)i.next();
System.out.println(cr.getId()+"."+cr.getName());
}
}
/**
* 使用for each的方法來獲取List中的元素
* @param args
*/
public void testForEach(){
System.out.println("可以選擇的課程如下(通過foreach實現的):");
for(Object obj:courseToSelect){
Courses cr=(Courses)obj;
System.out.println(cr.getId()+"."+cr.getName());
}
}
/**
* 通過set()方法來修改List元素
* @param args
*/
public void testModify(){
courseToSelect.set(4, new Courses("7", "毛概"));
}
/**
* 學會使用remove()方法來刪除List中的元素
* 這種方法的引數是obj,還有一種remove方法的引數是索引、
* 如:remove(4);即可獲得同樣的效果
* @param args
*/
public void testRemove(){
Courses cr=(Courses) courseToSelect.get(4);
System.out.println("將要刪除的課程是:"+cr.getId()+"."+cr.getName());
courseToSelect.remove(cr);
System.out.println("課程已刪除");
testForEach();
}
/**
* 使用removeAll()方法來刪除多個List中的物件
* @param args
*/
public void testRemoveAll(){
Courses[] crs={(Courses) courseToSelect.get(4),
(Courses) courseToSelect.get(5)};
//removeAll的引數是一個集合,所以要將
//Courses陣列轉換成集合List
courseToSelect.removeAll(Arrays.asList(crs));
testForEach();
}
/**
* 建立一個奇怪的方法,用來給List新增字串
* @param args
*/
public void testAddString(){
System.out.println("到底能不能新增字串呢!!");
courseToSelect.add("這是一個很無辜的字串");
}
public static void main(String[] args){
ListTest lt=new ListTest();
lt.testAdd();
lt.testGet();
lt.testIterator();
lt.testAddString();
lt.testForEach();
// lt.testModify();
// lt.testForEach();
// lt.testRemove();
// lt.testRemoveAll();
}
}
注意上面的例子我沒有使用Iterator迭代器,而是使用了foreach語句。不過,接下來我們看看一個使用迭代器遍歷集合出錯的程式碼:
主要程式碼如下:
..........
ll.add(“qwe1”);
ll.add(“qwe2”);
ll.add(“qwe3”);
Iterator it=ll.iterator();//獲取List集合的迭代器的物件
while(it.hasnext()){
Object obj=it.next();
if(obj.equals(“qwe2”)){
ll.add(“abc9”);//在迭代器中給集合新增元素
}
else{
System.out.println(“next:”+obj);//列印元素
}
}
以上就是一段程式碼,但是在執行while迴圈中會出現異常:Java.util.concurrentModificationException。主要的原因是:在迭代器過程中,不要直接使用集合來操作元素,容易丟擲異常。怎麼解決呢???我們可以使用Iterator的子介面ListIterator來完成在迭代器中對元素進行更多的操作。
更換程式碼如下:
ll.add(“qwe1”);
ll.add(“qwe2”);
ll.add(“qwe3”);
ListIterator it=ll.listiterator();//獲取List集合的迭代器的物件
while(it.hasnext()){
Object obj=it.next();
if(obj.equals(“qwe2”)){
it.add(“abc9”);//迭代器物件進行新增元素
}
else{
System.out.println(“next:”+obj);//列印元素
}
}
好,使用ListIterator就可以實現修改集合的操作。我們可以在迭代器中完成增加和刪除的操作,修改後的結果會直接對映到集合中的。
B、List的子類總結
Vector:內部是陣列資料結構,是同步的(即執行緒安全的)。增刪修改查詢都很慢。(不常用)
ArrayList:內部是陣列資料結構的,是不同步的。替代了Vector,查詢的速度快。
LinkedList:內部是雙向連結串列的資料結構,是不同步的。增刪元素的速度非常快。
這裡我們做一個練習:使用LinkedList來模擬一個堆疊和佇列的資料結構。
堆疊:先進後出(First In Last Out)FILO
佇列:先進先出(First In First Out)FIFO
我們應該描述這樣一個容器,給使用者提供一個容器物件完成這兩種結構的一種。LinkedList(可以實現佇列和堆疊的功能)常用的方法如下:
---新增
addFirst();
addLast();//從jdk1.6後改成 offerFirst(),和offerLast();
---獲取
getFirst();//獲取但不移除,如果連結串列為空。丟擲NoSuchElementException
getLast();
從jdk1.6後上面兩個改成:
peekFirst();//獲取但不移除,如果連結串列為空,則返回null
peekLast();
---刪除
removeFirst();//獲取,且移除當前的元素。如果連結串列為空。丟擲NoSuchElementException
removeLast();
從jdk1.6後上面兩個改成:
poolFirst();//獲取且移除當前的元素,如果連結串列為空,則返回null
poolLast();
程式碼的實現如下:
///佇列類
package com.wq.linkedlist;
import java.util.LinkedList;
import java.util.List;
public class DuiLie {
//這個類是實現佇列的功能的
LinkedList ls=new LinkedList();//內部是連結串列結構的list
public DuiLie(){
}
public void addElement(Object obj){
//ls.addLast(obj);//在後面新增元素
ls.offerLast(obj);//jdk1.6版本後的在後面新增元素方法
System.out.println(obj+"已經加入佇列");
}
public void removeElement(){
Object obj=ls.pollFirst();//jdk1.6版本的刪除最前面的元素,取代了removeFirst()方法
System.out.println(obj+"已經出佇列");
}
}
///堆疊類
package com.wq.linkedlist;
import java.util.LinkedList;
public class DuiZhan {
//這個類是實現堆疊的功能的
LinkedList ls=new LinkedList();//內部是連結串列結構的list
public DuiZhan(){
}
public void addElement(Object obj){
//ls.addLast(obj);//在後面新增元素
ls.offerLast(obj);//jdk1.6版本後的在後面新增元素方法
System.out.println(obj+"已經加入堆疊");
}
public void removeElement(){
Object obj=ls.pollLast();//jdk1.6版本的刪除最前面的元素,取代了removeLast()方法
System.out.println(obj+"已經退出堆疊");
}
}
/////測試上述兩個類
package com.wq.linkedlist;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
DuiZhan dz=new DuiZhan();//例項化堆疊的物件
DuiLie dl=new DuiLie();//例項化佇列的物件
//實現堆疊的功能
System.out.println("實現堆疊的功能");
dz.addElement(111);
dz.addElement(222);
dz.addElement(333);
dz.addElement(444);
dz.removeElement();
dz.removeElement();
dz.removeElement();
dz.removeElement();
System.out.println();
//實現佇列的功能
System.out.println("實現佇列的功能");
dl.addElement(111);
dl.addElement(222);
dl.addElement(333);
dl.addElement(444);
dl.removeElement();
dl.removeElement();
dl.removeElement();
dl.removeElement();
}
}
執行結果如下:
實現堆疊的功能
111已經加入堆疊
222已經加入堆疊
333已經加入堆疊
444已經加入堆疊
444已經退出堆疊
333已經退出堆疊
222已經退出堆疊
111已經退出堆疊
實現佇列的功能
111已經加入佇列
222已經加入佇列
333已經加入佇列
444已經加入佇列
111已經出佇列
222已經出佇列
333已經出佇列
444已經出佇列
C、ArrayList集合存數自定義物件
1、這裡,我要提一下。集合裡儲存的都是物件的引用(就是物件在堆中的絕對地址的值),迭代器裡迭代的也是集合中的物件引用。
程式碼如下:
package com.wq.arraylist;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.wq.person.Person;
/**
* 該類主要完成 去除ArrayList中的重複元素
* @author LULEI
*
*/
public class testArrayList {
public static void main(String[] args) {
// TODO Auto-generated method stub
List li=new ArrayList();
testDemo1(li);
}
public static void testDemo1(List li) {
//測試傳統的物件
/*
li.add("111");
li.add("111");
li.add("222");
li.add("333");
li.add("444");
li.add("333");
*/
/*
* 測試新增自定義的物件Person
*/
li.add(new Person("wq1",21));
li.add(new Person("wq2",22));
li.add(new Person("wq1",21));
li.add(new Person("wq3",23));
li.add(new Person("wq2",22));
li.add(new Person("wq3",23));
System.out.println(li);
//呼叫換取單個元素的方法
li=getSingelElement(li);
System.out.println(li);
}
public static List getSingelElement(List li) {
// TODO Auto-generated method stub
List temp=new ArrayList();//新建一個List
for(Iterator it=li.iterator();it.hasNext();){
Object obj=it.next();
if(!temp.contains(obj)){//如果不包含該元素
temp.add(obj);//新增到新的List中
}
}
return temp;
}
}
這裡就先這樣,下一篇將介紹Set介面。