java 泛型返回接口
1.小练习
去除ArrayList中重复字符串元素
public static ArrayList<String> getSingle(ArrayList<String> list){
ArrayList<String> newList = new ArrayList<String>();
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String obj = itr.next();
if (!newList.contains(obj)) { //contains()方法
newList.add(obj);
}
}
return newList;
}
contain()方法判断是否包含
remove()方法判断自定义对象是否相同并删除
底层均依赖于.equals()方法
2.LinkedList类
特有method
void addFirst(E e); void addLast(E e);
E removeFist(); E removeLast();
E get(int index);
3.泛型generic
泛型用来避免类型转换异常(ClassCastException),<>中必须是引用数据类型,
(1)声明方法
在类上声明泛型:
class Name<T> {...}
方法泛型最好与类的泛型一致,如果不一致需要在方法上声明该泛型
在方法上声明泛型:
public<q> void xxx(Q q){...}
静态方法必须声明自己的泛型,因为静态方法是随着类的加载而进内存的,可能还没有声明类上的泛型。
public static<W> void xxx(w w) {...}
泛型接口:
interface Inter<T>{...} //创建泛型的接口
class Demo implements Inter<String> { //实现带有泛型的接口
@Override
...
}
(2)泛型通配符<?>
当右边的泛型是不确定时,左边可以指为?
List<?> list = new ArrayList<String>();
? extends E : 向下限定,E及其子类
4.foreach 增强for循环
格式:
for(元素数据类型 变量 : 数组或者Collection集合){
变量直接使用;
}
foreach底层依赖的是迭代器Iterator
5.List中三种删除元素的方法
普通for循环可以实现
for(int i = 0 ; i < list.size() ; i++){
if("b".equals(list.get(i))){
list.remove(i--); //使用i--,否则会跳过一个数值
}
}
Iterator迭代器
无法删除元素,因为会出现ConcurrentModificationException(并发修改异常)。
增强for循环
无法删除元素,因为foreach的底层使用迭代器Iterator实现的。
6.静态导入(导入类中的静态方法) jdk1.5新特性 不用
导入类中的静态方法,使用时可以直接使用方法,不需要加类名。
import static 包名.类名.方法名;
import static java.util.Arrays.sort;
...
sort(arr);
7.可变参数ChangeableArgs jdk1.5新特性
可变参数其实是一个数组
public void print(int ... xx); //xx为数组
print(11,22,33); //可变参数的参数列表中可以有任意个元素
8.集合和数组的互转
Arrays.asList() :数组转集合方法
底层用的是可变参数;
转换后的集合无法增删改元素,但是可以用集合的方法操作元素;
基本数据类型的数组转换成集合,会将整个数组当作一个对象来转换,改进方法:使用包装类。
Collection中的toArray(); 集合转数组方法
方法:<T> T toArray(T t); 使用:
String[] arr = list.toArray(new String[0]);
//新建数组的长度大于list的size,分配的长度为数组的长度
//反之,分配的长度等于list的size
文中出现的单词
concurrent 并发的;同时发生的
iterator 迭代器