java集合list泛型_java⼊门第九天(List集合、泛型)
1 泛型
什么是泛型?为什么要使⽤泛型?
泛型,即"参数化类型"。⼀提到参数,最熟悉的就是定义⽅法时有形参,然后调⽤此⽅法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于⽅法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后再使⽤/调⽤时传⼊具体的⽽类型(类型实参)。
泛型的本质是为了参数化类型 ( 在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型 ) 。也就是说在泛型使⽤过程中,操作的数据类型被指定为⼀个参数,这种参数类型可以⽤在类、接⼝和⽅法中,分别被称为泛型类、泛型接⼝、泛型⽅法。
【⽰例】⽆泛型的例⼦
ArrayList list = new ArrayList();
list.add("adddff");
list.add("123");
list.add(new Integer(123));
Iterator it = list.iterator();
while(it.hasNext()){
String str = (();
System.out.println(str);
}
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
为了解决这⼀问题,JDK1.5引⼊了泛型新机制,⽤于解决安全问题,是⼀个安全机制。
泛型的出现把运⾏时期的问题,转移到了编译时期。同时避免了强制转化的⿇烦。
【⽰例】有泛型
ArrayList list = new ArrayList<>();
list.add("adddff");
list.add("123");
list.add(new Integer(123));
有了泛型之后再编译器就会报错, add(java.lang.String) in ArrayList cannot be applied to(java.lang.Integer)
1.1 泛型的使⽤⽅式
泛型由三种使⽤⽅式:泛型类、泛型接⼝、泛型⽅法。
泛型类 泛型类型⽤于类的定义中,被称为泛型类。通过泛型可以完成对⼀组类的操作对外开放相同的接⼝,最典型的就是各种容器类,⽐如:List、Set、Map。
泛型类的最基本写法 : class 类名 {}
【⽰例】最普通的泛型类
public class Generic{
private T key;
public Generic(T key){
this.key = key;
}
public T getKey(){
retrun T;
}
}
泛型传递的类型参数只能是引⽤数据类型,不能是基本数据类型。
⽐如:class Generic{},下⾯的T全部⾃动转为String类型。
泛型类不⼀定要传⼊类型实参,泛型只是⽤来限制传⼊数据的类型。不写的话⼀样没有问题。
【⽰例】不适⽤泛型
Generic generic = new Generic("111111"); Generic generic1 = new Generic(4444); Generic generic2 = new Generic(55.55); Generic generic3 = new Generic(false);
Log.d("泛型测试","key is " + Key());
Log.d("泛型测试","key is " + Key());
Log.d("泛型测试","key is " + Key());
Log.d("泛型测试","key is " + Key());
D/泛型测试: key is 111111
D/泛型测试: key is 4444
D/泛型测试: key is 55.55
D/泛型测试: key is false
泛型接⼝
泛型接⼝与泛型类的定义和使⽤基本相同。泛型接⼝常备⽤在各种类的⽣产器中。
【⽰例】泛型接⼝的定义
public interface Genertic{
public T next();
}
当实现泛型接⼝的类,未传⼊泛型实参时:
【⽰例】
/**
* 未传⼊泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也⼀起加到类中
* 即:class FruitGenerator implements Generator{
* 如果不声明泛型,如:class FruitGenerator implements Generator,编译器会报错:"Unknown class"
*/
class FruitGenerator implements Generator{
@Override
public T next() {
return null;
}
}
当实现泛型接⼝的类,传⼊泛型实参时:
/**
* 传⼊泛型实参时:
* 定义⼀个⽣产器实现这个接⼝,虽然我们只创建了⼀个泛型接⼝Generator
* 但是我们可以为T传⼊⽆数个实参,形成⽆数种类型的Generator接⼝。
* 在实现类实现泛型接⼝时,如已将泛型类型传⼊实参类型,则所有使⽤泛型的地⽅都要替换成传⼊的实参类型* 即:Generator,public T next();中的的T都要替换成传⼊的String类型。
*/
public class FruitGenerator implements Generator {
private String[] fruits = new String[]{"Apple", "Banana", "Pear"};
@Override
public String next() {
Random rand = new Random();
return Int(3)];
}
}
泛型⽅法
【⽰例】
/**
* 泛型⽅法的基本介绍
* @param tClass 传⼊的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间⾮常重要,可以理解为声明此⽅法为泛型⽅法。
* 2)只有声明了的⽅法才是泛型⽅法,泛型类中的使⽤了泛型的成员⽅法并不是泛型⽅法。
* 3)表明该⽅法将使⽤泛型类型T,此时才可以在⽅法中使⽤泛型类型T。
* 4)与泛型类的定义⼀样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常⽤于表⽰泛型。*/
public T genericMethod(Class tClass)throws InstantiationException ,
IllegalAccessException{
T instance = wInstance();
return instance;
}
2 集合(ArrayList、LinkedList、Vector)
为什么会出现集合类?
⾯向对象语⾔对事物的体现都是以对象的形式。所以为了⽅便对多个对象的操作,就对对象进⾏储存,集合就是储存对象最常⽤的⽽⼀种⽅式。
数组和集合类同时容器,有何不同?
数组虽然也可以储存对象,但长度是固定的;集合长度是可变的的。 数组中可以储存基本数据类型,集合只能储存对象。
集合类的特点: 集合只⽤于储存对象,集合长度是可变的,集合可以储存不同类型的对象。
Collection集合体系
Collection
List Set
ArrayList HashSet
LinkedList TreeSet
Vector
Collection是集合容器中的根接⼝。
为什么会出现这么多的容器呢?
每⼀个容器对数据储存的⽅式都有相同。 这个储存⽅式称为数据结构。
List:元素是有序的,元素可以重复.
List集合特有的⽅法:
add(index, element);
addAll(index, Collection);
remove(index);
set(index, element);
get(index);
subList(from, to);
listIterator();
List集合特有的迭代器ListIterator是Iterator的⼦接⼝
在迭代时,不可以通过集合对象的⽅法操作集合中的元素。
会发⽣java.util.ConcurrentModificationException异常
所以,在迭代时只能⽤迭代器的⽅法操作元素,可以Iterator⽅法是有限的,只能对元素进⾏判断,取出,删除的操作,
如果想要其他操作如添加,修改等,就需要通过⼦接⼝ListIterator来实现。List接⼝:有三个⼦类
ArrayList LinkedList Vector
底层实现 数组 双向链表 数组
ArrayList:查询快,增删稍慢。
LinkedList:增删快,查询慢
Vector: 线程安全,效率⽐ArrayList低。被ArrayList取代了。
LinkedList特有⽅法
addFirst();
nextint()方法addLast();
在此列表的开头/末尾插⼊指定的元素。
getFirst();
getLast();
获取元素,但不删除
removeFirst();
removeLast();
获取元素,元素被删除
如果集合中没有元素,会出现noSuchElementException异常
在JDK1.6出现了替代⽅法,
offerFirst();
offerLast();
在此列表的开头/末尾插⼊指定的元素。
peekFirst();
peekLast();
获取元素,但不删除元素,如果没有元素,会返回null
pollFirst();
pollLast();
获取元素被删除;如果此列表为空,则返回 null。
ArrayList:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。