实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点
其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>();
但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的!
今天的实习生活过的有点枯燥,我就打开了eclipse,看同事们写的代码,无意间又看到了这句话,所以决定学习一下这一类的操作——java中的容器类(集合类)
先偷个图来吧,我不会告诉你我是在百度百科里面偷的
如何,我们可以看出,java中的集合操作主要有两大类:Collection集合与Map映射
Collection
Collection是一个顶层的接口,他是java集合的一个抽象,在此基础上派生出了两个子接口,分别为:List与Set
List
List接口,特点有序的,所存储的对象可以为null,并且允许重复,这点与set有很大区别,Set是不允许重复的,List很类似于数组,对于List对象的访问可以通过类似于数组下标去访问,但是是通过get(int index)方法进行访问的,同时其实际长度也很类似于数组,可以通过size()返回其实际长度,除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。list常见方法:addAll(Collection<? extends E> c)
:添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序
addAll(int index, Collection<? extends E> c)
:将指定 collection 中的所有元素都插入到列表中的指定位置与数组相比较,list的查询效率 高,但是插入和删除的效率较低,因为插入和删除会引起其他元素的位置变化clear()
:从列表中移除所有元素
get(int index)
: 返回列表中指定位置的元素
iterator()
: 返回按适当顺序在列表的元素上进行迭代的迭代器
lastIndexOf(Object o)
:返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1
listIterator()
:返回此列表元素的列表迭代器(按适当顺序)
listIterator(int index)
:返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始
remove(int index)
: 移除列表中指定位置的元素
removeAll(Collection<?> c)
: 从列表中移除指定 collection 中包含的其所有元素
retainAll(Collection<?> c)
: 仅在列表中保留指定 collection 中所包含的元素
size()
:返回列表中的元素数
subList(int fromIndex,int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图
toArray()
:返回按适当顺序包含列表中的所有元素的数组
详细方法信息还是参考一下API里面的吧实现list接口的主要有:ArrayList、LinkedList、Vector和Stack
ArrayList
通过名字就能知道这是个啥了吧,灰常类似于数组ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步,仅有Vector实现了同步(线程安全),每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小,默认值好像是10。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法(设定长度最小值)来增加ArrayList的容量以提高插入效率。和LinkedList一样,ArrayList也是非同步的(unsynchronized)
案例:
package test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static int flg = 0; public int self = 0; public Test() { ++flg; self = flg; System.out.println("已经初始化了:" + flg + "个实例"); } public static void main(String[] args) { // TODO Auto-generated method stub /* * 加入范式Test表示这里存储Test类型,并且可以获得具体值之后,可以访问对象的方法和属性 比如下述:list.get(i).flg * 若不添加范式,则无法访问该self属性或者其他方法 */ List<Test> list = new ArrayList<Test>(); for (int i = 0; i < 5; i++) { list.add(new Test()); System.out.println(list.get(i).self); } list.add(new Test()); System.out.println(list.get(list.size() - 1).self); list.addAll(list); System.out.println(list.size()); list.add(0, null); System.out.println(list.get(0)); // 使用迭代器去遍历 Iterator<Test> myiterator = list.listIterator(); Test test; while (myiterator.hasNext()) { test = myiterator.next(); if (test != null) System.out.println(test.self); else System.out.println(test); } } }
LinkedList
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
案例:有待补充
Vector
Vector类似于ArrayList,但是确实同步的,也就是说他是线程安全的,换句话说就是如果Vector创建了一个迭代器,那么这个迭代器正在使用的时候,另一个线程改变了这个Vector的状态,那么就会产生异常案例:有待补充
Stack
栈这个东西,在数据结构里面学过的,以前很熟悉,可是现在我就陌生了,大概的知道这个有一个特性:LIFO后进先出,在java中Stack是基于Vector的,除了基本的方法push()和pop()方法,java的Stack还提供了一个peek()获取栈顶元素值的方法,empty方法判断是否为空,search方法寻找某个元素在栈中的位置等案例:有待补充
Set
Set是一种不可重复的Collection接口,set的检索效率相对较低,而与list对比,插入和删除的效率较高,不会引起其他元素位置的变化,Set是无序的,Set和List最大的区别是Set不允许重复
我们重点要记住这家伙不能重复
Set不允许重复的原因是,他是基于Map实现的,而Map中的key是不允许重复的,Set中使用的仅仅是Map中的key
Set常见的方法,详细情况请参考Java语言的API
add(E e)
:如果 set 中尚未存在指定的元素,则添加此元素
addAll(Collection<? extends E> c)
:如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中
clear()
:移除此 set 中的所有元素
contains(Object o)
: 如果 set 包含指定的元素,则返回 true
containsAll(Collection<?> c)
:如果此 set 包含指定 collection 的所有元素,则返回 true
equals(Object o)
:比较指定对象与此 set 的相等性
isEmpty()
:如果 set 不包含元素,则返回 true
iterator()
:返回在此 set 中的元素上进行迭代的迭代器
remove(Object o)
: 如果 set 中存在指定的元素,则将其移除
removeAll(Collection<?> c)
:移除 set 中那些包含在指定 collection 中的元素
retainAll(Collection<?> c)
: 仅保留 set 中那些包含在指定 collection 中的元素
size()
:返回 set 中的元素数
toArray()
:返回一个包含 set 中所有元素的数组
比较蛋疼,set中是没有get方法获取元素对象的,只能通过迭代器来访问数据
我们常见的Set实现类有:TreeSet、HashSet和LinkedHashSet
TreeSet
TreeSet居然是有序的,默认是自然序列的,排序方式可以使用自带的,也可以使用自定义,在创建TreeSet的时候,传递一个自定义的排序规则对象即可,另外既然它是有序的,有是基于TreeMap实现的,那么TreeSet中的元素对象必须实现Comparable接口,但是如果是字符串对象的话,呵呵,不需要了,String本身就已经实现了Comparable接口了案例:有待补充
HashSet
和TreeSet一样只能通过迭代器来访问数据,HashSet是基于HashMap实现的,但是是无序的,常用的方法和Set接口的相近,记住一点,访问必须通过迭代器,迭代的顺序不能保证是和插入的顺序一致,这点与LinkedHashSet正好是相反的
案例:有待补充
LinkedHashSet
LinkedHashSet是一个链表结构,与上述一致,通过迭代器遍历,但遍历的顺序和插入的顺序一致
案例:有待补充
Map
2014年8月26日23:41:50
明天在查询一下Map的资料吧,写到这了,发现还有很多东西需要继续学习,比如迭代器,比如泛型,呵呵,小菜鸟,不会飞,我只能慢慢爬
原文:http://blog.csdn.net/u012453619/article/details/38852519