Collections
集合并非必须指定泛型,但。。。确实应该指定。
注意
1 add和addall,addall可以把一个集合中的所有元素放到另一个集合中去。
2 用contains判断之前要看看自定义类型的equals弄好了没有。
3 retainAll是求交集。如果当前集合发生改变返回true。交集保存在当前集合里。
4 toArray返回值是Object[]
5 迭代器遍历过程中不能同时再调用集合的删除方法
6 普通的remove方***改变size。解决这个问题有很多方法,比如正着删,删一个i自减一次。也可以倒着。
List
List是接口,常用的实现类是ArrayList, LinkedList, Stack 和 Queue
分别是数组 链表 栈 队列。刷Oj基本都能用到。
List有sublist方法,获得一个子list。但要注意这个子list和大list公用内存空间。
泛型
Java的集合类可以添加Object。Object又是所有类型的父类,也就意味着集合可以放各种类型的数据。但这在使用的时候会很麻烦,你可能需要进行强制类型转换。进行强制类型转换是很容易出错的。
为了避免这种情况,引入了泛型。
自定义泛型类
public class Person<T> {
private String name;
private int age;
private T gender;
public Person(){}
public Person(String name, int age, T gender) {
setName(name);
setAge(age);
setGender(gender);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
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;
}
public T getGender() {
return gender;
}
public void setGender(T gender) {
this.gender = gender;
}
}继承泛型类
//擦除,Person类的泛型为默认的Object
class SubPerson extends Person{}
//擦除,Person类的泛型为String
class SubPerson extends Person<String>{}
//保留父类泛型
class SubPerson<T> extends Person<T>{}
//不仅保留还增加了一个类型E
class SubPerson<T, E> extends Person<T>{}注意,List<string> 不是 List<object>的子类。</object></string>
泛型方法
//注意static关键字的位置不能随便放。要放在泛型前面。
public static <T1> void logArr(T1[] arr) {
for (T1 item : arr) {
System.out.print(item);
System.out.print(" ");
}
}
// public static T void method().......是不行的,这样的方法不是泛型方法,这个方法的类型已经在初始化的时候传入了。通配符
? <? extends T> <? super T>
使用?通配符就不支持元素添加了。
后两个通配符很好懂。 在想象的时候可以把前者看成继承树的无限远处,后者可以看成Object(我只是指出一种思考方式)
Set
这是真集合。。元素不许重复。底层是用HashMap实现的。没什么难的API。
Map
存储的是键值对。HashMap的key不能重复。
Collections
常用的API有

京公网安备 11010502036488号