泛型是JavaSE5 引入的特性,泛型的本质是参数化类型。应用场景:在类,接口和方法的定义过程中,所操作的数据类型被传入的参数指定。
例如在ArrayList类的定义中,<E>中的E为泛型参数,在创建对象是可以将类型作为参数传递,此时定义中的所有E将被替换为传入的参数;
ArrayList<String> list=new ArrayList<String>();创建对象,其中add的参数类型,get方法的返回值都替换为String
若使用list.add(100)则Java编译错误,因为add参数为String类型。
所有的集合类型都带有泛型参数,这样创建集合对象的时候可以指定放入结婚中的对象类型。而且,java编译器会根据此类型进行类型检查。
通过泛型,可以创建专门存储某个对象的List集合,例如
List<Point> pointList=new LinkedList<Point>();
创建迭代器:
Iterator<Point> it=pointList.iterator();
javaSE5推出增强型For循环,可以应用数组和集合的遍历。
for(Point P: pointList){
p.toString
}
理解为每次从pointList取出一个Point对象,然后赋值给循环遍历p;实际上编译的时候,增强型For循环被转换为迭代器模式,但是不能再循环中进行删除操作。
List的subList方法获取子List,子List和原List占用相同的存储空间,对子List的操作会影原List,例如:
subList=list.subList(3,8);
subList.set(I,subList.get(I)*10);
队列Queue是特殊的线性表,限制访问方式为:FIFO,即只能从一端offer添加元素,从另外一端poll取出元素
javaSE提供了Queue接口,同事使用LinkedList实现了改接口,Queue经常进行插入删除操作,例如:
Queue<String> queue=new LinkedList<String>();
Boolean offer(E e);将一个对象添加到队尾,如果添加成功则返回true,例如
queue.offer(“A”);queue.offer(“B”);
E peek();返回队首元素,但是不删除
E poll(); 弹出队首元素,即从队首删除并且返回
Deque是Queue的子接口,定义了所谓的“双端队列”,即从队列的两端粉笔入队和出队
如果将Deque限制为只能从一端入队和出队,则可以实现栈Stack的数据结构。
针对对象数组或者集合中的元素进行排序时候,需要确认对象的元素的比较逻辑
public interface Comparable<T>{
public int compareTo(T t)
}
Comparable接口定义的compareTo方法,逻辑为:
l f返回正数,表示this大于参数对象;
l 返回负数表示this小于参数对象
l 返回0表示this等于参数对象
两种应用场景;
(1) JDK的某些API调用Compareable接口中的方法了解对象的大小关系。
(2) Java类实现COmparable接口编写该类对象比较逻辑;
实例的例子:
Point实现Comparable接口,则泛型参数为Point类型,使得compareTo方法的参数也为Point类型,
public class Point implements Comparable<Point>{
private int x,int y;
public int compareTo(Point p){
int r1=x*x+y*y;
int r2=p.x*p.x+p.y*p.y;
return r1-r2;
}
}
注意:在编写compareTo方法的时候应该注意和equals方法的一致性;
************************************************************************ ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************