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泛型中关于泛型定义位置(类上,方法上)的小例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值