集合
数组长度不可改变,数组无法保存具有映射关系的数据,数组可以保存基本类型和对象(对象的引用);集合只能保存对象(对象的引用)
集合导图: https://kdocs.cn/l/ct1MDl0BnhN8
Collections
Collections工具类不同于Collection接口,Collections类提供了一个操作Set,List和Map等集合的工具类
1.排序
reverse(List list)
:逆向排序
shuffle(List list)
:随机排序
sort(List list)
:升序排序
sort(List list, Comparator c)
:指定Comparator产生的顺序进行排序
swap(List list, int i, int j)
:交换i处元素和j 处元素
2.查找,替换
binarySearch(List list, Object key)
:使用二分搜索指定对象在List中索引值
fill(List list, Object obj)
:替换所有元素
frequency(Collection c, Object o)
:指定元素出现次数
indexOfSubList(List source, List target)
:子List第一次出现在父List对象中的索引
replaceAll(List list, Object oldVal, Object newVal)
:使用一个新值newVal替换所有的旧值oldVal
3.复制
copy()
:将指定集合中的所有元素复制到另一个集合
泛型
集合设计之初为了具有很好的通用性,导致取出被存入的对象时,对象都会被编译成Object类型,导致程序可以将不符合的对象存入集合,或者需要将取出的对象进行类型强转。
泛型可以在编译的时候检查类型安全,并且所有的强转都是自动的,提高了代码的重用率。
1.泛型集合
泛型本质上是提供类型的“类型参数”,也就是参数化类型,通过参数限制操作的数据类型
Map<Integer,Object> mapName = new HashMap<Integer,Object>();
2.泛型类
泛型类一般用于类中的属性类型不确定的情况,但是在实例化泛型类时,需要指明泛型类中的类型参数,并赋予泛型类属性相应类型的值
public class className<dataType1,dataType2,...>{
private dataType1 data1;
private dataType2 data2;
}
3.泛型方法
泛型方法既可以存在于泛型类中,也可以存在于普通的类中。如果使用泛型方法可以解决问题,那么应该尽量使用泛型方法,如果static方法需要使用泛型能力,就必须使其成为泛型方法
public [static] [final] <类型参数列表> 返回值类型 methodName([形参列表])
4.泛型高级
(1):限制泛型可用类型
public class ListClass <T extends List>{
public void listMethod(){
ListClass<ArrayList> lc1 = new ListClass<ArrayList>();
}
}
使用泛型限制后,泛型类的类型必须实现和继承anyClass这个接口或者类,而没有使用extends
关键字限制泛型类型时,其实就是默认使用Object类作为泛型类型。所以<T>
和<T extends Object>
等价
(2):类型通配符
泛型还支持使用类型通配符,它的作用是在创建一个泛型类对象时限制这个泛型类的类型必须实现或继承某个接口和类
A<? extends List> a = null;
a = new A<ArrayList> ();
(3):继承泛型类和实现泛型接口
public class FaClass<T1>{}
class SonClass<T1,T2,T3> extends FatherClass<T1>{}
如果想在继承时保留父类的泛型类型,需要在继承时指定,否则T1,T2和T3会自动变成Object,所以一般情况都将父类的泛型类型保留
5.<? super T>
和<? extends T>
<? super T>
:表示包括T在内的任何T的父类
<? extends T>
:表示包括T在内的任何T的子类
迭代器
Iterator
:java中使用迭代器模式实现Iterator接口,用于对集合类的访问(遍历),新增,删除等操作。而Iterator接口只是java提供的一种抽象迭代器。对于具体迭代器,在不同集合类中实现自定义的具体迭代器;这样避免暴露了各个集合类中内部设计的结构和操作。
Iterable
:Iterable的作用就是获取一个新的迭代器,每次获取的都是cursor重新开始的迭代器。而Iterable接口的iterator()方法的作用就是每次专门创建一个新的迭代器。