一、簡單案例
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接口)
③總之這三個元素經常會在一起使用。而同時又爲了保證安全性問題,會將這三者和 泛型 一起使用。所以一共四個方面。都要會。