泛型用于声明集合中的数据类型
1、增强了代码的安全性
分析:给集合中传入一些类A的对象,但是在接收这些对象的时候也许会用类B的对象接收,并且这种错误在编译时期不会显示,在运行时候才会报错
代码示例:
ArrayList arrayList = new ArrayList<>();
arrayList.add(new Student(36,"Kobi"));
arrayList.add(new Student(30,"Lebron"));
arrayList.add(new Student(43,"Jordan"));
arrayList.add(new Student(43,"Jordan"));
Worker worker = (Worker)arrayList.iterator().next();
2、减少了向下转型的步骤
分析:集合中所有的数据类型都是Object的,在输出集合中的值得时候,需要向下转型成对应的类型才可运算
代码分析:
System.out.println(arrayList.iterator().next());
1、菱形泛型
定义:在初始化集合的时候,只需要在前一个菱形符中定义集合元素类型即可,后面菱形符可以不写
代码示例:
ArrayList arrayList = new ArrayList<>();
分析:这代表在参数列表中可以输入多个int类型数据,相当于一个 int [ ] array
注意:在方法的重载时候,不可以一个方法参数列表是(int...num)另一个是(int [ ] array ),两个方法相同
代码示例:
public static void Print(int [ ] array) {
}
public static void Print(int num1,int...num) {
}
分析:在 int...num 参数列表中可以说添加int类型参数,但是要放在前面,否则传进来都会被传进int...num
3、正向遍历数组,反向遍历数组
分析:使用listIterator关键字
注意:previous在使用的使用实质也是看指针的位置,直接使用输出为空
代码示例:
ListIterator listIterator = arrayList.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
关键词: ? extends E ?:代表子类 E:代表父类
代码示例:
ArrayList arrayList = new ArrayList<>();
arrayList.add(new Person(18,"wangning"));
arrayList.add(new Person(18,"wangning"));
arrayList.add(new Person(18,"wangning"));
ArrayList arrayList2 = new ArrayList<>();
arrayList2.add(new Student(18,"ning"));
arrayList2.add(new Student(18,"ning"));
arrayList.addAll(arrayList2);
分析:Person在使用addALL()方法的时候,会要求添加的集合是它的子类
作用:可以将数组转换为集合,是Arrays的方法,它还有toString的方法经常使用
注意:不可以使用 add 和 remove方法
意义:可以使用集合中的其他方法
代码示例:
int [] array = {1,2,3,4,5,6,7};
List list = Arrays.asList(array);
System.out.println(list);
Integer [] array1 = {1,2,3,4,5,6};
List list2 = Arrays.asList(array1);
分析:将int类型的数组转换为集合,输出的是数组的地址,因为数组中的元素没有被装箱成包装类
使用Integer类型的数组,就是讲每个元素添加到集合,可直接输出
1、iterator迭代器
代码示例:
ArrayList arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
2、ListIterator
特点:可对集合进行添加、删除操作
代码示例:
ArrayList arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("e");
arrayList.add("a");
ListIterator listIterator = arrayList.listIterator();
while (listIterator.hasNext()) {
String str = listIterator.next();
if (str.equals("b")) {
listIterator.remove();
}
else if(str.equals("e")) {
listIterator.add("wow");
}
}
System.out.println(arrayList);
注意:这里面不可以将remove操作和add操作放在一个if语句中进行,会报错
3、for循环
代码示例:
ArrayList arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("e");
arrayList.add("a");
for (int i = 0; i < arrayList.size() ; i++) {
if(arrayList.get(i).equals("b")) {
arrayList.add("wow");
}else if(arrayList.get(i).equals("a")) {
arrayList.remove(i--);
}
}
分析:在For循环中删除的时候,由于ArrayList底层是基于数组的,在删除一个元素之后,后面的元素会整体往前位移一位
此时如果继续循环,可能将位移到删除元素所在位置的新元素忽略运算,所以需要使用 " i-- "的操作,这样遇到 “a”元素之后
数组又会重新在删除元素所在位置上进行判断,保证了准确性
4、For each循环
代码示例:
ArrayList arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("e");
arrayList.add("a");
for (String string : arrayList) {
System.out.println(string);
}
5、Vector中的枚举遍历
关键词:elements
代码示例:
Vector vector = new Vector();
vector.add("a");
vector.add("a");
vector.add("b");
vector.add("e");
vector.add("a");
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
System.out.println(elements.nextElement());
}
6、toArray方法
注意:返回值类型是Object类型数组
代码示例:
Vector vector = new Vector();
vector.add("a");
vector.add("a");
vector.add("b");
vector.add("e");
vector.add("a");
Object[] array = vector.toArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
分析:int类型年龄使用 >比较。string类型姓名使用 compareTo比较
使用了嵌套循环,使用了中间变量
ArrayList arrayList = new ArrayList<>();
arrayList.add(new Student(15,"wangning"));
arrayList.add(new Student(20,"wangning"));
arrayList.add(new Student(17,"wangning"));
arrayList.add(new Student(36,"wangning"));
arrayList.add(new Student(5,"wangning"));
arrayList.add(new Student(99,"wangning"));
for (int i = 0; i < arrayList.size()-1; i++) {
for (int j = i+1; j < arrayList.size(); j++) {
if(arrayList.get(i).getAge()>=arrayList.get(j).getAge()) {
Student student;
student = arrayList.get(i);
arrayList.set(i, arrayList.get(j));
arrayList.set(j, student);
}
}
}
for (int i = 0; i < arrayList.size()-1; i++) {
for (int j = i+1; j < arrayList.size(); j++) {
if(arrayList.get(i).getName().compareTo(arrayList.get(j).getName())>=0) {
Student student;
student = arrayList.get(i);
arrayList.set(i, arrayList.get(j));
arrayList.set(j, student);
}
}
}
System.out.println(arrayList);
分析:使用collections方法排序,但是具体按照什么规则排序系统并不知道,这时候系统给出接口,需要实现这个接口,重写比较方法,在方法中具体编写排序规则
注意:需要再集合中元素所在的类中实现comparable接口,并且在comparable<>中填入元素类型
步骤:
代码示例:
1、实现comparable:
public class Student extends Person implements Comparable
2、重写compareTo方法:
public int compareTo(Student o) {
}
3、编写排序规则:
public int compareTo(Student o) {
return this.getAge()-o.getAge();
}
4、使用collectins方法调用sort方法:
Collections.sort(arrayList);
代码示例:
//一班
ArrayList arrayList = new ArrayList<>();
arrayList.add(new Student(18,"wangning"));
arrayList.add(new Student(19,"wangning"));
//二班
ArrayList arrayList1 = new ArrayList<>();
arrayList1.add(new Student(20,"wangning"));
arrayList1.add(new Student(21,"wangning"));
ArrayList> arrayList2 = new ArrayList<>();
arrayList2.add(arrayList);
arrayList2.add(arrayList1);
for (ArrayList arrayList3 : arrayList2) {
for (Student student : arrayList3) {
System.out.println(student);
}
}
特点:形成了树状分支结构