1. 程式人生 > >Java實用方法整理(五)——集合類常用方法

Java實用方法整理(五)——集合類常用方法

1,集合概述

(1)集合的由來

Java是面向物件的語言,而面嚮物件語言對事物的描述是通過物件體現的,為了方便對多個物件進行操作,我們必須把多個物件進行儲存。已有的容器型別有:陣列和StringBuffer。但是,StringBuffer的結果是一個字串,不一定滿足我們的要求,所以我們只能選擇陣列,這就是物件陣列。而物件陣列又不能適應變化的需求,因為陣列的長度是固定的,此時,為了適應變化的需求,Java就提供了集合類。

(2)陣列和集合區別

1)長度區別

陣列的長度固定;集合長度可變

2)內容不同

陣列儲存的是同一種類型的元素;集合可以儲存不同型別的元素

3)元素的資料型別問題

陣列可以儲存基本資料型別,也可以儲存引用資料型別;集合只能儲存引用型別。

(3)集合的分類

儲存多個元素會有不同的需求,針對這些不同的需求,Java就提供了不同的集合類。下邊列出了常用的集合類別:

  • Collection概述:它是Collection層次結構中的根介面。Collection表示一組物件,這些物件也稱為collection的元素。一些collection允許有重複的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。           
  1. 集合所用的迭代器是Iterator,具體用法:Iterator it = c.iterator(); 其中c表示集合物件
  • List概述:它的型別也是介面,稱為有序的collection(也稱為序列)(注意:這裡所說的集合不是說List集合中元素從小到大或者從大到小排列,而是說,元素“出”集合的順序和“進”集合的順序是一樣的)。使用此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素;與set不同,列表List通常允許重複的元素。 

2,集合常用的方法

(1)Collection常用的方法

  • add(E e)  新增元素
  • clear() 暴力清楚集合中所有元素
  • contains(Object o) 返回值型別:boolean。判斷集合是否包含某個元素
  • isEmpty() 返回值型別:boolean。判斷集合是否還有元素,有就返回true
  • iterator() 迭代器。返回值型別:Iterator
  • size() 返回值型別:int。返回集合中的元素數

(2)List集合(列表)特有且常用的方法

  • 新增功能

  void add(int index,Object element):在指定位置新增元素

List list = new ArrayList();
list.add("我");
list.add("愛");
list.add("你");
list.add(1,"很");//沒有問題
//list.add(3."很")//沒有問題
//list.add(10,"很")//有問題,提示“越界新增”
System.out.println(list);//輸出:[我,很,愛,你]//注意:在索引位置1處新增元素,並不是覆蓋掉原來位置的元素
  • 獲取功能

Object get(int index):獲取指定位置的元素

List list = new ArrayList();
list.add("我");
list.add("愛");
list.add("你");
//下面這段程式碼展示List中特有的遍歷方法:應用size()和get()方法
for(int i = 0;i<list.size();i++){
   String s = (String)list.get(i);
   System.out.println(s);
}
  • 列表迭代器

ListIterator listIterator():List集合特有的迭代器。該迭代器繼承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。

特有功能:Object previous():獲取上一個元素;boolean hasPrevious():判斷是否有元素。

注意:ListIterator可以實現逆向遍歷,但是必須先正向遍歷,才能逆向遍歷,所以一般無意義,不使用該方法進行集合的迭代。

下面這段程式碼展示了ListIterator的一個應用,同時該段程式碼也是一個關於ListIterator的一個面試題,值得學習

/*需求:有如下集合,請判斷該集合裡面是否包含“java”這個元素,如果有,就新增一個“love”元素
*
*/

List list = new ArrayList();
list.add("hello");
list.add("java");
list.add("world");

/* 1,展示一個會出錯的程式碼
* 出錯提示:ConcurrentModificationException:當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。
* 也就是說:迭代器遍歷元素的時候,通過集合是不能修改元素的
*/
Iterator it = list.iterator();
while(it.hasNext()){
	String s = (String)it.next();
	if(s.equals("java")){
		list.add("love");
	}
}

System.out.println(list);

/* 2,當遇到以上錯誤時,給出兩種解決辦法
* 首先展示第一種解決辦法:使用ListIterator的add()方法
*/

