集合
我这篇博客 只是整理一下我对java中集合的理解的
Collection
Collection collection集合的一个根接口 。
让我们来看看他定义了哪些方法吧!
增加删除元素类方法 :Add(E e ) addAll Clear Remove removeAll
工具类方法: Contains() containsAll() Equals isEmpty Size ()
其他方法 : toArray toArray(T [] a) Iterator
如果在不考虑效率的前提下 , 这些函数是已经可以实现大部分操作了 。 实在不行 ,我们就把集合通过toArray方法转换为数组对象 。 然后我们再对他进行操作 。 但是, 每一个程序猿都要怀揣一个成为技术总监的理想 。 我们是不能这样浅尝辄止的 。 我们还得深入的去研究的 。
List子接口
实现Collection接口的有List子接口。 List可以理解成一个链表 。 他比Collection 多出来一下可以操作元素下标的方法 。 如:
addAll(int index, Collection<? extends E> c)
get(int index)
indexOf(Object o)
lastIndexOf(Object o)
remove(int index)
有了这些方法 。 凡事实现List子接口的类都可以在链表的任意位置增加元素, 输出元素,替换元素了 。 还可以获得任意元素的下标了 。
有很多类实现了List接口 。 但我们最常用的有两个 。 一个是ArrayList类 一个是LinkedList类 。 其中 ArrayList可以理解成一个动态数组 。 用的比较多 。 那么他除了实现了List接口的所有特性外还有什么功能呢?
trimToSize() 删除ArrayList集合占用的多余的内存空间 。
就多这一个方法 。这个方法的实际意义也不是很大 。 因为java自身有相应的垃圾回收机制 。 所以我们只要掌握他从List接口上继承过来的方法就可以了 。
LinkedList他是一个双向链表 。 因此他占用的内存比较大 。 但相应的他的查找速度比较快。 是典型的一空间换时间的例子 。 所以他一般用在某些需要经常修改的数据上的。
那么他除了实现List实现的功能外还有哪些特性呢?
addLast(E e)
descendingIterator()
listIterator(int index)
offer(E e)
offerFirst(E e)
peek()
这些方法虽然看起来很多 , 但是没有实现集合新功能 。 因为LinkedList是为那些经常用于增删改查的数据而设计的 。因此上面这些方法都是为了实现这些功能而设计的简便方法 。
最后的pop 和push方法 说明LinkedList还经常被用于堆栈 。
当面试时 , 如果主考官问题 ArrayList和LinkedList 都一般在什么时候用时 。 你可以这样回答 。LinkedList随机增删多的场景比较合适,而ArrayList的随机访问多的场景比较合适。
Set子接口。
Set这个子接口并没有自己多余的方法 。 只是实现了Collection的所有方法 。 但这并不代表他的功能很少 。 Set一个十分重要的特点是放入其中的元素是不能相等的 。
Set子接口有两个十分重要的实现类 。 HashSet和treeSet 类 。
Hashset类。 这个类竟然没有一个自己多余的方法 全部都是从set子接口实现的方法 。 我觉得也真是因为这个, 所以他运行是占用的内存和效率都是比较低的 。
TreeSet 这个类有一个十分重要的特性 。 就是自动排序功能 。 根据什么排序的呢? 方法一: 放入其中的元素都继承了comparable接口 。
方法二: 定义treeset时 创于一个comparator对象 。
因为多了排序的特性 。 所以也多了如下方法 。
tailSet(E fromElement, boolean inclusive)
subSet(E fromElement, E toElement)
subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
pollLast()
lower(E e)
last()
higher(E e)
headSet(E toElement, boolean inclusive)
floor(E e)