Java序谈之泛型知识点

 泛型是什么?

泛型用于声明集合中的数据类型

泛型有什么好处?

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<>();

2、int...num

分析:这代表在参数列表中可以输入多个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()方法的时候,会要求添加的集合是它的子类


asList关键词

作用:可以将数组转换为集合,是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类型的数组,就是讲每个元素添加到集合,可直接输出

List中六种遍历的方法和可修改(添加、删除)元素的方法

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);
		}

分析:For each方法只能用来遍历,冒号前:  元素类型  元素名   冒号后:要遍历的集合名

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的方法排序

分析:使用collections方法排序,但是具体按照什么规则排序系统并不知道,这时候系统给出接口,需要实现这个接口,重写比较方法,在方法中具体编写排序规则

注意:需要再集合中元素所在的类中实现comparable接口,并且在comparable<>中填入元素类型

步骤:

  1. 实现comparable接口
  2. 重写compareTo方法
  3. 编写排序规则
  4. 使用collections调用sort方法

代码示例:

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);
			}
		}

分析:
  1. arraylist1 中保存的是Student类型的数据
  2. arraylist2 中保存的是Student类型的数据
  3. arraylist3 中保存的是ArrayList集合的引用

特点:形成了树状分支结构



















你可能感兴趣的:(Java)