List
ArrayList和LinkedList
List接口是Collection的子接口,用于定义线性表数据结构。可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。
List的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。
可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别。ArrayList更适合于随机访问而LinkedList更适合于插入和删除。在性能要求不是特别苛刻的情况下可以忽略这个差别。
2 常用API
get和set
• List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最常用的就是基于下标的get和set方法:
— E get(int index) 获取集合中指定下标对应的元素,下标从0开始。
— E set(int index, E element) 将给定的元素存入给定位置,并将原位置的元素返回。
插入和删除
• List根据下表的操作还支持插入和删除操作。
— void add(int index, E element) 将给定的元素插入到指定位置,原位置及后续元素都顺序向后移动。
— E remove(int index) 删除给定位置的元素,并将被删除的元素返回。
subList
• List的subList方法用于获取子List。
• 需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响原List。
— List subList(int fromIndex, int toIndex);
fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括)
List转换为数组toArray
• List的toArray方法用于将 集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。
• 其有两个方法:
— Object[] toArray()
— T[] toArray(T[] a)
其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。
数组转换为List
• Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合。
• 其方法定义为:
— static List asList<T… a>
返回的List的集合元素类型由传入的数组的元素类型决定。
并且要注意的是,返回的集合我们不能对其增删元素,否则会抛出异常。并且对集合的元素进行修改会影响数组对应的元素。
List排序
Collection.sort方法实现排序
• Collections是集合的工具类,它提供了很多便于我们操作集合的方法,其中就有用于集合排序的sort方法。
• 该方法定义为:
— static void sort(List list) 该方法的作用是对给定的集合元素进行自然排序。
Comparable
Collections的sort方法是对集合元素进行自然排序,那么两个元素对象之间就一定要有大小之分。这个大小之分是如何界定的?实际上,在使用Collections的sort排序的集合元素都必须是Comparable接口的实现类,该接口表示其子类是可比较的,因为实现该接口必须重写抽象方法:
— int compareTo(T t); 该方法用于使当前对象与给定对象进行比较。
— 若当前对象大于给定对象,那么返回值应为>0的整数。
— 若小于给定对象,那么返回值应为<0的整数。
— 若两个对象相等,则应返回0。
Comparator
一旦Java类实现了Comparable接口,其比较逻辑就已经确定;如果希望在排序的操作中临时指定比较规则,可以采用Comparator接口回调的方式。
• Comparator接口要求实现类必须重写其定义的方法:
— int compare(T o1, T o2)
• 该方法的返回值要求
— 若o1>o2则返回值应>0
— 若o1<o2则返回值应<0
— 若o1==o2则返回值应为0