泛型:
标识着集合中保存的元素是什么类型
写法:<泛型(类型)>
ArrayList<String>
好处:
1.操作数据更加安全(规范集合中 能保存的数据)
2.可以避免向下转型(强转类型)的麻烦
3.将运行时的错误 转到编译时报错
example:
泛型写的时候 前后类型要一致
ArrayList<String> list = new ArrayList<String>();
(JDK1.7之后有菱形泛型 后面的类型可以省去)
ArrayList<String> list = new ArrayList<>();
遍历集合
ListIterator<String> listIterator = list.listIterator();
正向遍历:
while (listIterator.hasNext()) {
//获取集合中的元素
String string = listIterator.next();
System.out.println(string);
}
逆向遍历:
//判断前一个是否有元素
while (listIterator.hasPrevious()) {
String preivous = listIterator.previous();
System.out.println(preivous);
}
注意:当只进行逆向遍历时 会无法打印内容 因为默认有个指针在最前面的位置 逆向遍历是从后面开始指针无法移动
不加泛型 在集合中保存三个学生:
ArrayList list = new ArrayList();
list.add(new Student("张三",11));
list.add(new Student("李四",12));
list.add(new Student("王五",13));
从集合中取出一个元素 强转成工人类型, 并调用工人的工作方法:
Object object2 = list.get(1);
Worker worker = (Worker)object2;
worker.work();
编译不会报错,但此时运行会报错:

不加泛型 获取到集合中的匀速 元素类型可以随便强转 没有约束 编译都会通过
加上泛型 在编译时就会有错误提示 可以让集合中保存的元素 更加安全
example:
int[] array = {1,2,3,4,5};
List<int[]> list = Arrays.asList(array);
System.out.println(list);
结果:
原因 直接传入int[] 系统不会帮你进行自动装箱 ,这个集合中的每一个元素都是数组
Integer[] newArray = {1,2,3,4,5};
//直接把数组中的元素 放入了集合中
List<Integer> newList = Arrays.asList(newArray);
System.out.println(newList);
结果:
第二种泛型:
写法:
? extends E
问号是子类 E是父类
只能使用父类的子类 或 本类(也叫向下限定)
example:
//创建一个person集合 保存两个person
ArrayList<Person> list1 = new ArrayList<>();
list1.add(new Person("wang1",1));
list1.add(new Person("wang2",2));
//创建一个student集合 保存两个student
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new Student("peng1",1));
list2.add(new Student("peng2",2));
//addAll(Collection<Student extends Person> c)
list1.addAll(list2);
System.out.println(list1);
循环删除:
//创建一个集合保存abcd
//如果有b就把b删了(使用循环)
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("b")) {
//因为删除之后长度会减少 后面的会向前补位
//所以删除后要退回下标 不然会跳过下一个
list.remove(i--);
}
}
System.out.println(list);
迭代器遍历时 要用迭代器类中的删除方法(避免出现并发修改异常)
多参数的参数:
int .. num 这个参数 可以看成是一个数组
可以当做数组来遍历
使用方式有两个:
1.直接传一个数组
2.可以传多个数 用逗号分开
注意:多个参数时 最好把多参数放到最后
public static void fun4(int a ,int ... num) {
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
}
添加一个元素
UnsupportedOperationException
不支持的操作异常
使用asList方法 将数组转化成集合
注意:不能对集合的长度发生改变(不能增删)
转化成集合后 可以调用集合中其他方法