首页 > 代码库 > java中的集合操作类(未完待续)
java中的集合操作类(未完待续)
申明:
实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点
废话
其实我写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常见方法:add(E e)
:向列表的尾部添加指定的元素add(int index,E element)
: 在列表的指定位置插入指定元素addAll(Collection<? extendsE> c)
:添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序addAll(int index,Collection<? extends E> c)
:将指定 collection 中的所有元素都插入到列表中的指定位置与数组相比较,list的查询效率 高,但是插入和删除的效率较低,因为插入和删除会引起其他元素的位置变化clear()
:从列表中移除所有元素contains(Object o)
:如果列表包含指定的元素,则返回truecontainsAll(Collection<?> c)
:如果列表包含指定 collection 的所有元素,则返回trueget(int index)
: 返回列表中指定位置的元素indexOf(Object o)
:返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1iterator()
: 返回按适当顺序在列表的元素上进行迭代的迭代器lastIndexOf(Object o)
:返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1listIterator()
:返回此列表元素的列表迭代器(按适当顺序)listIterator(int index)
:返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始remove(int index)
: 移除列表中指定位置的元素remove(Object o)
:从此列表中移除第一次出现的指定元素removeAll(Collection<?> c)
: 从列表中移除指定 collection 中包含的其所有元素retainAll(Collection<?> c)
: 仅在列表中保留指定 collection 中所包含的元素set(int index,E element)
:用指定元素替换列表中指定位置的元素size()
:返回列表中的元素数subList(int fromIndex,int toIndex)
返回列表中指定的fromIndex(包括 )和 toIndex(不包括)之间的部分视图toArray()
:返回按适当顺序包含列表中的所有元素的数组详细方法信息还是参考一下API里面的吧实现list接口的主要有:ArrayList、LinkedList、Vector和StackArrayList
通过名字就能知道这是个啥了吧,灰常类似于数组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<? extendsE> 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的资料吧,写到这了,发现还有很多东西需要继续学习,比如迭代器,比如泛型,呵呵,小菜鸟,不会飞,我只能慢慢爬
java中的集合操作类(未完待续)