Java入门4: 泛型和集合


Java入门4: 泛型和集合

MangoGO 芒狗狗


4 泛型和集合

  Java 使用集合来组织和管理对象,本节我们重点讲解泛型和集合。主要介绍 Collection、List、ArrayList、Map、HashMap、Set 和 HashSet、Collections、算法等内容。

4.1 泛型

  泛型即参数化类型,也就是说数据类型变成了一个可变的参数,在不使用泛型的情况下,参数的数据类型都是写死了的,使用泛型之后,可以根据程序的需要进行改变。

  定义泛型的规则:

  • 只能是引用类型,不能是基本数据类型。
  • 泛型参数可以有多个。
  • 可以使用 extends 语句或者 super 语句如 表示类型的上界,T 只能是 SuperClass 或其子类, 表示类型的下界,K 只能是 ChildClass 或其父类。
  • 可以是通配符类型,比如常见的 Class<?>。单独使用 ? 表示任意类型,也可以结合 extends 和 super 语句进行限制。
/* 
使用T代表类型,无论何时都没有比这更具体的类型来区分它。如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。
*/
class GenericsTest<T> {
   
    private T ob;

    /*
    定义泛型成员变量,定义完类型参数后,可以在定义位置之后的方法的任意地方使用类型参数,就像使用普通的类型一样。
    注意,父类定义的类型参数不能被子类继承。
    */
    public GenericsTest(T ob) {
   
        this.ob = ob;
    }

    // getter
    public T getOb() {
   
        return ob;
    }

    // setter
    public void setOb(T ob) {
   
        this.ob = ob;
    }

    public void showType() {
   
        System.out.println("Type of T is " + ob.getClass().getName());
    }
}

public class GenericsTestDemo {
   
    public static void main(String[] args) {
   
        // 定义泛型类 GenericsTest 的一个 Integer 版本
        GenericsTest<Integer> intOb = new GenericsTest<Integer>(88);
        int i = intOb.getOb();
        System.out.println("value of ob: " + i);
        System.out.println("------------------");
        
        // 定义泛型类 Test 的一个 String 版本
        GenericsTest<String> strOb = new GenericsTest<String>("MangoGO");
        strOb.showType();
        String s = strOb.getOb();
        System.out.println("value of ob: " + s);
    }
}
!java GenericsTestDemo.java
value of ob: 88
------------------
Type of T is java.lang.String
value of ob: MangoGO
public class Animal {
   
    public Animal() {
   
        System.out.println("我是动物");
    }
}

public class Dog extends Animal {
   
    public Dog() {
   
        System.out.println("我是狗");
    }
}

public class GenericsTestDemo2 {
   
    public<T, S extends T> T GenericsTestDemo2(T t, S s) {
   
        System.out.println("我是 T 类型,我的类型是" + t.getClass().getName());
        System.out.println("我是 S 类型,我的类型是" + s.getClass().getName());
        return t;
    }

    public static void main(String[] args) {
   
        GenericsTestDemo2 test = new GenericsTestDemo2();
        Dog d = new Dog();
        Animal a0 = new Animal();
        Animal a1 = test.GenericsTestDemo2(a0, d);
        System.out.println("我是对象 a1,我的类型是" + a1.getClass().getName());
    }
}
!java GenericsTestDemo2.java
我是动物
我是狗
我是动物
我是 T 类型,我的类型是Animal
我是 S 类型,我的类型是Dog
我是对象 a1,我的类型是Animal

  上面的例子中我们对类型参数赋予了具体的类型,当然我们有时候也无法确定类型参数的类型,这个时候我们便可以使用通配符。如果仅仅是想实现多态,请优先使用通配符解决。

// GenericsTestDemo3.java

import java.util.List;
import java.util.ArrayList;

public class GenericsTestDemo3 {
   
    // List<?> 表示接收一个元素为任意类型的 List
    public void GenericsTestDemo3(List<?> s) {
   
        for (Object obj : s) {
   
            System.out.println("我的类型是" + obj.getClass().getName());
        }
    }

    public static void main(String[] args) {
   
        // TODO Auto-generated method stub
        GenericsTestDemo3 test = new GenericsTestDemo3();
        Dog a0 = new Dog();
        Animal a1 = new Animal();

        // 声明一个接收元素类型是 Animal 的 List s
        // 然后创建一个元素类型是 Animal 的 ArrayList 复制给 s
        List<Animal> s = new ArrayList<Animal>();

        // Dog a0 是 Animal 的子类,可以向上转型为 Animal 类型
        s.add(a0);
        s.add(a1);
        test.GenericsTestDemo3(s);
    }
}
!java GenericsTestDemo3.java
我是动物
我是狗
我是动物
我的类型是Dog
我的类型是Animal

4.2 Collection

  集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大内容:对外的接口、接口的实现和对集合运算的算法。

  因为集合框架中的很多类功能是相似的,所以我们用接口来规范类。Collection 接口是 Java 集合框架里的一个根接口。它也是 List、Set 和 Queue 接口的父接口。Collection 接口中定义了可用于操作 List、Set 和 Queue 的方法——增删改查。

方法 返回值 说明
add(E e) boolean 向 collection 的尾部追加指定的元素(可选操作)
addAll(Collection<? extend E> c) boolean 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)
clear() void 移除此 collection 中的所有元素(可选操作)
contains(Object o) boolean 如果此 collection 包含指定的元素,则返回 true
containsAll(Collection<?> c) boolean 如果此 collection 包含指定 collection 的所有元素,则返回 true
equals(Object o) boolean 比较此 collection 与指定对象是否相等
hashCode() int 返回此 collection 的哈希码值
isEmpty() boolean 如果此 collection 不包含元素,则返回 true
iterator() Iterator 返回在此 collection 的元素上进行迭代的迭代器
remove(Object o) boolean 移除此 collection 中出现的首个指定元素(可选操作)
removeAll(Collection<?> c) boolean 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)
retainAll(Collection<?> c) boolean 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)
size() int 返回此 collection 中的元素数
toArray() Object[] 返回包含此 collection 中所有元素的数组
toArray(T[] a) T[] 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同

4.3 List

  List 是一个接口,不能实例化,需要一个具体类来实现实例化。

  List 集合中的对象按照一定的顺序排放,里面的内容可以重复。 List 接口实现的类有:ArrayList(实现动态数组),

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoGO芒狗狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值