我的后端学习大纲
我的Java学习大纲
第15章:泛型(generic)
15.1 泛型的理解和好处
15.1.1.看一个需求:
- 1.
编写程序,在ArrayList中,添加3个Dog对象,要求Dog对象含有name和age,并输出name和age(要去使用getXxx())
package com.jianqun.generic;
import java.util.ArrayList;
public class Generic01 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(new Dog("旺财", 10));
arrayList.add(new Dog("发财", 1));
arrayList.add(new Dog("小黄", 5));
arrayList.add(new Cat("招财猫", 8));
for (Object o : arrayList) {
Dog dog = (Dog) o;
System.out.println(dog.getName() + "-" + dog.getAge());
}
}
}
class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Cat {
private String name;
private int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 2.上述源码的问题:
- a. 不能对加入到集合中的元素ArrayList中的数据类型进行约束
- b.遍历的时候,需要进行类型的转换,如果数据量大的话,对效率有较大影响
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6e8f2f89b7a38955c6ea6627abcf0f00.png)
- 3.改进:
package com.jianqun.generic.improve;
import java.util.ArrayList;
public class Generic02 {
public static void main(String[] args) {
ArrayList<Dog> arrayList = new ArrayList<Dog>();
arrayList.add(new Dog("旺财", 10));
arrayList.add(new Dog("发财", 1));
arrayList.add(new Dog("小黄", 5));
System.out.println("===使用泛型====");
for (Dog dog : arrayList) {
System.out.println(dog.getName() + "-" + dog.getAge());
}
}
}
class Dog {
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Cat {
private String name;
private int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
15.2 泛型的理解和好处
15.2.1 泛型的好处
- 1.加入泛型后,在编译的时候就会检查元素的类型,提高了安全性
- 2.减少了类型转换次数,提高了效率
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d7073ef12dd7bdcf1607f2514dc71f02.png)
15.3.泛型介绍
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5c05cba6068ce17953f8388eac746c6f.png)
package com.jianqun.generic;
import java.util.List;
public class Generic03 {
public static void main(String[] args) {
Person<String> person = new Person<String>("韩顺平教育");
person.show();
Person<Integer> person2 = new Person<Integer>(100);
person2.show();
}
}
class Person<E> {
E s ;
public Person(E s) {
this.s = s;
}
public E f() {
return s;
}
public void show() {
System.out.println(s.getClass());
}
}
15.4 泛型的语法
15.4.1 泛型的声明
interface 接口名<T>
和 class 类<K,V>
- 其中的T,K,V代表的是类型,可以写多个类型
- 泛型可以使用任意一个字母表示
15.4.2 泛型的实例化:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d460f44fc095ed14a2638968463476dd.png)
15.4.3 泛型使用举例
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/853e3f8d6bf757a51feefec5e66e380f.png)
package com.jianqun.generic;
import java.util.*;
@SuppressWarnings({"all"})
public class GenericExercise {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<Student>();
students.add(new Student("jack", 18));
students.add(new Student("tom", 28));
students.add(new Student("mary", 19));
for (Student student : students) {
System.out.println(student);
}
HashMap<String, Student> hm = new HashMap<String, Student>();
hm.put("milan", new Student("milan", 38));
hm.put("smith", new Student("smith", 48));
hm.put("hsp", new Student("hsp", 28));
Set<Map.Entry<String, Student>> entries = hm.entrySet();
Iterator<Map.Entry<String, Student>> iterator = entries.iterator();
System.out.println("==============================");
while (iterator.hasNext()) {
Map.Entry<String, Student> next = iterator.next();
System.out.println(next.getKey() + "-" + next.getValue());
}
}
}
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
15.4.4 泛型使用的注意事项和细节
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6aa87734504d25f35cb038d6c68c1f4f.png)
package com.jianqun.generic;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings({"all"})
public class GenericDetail {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Pig<A> aPig = new Pig<A>(new A());
aPig.f();
Pig<A> aPig2 = new Pig<A>(new B());
aPig2.f();
ArrayList<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
ArrayList<Integer> list3 = new ArrayList<>();
List<Integer> list4 = new ArrayList<>();
ArrayList<Pig> pigs = new ArrayList<>();
ArrayList arrayList = new ArrayList();
Tiger tiger = new Tiger();
}
}
class Tiger<E> {
E e;
public Tiger() {}
public Tiger(E e) {
this.e = e;
}
}
class A {}
class B extends A {}
class Pig<E> {
E e;
public Pig(E e) {
this.e = e;
}
public void f() {
System.out.println(e.getClass());
}
}