ListIterator lit = list.listItertor();
while(lit.hasNext()){
	String s = (String)lit.next();
	if(s.equals("java")){
		lit.add("love");//注意:此處是利用迭代器進行新增元素,剛新增的元素處於剛才迭代的元素的後面。
	}
}

/* 3,給出另一種解決辦法:
* 使用普通迴圈方法,即使用get()和size()的方法
*/
for(int i = 0;i<list.size();i++){
	String s = (String)list.get(i);
	if(s.equals("java")){
		list.add("love");//注意:此處是將新的元素新增到了集合的最後
	}
}
  • 刪除功能

            Object remove(int index):根據索引刪除元素,返回被刪除的元素

  • 修改功能

            Object set(int index,Object element):根據索引修改元素,返回被修改的元素

 (3)List子類特點(面試題)

  •  ArrayList:底層資料結構是陣列,查詢快,增刪慢;執行緒不安全,效率高。
  • Vector:底層資料結構是陣列,查詢快,增刪慢;執行緒安全,效率低。現在已不常用
  • LinkedList:底層資料結構是連結串列,查詢慢,增刪快。執行緒不安全,效率高。

(4)LinkedList的特有功能:

  • 新增功能

        public void addFirst(Object e)

        public void addLast(Object e) //和add()功能一樣,所以不常用此方法

  • 獲取功能

        puclic Object getFirst()

        public Object getLast()

  • 刪除功能

        public Object removeFirst()

        public Object removeLast()

3,集合應用案例

  • 案例一:獲取10個1-30之間的隨機數,要求不能重複
import java.util.ArrayList;
import java.util.Random;

/**
* @author Manduner_TJU
* @version 建立時間:2018年5月27日下午4:21:19
*/

/*
 * 需求:獲取10個1-30之間的隨機數,要求不能重複
 * 分析:
 * 		(1)建立隨機數物件
 * 		(2)建立存放隨機數的集合
 * 		(3)設定統計量
 * 		(4)產生隨機數,並判斷集合中是否包含該隨機數
 * 				是:不放入集合
 * 				否:放入集合,同時統計量++
 * 		(5)遍歷集合
 * 
 */
public class RandomDemo {

	public static void main(String[] args) {
		//建立隨機數物件、建立存放隨機數的集合
		Random r = new Random();
		ArrayList<Integer> array = new ArrayList<Integer>();
		
		//設定統計量
		int count = 0;
		
		//產生隨機數,並判斷集合中是否包含該隨機數
		while(count < 10) {
			int temp = r.nextInt(30) + 1;
			if(!array.contains(temp)) {
				array.add(temp);
				count++;
			}
		}
		
		//遍歷集合
		for(Integer x : array) {
			System.out.println(x);
		}
	}
	
}
  • 案例二:鍵盤錄入多個數據,以0結束,要求在控制檯輸出所錄入資料的最大值
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/**
* @author Manduner_TJU
* @version 建立時間:2018年5月27日下午5:06:25
*/

/*
 *需求:鍵盤錄入多個數據,以0結束,要求在控制檯輸出所錄入資料的最大值
 *分析:
 *		(1)建立鍵盤錄入物件
 *		(2) 建立集合
 *		(3)錄入資料,並存放入集合中
 *		(4)將集合轉換為陣列
 *		(5)將陣列進行排序
 *		(6)輸出陣列的最大值
 * 
 */
public class ArrayListDemo {

	public static void main(String[] args) {
		//建立鍵盤錄入物件、建立集合
		Scanner sc = new Scanner(System.in);
		ArrayList<Integer> array = new ArrayList<Integer>();
		
		//錄入資料,並存放入集合中
		while(true) {
			System.out.println("請輸入資料:");
			Integer i = sc.nextInt();
			if(i != 0) {
				array.add(i);
			}else {
				break;
			}
				
		}
		
		//將集合轉換為陣列
		Integer[] ii = new Integer[array.size()];
		array.toArray(ii);
		
		//將陣列進行排序
		Arrays.sort(ii);
		
		//輸出陣列的最大值
		System.out.println("陣列的最大值是 " + ii[ii.length - 1]);
	}
}