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有