目录
- 4 泛型和集合
-
- 4.1 泛型
- 4.2 Collection
- 4.3 List
- 4.4 ArrayList
- 4.5 Map
- 4.6 HashMap
- 4.7 Set 和 HashSet
- 4.8 Collections
- 参考代码
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 接口实现的