1. 程式人生 > >Java泛型(拓展ArrayList、HashMap)

Java泛型(拓展ArrayList、HashMap)

  泛型介紹

       Java中有泛型這個概念,最開始可能一臉懵逼,因為泛型聽起來很高大上的樣子,其實Java中的泛型就是C++中的模板類(Template),這樣在Java泛型中就可以很輕鬆的建立各種自定義型別的List了,有沒有覺得很舒服。另外Java中還提供ArrayList(繼承於List,比List更優化)、HashMap(繼承於抽象類Map,一種對映類)。泛型類中就是引入一個模板類T(其實就是一個Object類),下面我們來自己定義一個泛型類:

//GenericList.java
public class GenericList<T>  //模板T
{
	private static class GenericNode<T>  //相當於資料結構中得List struct
	{
		T value;
		GenericNode<T> next; 
		public GenericNode()
		{
			
		}
	}
	
	public GenericList()
	{
		head.next=null; //初始化
	}

	//連結串列頭
	private GenericNode<T> head=new GenericNode<T>();

	//向連結串列中新增ELement
	public void add(T value)
	{
		
		GenericNode<T> tair=head;
		while(tair.next!=null)
			tair=tair.next;
		GenericNode<T> node=new GenericNode<T>();
		tair.next=node;
		node.value=value;
		node.next=null;
	}
	
    //取得連結串列長度
	public int length()
	{
		int count=0;
		GenericNode<T> m=head;
		while(m.next!=null)
		{
			m=m.next;
			count++;
		}
		return count;
	}
	
	// 獲取迭代器,方便迭代遍歷
	public Iterator<T> getIterator()
	{
		Iterator<T> iter = new Iterator<T>();
		iter.node = this.head;
		return iter;
	}
	
	//定義Iterator迭代類
	public static class Iterator<T>
	{
		private GenericNode<T> node;
		
		// 是否還有下一節點
		public boolean hasNext()
		{
			return node.next != null;
		}
		
		// 獲取下一節點的值
		public T next()
		{
			T value = node.next.value;
			node = node.next;
			return value;
		}
	}

}

       以上程式碼中引入了,迭代器(自定義的,java中還有自帶Iterator類)。迭代器叫相當於給GenericList提供了一種迭代遍歷得方法,相信學過資料結構中List結構的小可愛們一定不陌生,這種迭代遍歷方法是利用next指標來依次遍歷整個List中的value。

 


ArrayList與HashMap

Java中提供自帶的兩個常用類似list的類:Array List、HashMap(資料結構中的雜湊表)。

ArrayList常用方法有:add(index,value)向ArrayList物件中新增Element,還可以指定位置新增

                                    remove(index)刪除指定位置的Element

                                    clear() 清空ArrayList

                                    get(index)取得index位置出的value

                                    iterator()載入迭代器中

 

HashMap常用方法有:put(key,value) 將value加入hashMap中

                                     remove(key) 移除key對應的value

                                    get(key)取得key對應的value

                       注:HashMap建立時要同時定義key與value。例如:HashMap<Interger,Student> key要滿足唯一性、可比較性

                             當put的key重複時,以最後一個key為主。(put了幾個key一模一樣的value,HashMap以最後一個key對應的                                   value為主)


三種方法測試程式碼如下   

//GenericList
    前面已經列出,這裡主要是介紹使用GenericList(見Hello.java)

//Student.java
public class Student
{
	int id;
	String name;
	String cellphone;
	public Student(int id,String name,String cellphone)
	{
		this.id=id;
		this.name=name;
		this.cellphone=cellphone;		
	}
	public void print()
	{
		System.out.println("( id:"+id+",name:"+name+",cellphone:"+cellphone+" )");
	}
}


//Teacher.java
public class Teacher
{
	String name;
	String perject;
	public Teacher(String name,String perject)
	{
		this.name=name;
		this.perject=perject;
	}
	
	public void print()
	{
		System.out.println("( name:"+name+",perject:"+perject+" )");
	}
}



//Hello.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;

public class Hello
{

	private static GenericList<Student> list2;

	public static void main(String[] args)
	{
		
//		//GenericList泛型List
		//測試Student
//		GenericList<Student> list1=new GenericList<Student>(); 
//		list1.add(new Student(1,"shen","13797368760"));
//		list1.add(new Student(2,"chong","13277351070"));
//		list1.add(new Student(3,"wang","13872261912"));
//		list1.add(new Student(4,"xue","13797368760"));
//		list1.add(new Student(5,"fei","13797368760"));
//		//輸出
//		GenericList.Iterator<Student> iter=list1.getIterator();
//			while(iter.hasNext())
//				iter.next().print();
//		//測試Teacher
//		GenericList<Teacher> list2 = new GenericList<Teacher>(); 
//		list2.add(new Teacher("shen","語文"));
//		list2.add(new Teacher("chong","數學"));
//		list2.add(new Teacher("wang","英語"));
//		list2.add(new Teacher("xue","物理"));
//		list2.add(new Teacher("fei","化學"));
//		//輸出
//		GenericList.Iterator<Teacher> iter=list2.getIterator();
//			while(iter.hasNext())
//				iter.next().print();
		
		
//		//ArrayList
//		ArrayList<Student> list=new ArrayList<Student>();
//		list.add(new Student(1,"shen","13797368760"));
//		list.add(new Student(2,"chong","13277351070"));
//		list.add(new Student(3,"wang","13872261912"));
//		list.add(new Student(4,"xue","13797368760"));
//		list.add(new Student(5,"fei","13797368760"));
//		//定義一個容器
//		Comparator<Student> compare=new Comparator<Student>()
//		{
//
//			@Override
//			public int compare(Student a, Student b)
//			{
//				if(a.id>b.id) return -1;
//				if(a.id<b.id) return 1;
//				return 0;
//			}
//		};
//		//排序(提供一個比較器比較)
//		Collections.sort(list, compare);
//		
////		//第一種遍歷方法(程式設計效率高)
////		for(int i=0;i<list.size();i++)
////		{
////			Student s=list.get(i);
////			s.print();
////		}
//		//第二種遍歷方法(執行效率高)
//		Iterator<Student> iter=list.iterator();
//		while(iter.hasNext())
//			iter.next().print();
		
		//HashMap
		HashMap<Integer,Student> list3=new HashMap<Integer,Student>();
		list3.put(1,new Student(1,"shen","13797368760"));
		list3.put(2,new Student(2,"chong","13277351070"));
		list3.put(3,new Student(3,"wang","13872261912"));
		list3.put(4,new Student(4,"xue","13797368760"));
		list3.put(5,new Student(5,"fei","13797368760"));
		//輸出(利用key查詢)
		for(int i=list3.size();i>0;i--)
			list3.get(i).print();
	}

}

感謝您的觀看!歡迎評論!