Java之泛型及其簡單應用以及compareTo和compare方法

一、簡單案例

JDK的升級側重3部分:高效,便於書寫,安全
泛型側重點是安全機制。用於解決安全問題
先引入包:

import java.uitl.*;

案例一:
安全問題:當我們在容器內只存String類對象時。突然存入了一個其他類型的數據,而我們想要使用String類型的length()方法時,會出現安全問題:編譯不報錯,運行報錯。
如下:

class GenericDemo 
{
	public static void main(String[] args) 
	{
		//創建一個ArrayList集合
		ArrayList al=new ArrayList();
		al.add("zhangsan01");
		al.add("lishi01");
		al.add("zhangsan02");
		al.add(4);//容器內不能存儲基本數據類型,但是該條等價於al.add(new Integer(4));存在自動拆箱和裝箱的問題。

		//創建迭代器
		Iterator it=al.iterator();
		while(it.hasNext())
		{
			String s=(String)it.next();
			//使用String的length()方法。
			System.out.println("......"+s.length());
		}
	}
}

解決辦法
使用泛型,讓其在編譯時期報錯,便於程序編譯者解決。

class GenericDemo 
{
	public static void main(String[] args) 
	{
		//創建一個ArrayList集合
		ArrayList<String> al=new ArrayList<String>();
		al.add("zhangsan01");
		al.add("lishi01");
		al.add("zhangsan03");
		al.add(4);

		//創建迭代器
		Iterator<String> it=al.iterator();
		while(it.hasNext())
		{
			String s=it.next();
			System.out.println("......"+s.length());
		}
	}
}

上述容器則變成了只能存入String類型的對象了。需要註釋掉al.add(4);,不然會報錯。
迭代器的數據是從容器al來的,爲了避免強制轉換,把Iterator的接收類型也定義爲String類型(原本爲Object)。

二、格式

格式:
一、< Type >:一對尖括號,裏面是類型。可以是String、Integer、Double、Character…等
二、當使用集合時,要出入數據的類型作爲參數傳入到<>內。

三、接口(comparator)的泛型

小例子:

//比較器,只在接口上寫泛型。
class MyCompare implements Comparator<String>
{
	public int compare(String s1,String s2)
	{
		int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));//可以看出,compareTo是對-對象-進行比較
		//如果長度相等,則比較字符串內容
		if(num==0)
			return s1.compareTo(s2);
		return num;
	}
}

主函數:

class GenericDemo 
{
	public static void main(String[] args) 
	{
		//ArrayList容器構造函數無法傳入比較器,除非自己寫個繼承函數然後重載一個。
		TreeSet<String> ts = new TreeSet<String>(new MyCompare());
		ts.add("zhangsan01");
		ts.add("lishi01");
		ts.add("zhangsan03");
		//創建迭代器
		Iterator<String> it=ts.iterator();
		while(it.hasNext())
		{
			String s=it.next();
			System.out.println("......"+s);
		}
	}
}

四、接口(comparable)的泛型

小例子:

自定義類實現Comparable接口並重寫compaerTo()方法
class Person implements Comparable<Person>
{
	private String name;
	//假設函數一初始化就指定姓名和年齡
	Person(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return name;
	}
	public int compareTo(Person p)
	{
		if(!(p instanceof Person))
			throw new RuntimeException("Error011:傳入對象非Student類型!");
		return this.name.compareTo(p.name);//這個是字符串類(String)的compareTo()方法
	}
}
主函數:
class GenericDemo 
{
	public static void main(String[] args) 
	{
		//創建一個ArrayList集合
		TreeSet<Person> al=new TreeSet<Person>();//ArrayList容器構造函數無法傳入比較器,除非自己寫個繼承函數然後重載一個。
		al.add(new Person("zhangsan01"));
		al.add(new Person("lishi01"));
		al.add(new Person("zhangsan03"));

		//創建迭代器
		Iterator<Person> it=al.iterator();
		while(it.hasNext())
		{
			Person p=it.next();
			System.out.println("......"+p.getName());
		}
	}
}

結論:

①對於 容器 的使用,經常會用到 迭代器 。用於增刪改查等操作。
②對於排序的問題,則經常要用到 比較器 (comparator接口)或者比較接口(Comparable接口)
③總之這三個元素經常會在一起使用。而同時又爲了保證安全性問題,會將這三者和 泛型 一起使用。所以一共四個方面。都要會。

下一篇:Java泛型中關於泛型定義位置(類上,方法上)的小例子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章