一、简单案例
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接口)
③总之这三个元素经常会在一起使用。而同时又为了保证安全性问题,会将这三者和 泛型 一起使用。所以一共四个方面。都要会。