泛型:
泛型就是标识着集合中保存着的元素是什么类型的.
写法: <泛型(类型)>
好处: 1.操作数据更加安全
2.可以避免向下转型(强转类型)的麻烦
3.可以将运行时的错误,转到编译时报错
public static void fun() {
// 前后的类型要保持一致
// jdk1.7 菱形泛型 后面的类型可以省去
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 遍历集合
ListIterator<String> listIterator = list.listIterator();
// 正向遍历
while (listIterator.hasNext()) {
// 获取集合中的元素
String string = listIterator.next();
System.out.println(string);
}
// 逆向遍历
// 判断前一个是否有元素
while (listIterator.hasPrevious()) {
// 获取前一个元素
String previous = listIterator.previous();
System.out.println(previous);
}
}
注意: 当进行逆向遍历的时候,保证指针是在末尾,因为逆向遍历的时候是判断上一个是否有元素.
基本数据类型数组转集合:
public static void fun() {
// 数组转集合
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);
}
输出:
[[I@33909752]
[1, 2, 3, 4, 5]
泛型的第二种写法:
? extends E ( ? 是子类 E 是父类)
public static void fun() {
// 创建一个Person集合 保存2个person
ArrayList<Person> list1 = new ArrayList<>();
list1.add(new Person("wang1", 11));
list1.add(new Person("wang2", 11));
// 创建一个Student集合 保存2个student
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new Student("peng1", 11));
list2.add(new Student("peng2", 11));
// addAll(Collection<? extends E> c)
list1.addAll(list2);
System.out.println(list1);
}
输出:
[Person [name=wang1, age=11], Person [name=wang2, age=11], Person [name=peng1, age=11], Person [name=peng2, age=11]]