Java序谈之泛型知识点

来源:互联网 发布:ubuntu 17.04更新源 编辑:程序博客网 时间:2024/04/30 09:55

 泛型是什么?

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

泛型有什么好处?

1、增强了代码的安全性

分析:给集合中传入一些类A的对象,但是在接收这些对象的时候也许会用类B的对象接收,并且这种错误在编译时期不会显示,在运行时候才会报错

代码示例:

ArrayList<Student> 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<Student> 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<Student> listIterator = arrayList.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}while (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}

泛型通配符

关键词: ? extends E    ?:代表子类   E:代表父类

代码示例:

ArrayList<Person> arrayList = new ArrayList<>();arrayList.add(new Person(18,"wangning"));arrayList.add(new Person(18,"wangning"));arrayList.add(new Person(18,"wangning"));ArrayList<Student> 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<int []> list = Arrays.asList(array);System.out.println(list);Integer [] array1 = {1,2,3,4,5,6};List<Integer> list2 = Arrays.asList(array1);
分析:将int类型的数组转换为集合,输出的是数组的地址,因为数组中的元素没有被装箱成包装类

           使用Integer类型的数组,就是讲每个元素添加到集合,可直接输出

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

1、iterator迭代器

代码示例:

ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("a");arrayList.add("a");Iterator<String> iterator = arrayList.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}

2、ListIterator

特点:可对集合进行添加、删除操作

代码示例:

ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("a");arrayList.add("b");arrayList.add("e");arrayList.add("a");ListIterator<String> 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<String> 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<String> 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<String> vector = new Vector();vector.add("a");vector.add("a");vector.add("b");vector.add("e");vector.add("a");Enumeration<String> elements = vector.elements();while (elements.hasMoreElements()) {System.out.println(elements.nextElement());}
6、toArray方法

注意:返回值类型是Object类型数组

代码示例:

Vector<String> 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<Student> 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<Student> 
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<Student> arrayList = new ArrayList<>();arrayList.add(new Student(18,"wangning"));arrayList.add(new Student(19,"wangning"));//二班ArrayList<Student> arrayList1 = new ArrayList<>();arrayList1.add(new Student(20,"wangning"));arrayList1.add(new Student(21,"wangning"));ArrayList<ArrayList<Student>> arrayList2 = new ArrayList<>();arrayList2.add(arrayList);arrayList2.add(arrayList1);for (ArrayList<Student> arrayList3 : arrayList2) {for (Student student : arrayList3) {System.out.println(student);}}

分析:

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

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



















原创粉丝点击