------- android培训、java培训、期待与您交流! ----------
第一节:泛型
一、泛型的由来和基本使用
1、因为集合可以存储的对象类型是任意的,在取出进行向下转型时,容易发生ClassCastException。
所以JDK1.5以后就有了解决这个问题的技术:泛型。
2、泛型的原理:其实就是在操作的元素类型不确定时,通过传递参数的形式来明确类型。
3、泛型的体现就是 <参数类型变量>用于接收具体的实际元素类型。
4、泛型技术在集合框架中应用非常广泛,只要记住:在使用类或者接口时,如果接口上有明确<>泛型。
在使用时,就传递所需的数据类型即可。不传递会出现警告类型不安全提示。
5、了解:泛型技术是用在编译器部分的技术,一旦类型检查正确,
生成的class文件中就没有泛型标记了:这是的泛型的擦除。
6、泛型的好处:
6.1 将运行时期的ClassCastException异常转移到编译时期通过编译失败体现。
6.2 避免了强制转换的麻烦。
7、其实泛型的使用就是往定义了泛型的类或者接口的<>中传递类型参数。
8、泛型在集合对象中的使用,要求写集合代码时必须加入泛型
代码体现
import java.util.*;
class FanXingDemo
{
public static void main(String[] args)
{
List list = new ArrayList();
//添加元素
list.add("abc");
list.add("zzzz");
// list.add(6);//只要不是指定的类型对象,编译器检查会 报错。这样将运行时的问题转移到编译时期。
//用迭代器进行对元素遍历
for (Iterator it = list.iterator(); it.hasNext();)
{
// Object object = (Object) it.next();
// System.out.println(object.toString());
//想要打印字符串的长度。
String str = it.next();
System.out.println(str.length());
}
}
}
二、自定义泛型
代码体现
import java.util.*;
class Queue{
//封装了一个LinkedList类。
private LinkedList link;
//类初始化,LinkedList对象初始化。
Queue(){
link = new LinkedList();
}
public void myAdd(E obj){
//添加元素
link.addFirst(obj);
}
// 队列的获取方法。
public E myGet(){
return link.removeLast();
}
// 判断队列中元素是否空
public boolean isNull(){
return link.isEmpty();
}
}
三、通配符和泛型的限定
代码体现
import java.util.*;
class FanXingDemo5
{
public static void main (String[] args)
{
//创建list对象,并添加元素
Lists =new ArrayList();
s.add(new Student("张三"));
s.add(new Student("小三"));
s.add(new Student("小五"));
s.add(new Student("小六"));
getStudent(s);
//创建list对象,并添加元素
Lists1 =new ArrayList();
s1.add(new Wroker("李四"));
s1.add(new Wroker("小四"));
s1.add(new Wroker("小李"));
getStudent(s1);
}
//对传入的对象进行限定
public static void getStudent(Collection cl)
{
//进行迭代
for(Iterator iee = cl.iterator();iee.hasNext();)
{
//打印出集合中的元素
System.out.println(iee.next());
}
}
}
//人类
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public String toString()
{
return name;
}
}
//工人继承了人类
class Wroker extends Person
{
Wroker(String name)
{
super(name);
}
}
//学生继承了人类
class Student extends Person
{
Student(String name)
{
super(name);
}
}
? super E :接受E类型或者E的父类型。下限。
import java.util.*;
class FanXingDemo5
{
public static void main (String[] args)
{
//创建list对象,并添加元素
Sets =new TreeSet(new myComparator());
s.add(new Student("张三",23));
s.add(new Student("小三",32));
s.add(new Student("小五",54));
s.add(new Student("小六",12));
getStudent(s);
//创建list对象,并添加元素
Sets1 =new TreeSet(new myComparator());
s1.add(new Wroker("李四",36));
s1.add(new Wroker("小四",87));
s1.add(new Wroker("小李",43));
getStudent(s1);
}
//对传入的对象进行限定
public static void getStudent(Collection cl)
{
//进行迭代
for(Iterator iee = cl.iterator();iee.hasNext();)
{
//打印出集合中的元素
System.out.println(iee.next());
}
}
}
//人类
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name;
}
}
//工人继承了人类
class Wroker extends Person
{
Wroker(String name,int age)
{
super(name,age);
}
}
//学生继承了人类
class Student extends Person
{
Student(String name,int age)
{
super(name,age);
}
}
//定义一个比较器
class myComparator implements Comparator//泛型内的元素定义成Person类,所以wroker类和Student都可以用
{
public int compare(Person s1,Person s2)
{
int temp =s1.getName().compareTo(s2.getName());
return temp==0?s1.getAge()-s2.getAge():temp;
}
}
4、在api中的体现
5、泛型限定的练习。
代码体现
//泛型的练习
/*
* 案例:获取集合中元素的最大值。
*
* 思路: 1,定义变量记录每次比较后较大的值,初始化元素中任意一个。 2,遍历容器
* 3,在遍历中和变量中记录的元素进行比较。并将较大的值记录到变量中。 4,遍历结束,变量中记录的就是最大值。
*/
import java.util.*;
class FanXingDemo4
{
public static void main (String[] args)
{
//不加泛型进行获取
Set s1 =new TreeSet();
s1.add(new Student("王五",39));
s1.add(new Student("小五",19));
s1.add(new Student("大五",99));
Student max=getValue(s1);
System.out.println(max);
}
// 升级版。要操作的元素的类型确定不?不确定。使用泛型限定。getMax方法接收的集合中的元素无论时什么类型,必须具备自然排序,必须是Comparable的子类。
public static > T getValue(Set cle)
{
Iterator ies = cle.iterator();
T max =ies.next();
while (ies.hasNext())
{
T temp=ies.next();
if (temp.compareTo(max)>0)
{
max=temp;
}
}
return max;
}
}
//自定义一个学生类并实现了Comparable接口
class Student implements Comparable
{
//私有学生类的属性
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
//并提供对外访问方式
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
//覆盖接口中的CompareTo方法
public int compareTo(Student stu)
{
//看看name是否相同
int temp=this.name.compareTo(stu.name);
//当name和age相同时为同一个人
return temp==0?this.age-stu.age:temp;
}
//覆盖Object中的toString方法
public String toString()
{
return "name="+name+".....age="+age;
}
}
第二节: 集合框架的工具类
class Demo16
{
public static void main(String[] args)
{
//传统for遍历数组
int[] array= {1,2,3};
for(int x=0; x
二、函数的可变参数
class Demo17
{
public static void main(String[] args)
{
//传入一定量的数
show(1,2,3,4,5,6);
}
public static void show(int... array)//...就表示可变参数
{
//打印array的长度
System.out.println(array.length);
}
}
三、静态导入
import static java.util.Arrays.*;
import static java.lang.System.*;
class Demo18
{
public static void main(String[] args)
{
int[] arr = {2,1,9,8};
sort(arr);//方法sort时就可以省略书写Array.
for (int x=0;x
------- android培训、java培训、期待与您交流! ----------