传统方法

  • 不能对加入到集合ArrayList中的数据类型进行约束(不安全)
  • 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响 ```java package test;

import java.util.ArrayList; public class Main { public static void main(String[] args) {

  1. //使用传统的方法来解决
  2. ArrayList arrayList = new ArrayList();
  3. arrayList.add(new Dog("旺财", 10));
  4. arrayList.add(new Dog("发财", 1));
  5. arrayList.add(new Dog("小黄", 5));
  6. //假如我们的程序员,不小心,添加了一只猫
  7. //就会抛出异常,程序终止。
  8. arrayList.add(new Cat("招财猫", 8));
  9. //遍历
  10. for (Object o : arrayList) {
  11. //向下转型Object ->Dog
  12. Dog dog = (Dog) o;
  13. System.out.println(dog.getName() + "-" + dog.getAge());
  14. }
  15. }

} / 请编写程序,在ArrayList 中,添加3个Dog对象 Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx()) / class Dog { private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; }

  1. public String getName() {
  2. return name;
  3. }
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public int getAge() {
  8. return age;
  9. }
  10. public void setAge(int age) {
  11. this.age = age;
  12. }

}

class Cat { //Cat类 private String name; private int age; public Cat(String name, int age) { this.name = name; this.age = age; }

  1. public String getName() {
  2. return name;
  3. }
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public int getAge() {
  8. return age;
  9. }
  10. public void setAge(int age) {
  11. this.age = age;
  12. }

}

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21705001/1639194169214-26d79771-a176-4bbd-8c85-c2cc086eeeff.png#clientId=uf2164b51-22fd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=240&id=u8e2b0707&margin=%5Bobject%20Object%5D&name=image.png&originHeight=240&originWidth=1004&originalType=binary&ratio=1&rotation=0&showTitle=false&size=191872&status=done&style=none&taskId=uccc8314c-b613-4b32-8e04-eef2658d9d8&title=&width=1004)
  2. <a name="Sg5fY"></a>
  3. # 泛型
  4. - 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
  5. - 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
  6. **好处:**
  7. 1. 编译时,检查添加元素的类型,提高了安全性
  8. 1. 减少了类型转换的次数,提高效率
  9. > √不使用泛型
  10. > Dog -加入->Object-取出-> Dog//放入到ArrayList 会先转成Object,在取出时,还需要转换成Dog
  11. > √使用泛型
  12. > Dog->Dog-> Dog//放入时,和取出时,不需要类型转换,提高效率
  13. 3. 不再提示编译警告
  14. ```java
  15. package test;
  16. import java.util.ArrayList;
  17. public class Main {
  18. public static void main(String[] args) {
  19. //使用传统的方法来解决===> 使用泛型
  20. //1. 当我们 ArrayList<Dog> 表示存放到 ArrayList 集合中的元素是Dog类型
  21. //2. 如果编译器发现添加的类型,不满足要求,就会报错
  22. //3. 在遍历的时候,可以直接取出 Dog 类型而不是 Object
  23. //4. public class ArrayList<E> {} E称为泛型,那么 Dog->E
  24. ArrayList<Dog> arrayList = new ArrayList<Dog>();
  25. arrayList.add(new Dog("旺财", 10));
  26. arrayList.add(new Dog("发财", 1));
  27. arrayList.add(new Dog("小黄", 5));
  28. //假如我们的程序员,不小心,添加了一只猫
  29. //arrayList.add(new Cat("招财猫", 8));//报错!!!
  30. System.out.println("===使用泛型====");
  31. for (Dog dog : arrayList) {
  32. System.out.println(dog.getName() + "-" + dog.getAge());
  33. }
  34. }
  35. }
  36. /*
  37. 1.请编写程序,在ArrayList 中,添加3个Dog对象
  38. 2.Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx())
  39. */
  40. class Dog {
  41. private String name;
  42. private int age;
  43. public Dog(String name, int age) {
  44. this.name = name;
  45. this.age = age;
  46. }
  47. public String getName() {
  48. return name;
  49. }
  50. public void setName(String name) {
  51. this.name = name;
  52. }
  53. public int getAge() {
  54. return age;
  55. }
  56. public void setAge(int age) {
  57. this.age = age;
  58. }
  59. }
  60. class Cat { //Cat类
  61. private String name;
  62. private int age;
  63. public Cat(String name, int age) {
  64. this.name = name;
  65. this.age = age;
  66. }
  67. public String getName() {
  68. return name;
  69. }
  70. public void setName(String name) {
  71. this.name = name;
  72. }
  73. public int getAge() {
  74. return age;
  75. }
  76. public void setAge(int age) {
  77. this.age = age;
  78. }
  79. }

image.png