Android面试准备之集合


首先 集合类型有两种: Collection 和 Map。
Collection 又分为List、Set以及Queue。
List又有ArrayList、LinkedList等。
Set又有HashSet、TreeSet等。
Queue又有DelayQueue、ArrayDeque、PriorityQueue等。
Map又有HashMap、TreeMap、Properties等。
  1. public class Test {  
  2.   
  3.     List l1 = new LinkedList();  
  4.     List l2 = new ArrayList();  
  5.     List l3 = new CopyOnWriteArrayList();  
  6.   
  7.     Set s1 = new HashSet();  
  8.     Set s2 = new TreeSet();  
  9.     Set s3 = new ConcurrentSkipListSet();  
  10.     Set s4 = new CopyOnWriteArraySet();  
  11.     Set s5 = new LinkedHashSet();  
  12. //    Set s6 = new ArraySet();  API 23  
  13.   
  14.     Queue queue1 = new DelayQueue();  
  15.     Queue queue2 = new ArrayDeque();  
  16.     Queue queue3 = new ConcurrentLinkedQueue();  
  17.     Queue queue4 = new LinkedBlockingQueue();  
  18.     Queue queue5 = new PriorityBlockingQueue();  
  19.     Queue queue6 = new SynchronousQueue();  
  20.     Queue queue7 = new PriorityQueue();  
  21.     Queue queue8 = new ArrayBlockingQueue(0);  
  22.   
  23.     Deque deque1 = new ArrayDeque();  
  24.   
  25.     Map map1 = new HashMap();  
  26.     Map map2 = new TreeMap();  
  27.     Map map3 = new LinkedHashMap();  
  28.     Map map4 = new ConcurrentHashMap();  
  29.     Map map5 = new ConcurrentSkipListMap();  
  30.     Map map6 = new IdentityHashMap();  
  31.     Map map7 = new Hashtable();  
  32.     Map map8 = new Properties();  
  33.   
  34. }  

Collection 是一个接口,继承自Iterable。
Collection接口提供了下面这些方法。
添加一个或者多个 add(Object o)、addAll(Collection c);
移除一个或者多个 remove(Object o)、removeAll(Collection c);
是否包含一个或者多个 contains(Object o)、containsAll(Collection c);
元素数量 size()、是否等价 equals(Objiect o)、是否为空 isEmpty()、清空 clear()、哈希值 hashCode()、转数组 toArray();
保留相同元素 retainAll(Collection c)、iterator()。

如果希望收集时记录每个对象的索引顺序,并可以依索引取回对象,就用List。
ArrayList内部是使用Object数组来保存收集对象的,也因此考虑是否使用ArrayList就等于是否要使用到数组的特性。
数组在内存中会是连续的内存空间,根据索引随机存储时速度快。像是排序,就是ArrayList,有较好的速度表现。
但是如果需要调整索引顺序时,会比较差。如果在一个已经收集100个对象的ArrayList中,使用add方法在开始的索引位置0新增一个对象,则需要把之前的对象都向后调整一个位置。
数组的长度固定也是要考虑的问题,ArrayList内部数组长度不够是,会建立新数组,并将原数组的对象放到新数组,这也是耗费时间和内存的操作。

LinkedList采用的则是链接结构,也就是链表。在每次添加对象的时候才会建立新的节点来保存对象,不会事先耗费内存。所以,若收集的对象经常会有变动索引的情况,像是随时会有客户端登录或者注销的客户端List,选用LinkedList会比较好。

如果希望收集的对象不重复,具有集合的行为,则用Set。
例如收集一段字符串中用到了那些字母,就和用Set来收集。但是如果收集的是其他的类,则需要重写该对象对应类的hashCode和equals方法,告诉Set什么样的实例才算重复。

如果收集对象时可以是队列方式,收集的对象加入尾端,取得对象时可以从前端,则可以用Queue。
Queue继承自Collection,具备add()、remove()等方法,然而Queue也定义了 插入对象 offer(), 取出和移除对象 poll(), 取出但是不移除 peek()等方法。
如果对象有操作Queue,并打算以队列方式使用,且队列长度受限,通常建议使用offer(),poll(),peek()等方法。与add()这些Collection的方法相比,他们操作失败会返回固定的值而不会抛出异常,而Collection的方法操作失败则会抛出异常。

如果希望对队列的前端和尾端加入与取出对象,则使用Deque.
Deque中定义addFirst(),removeFirst(),getFirst(),addLast(),removeLast(),getLast()等方法,操作失败会抛出异常。而offerFirst(),pollFirst(),peekFirst(),offerLast(),pollLast(),peekLast()等方法,操作失败会返回特定值。

对于有索引的集合进行排序的问题。java.util.Collections提供有sort()方法。要进行排序,收集的对象就得操作Comparable接口,然后再compareTo()告诉它怎么比较;或者操作Comparator接口。

Map就是以键值对的形式来收集数据的。对Map而言,键是不会重复的。判断是否重复是根据hashCode()和equals()两个方法。
Map中的HashMap 在建立键值对应之后,键是无序的;而TreeMap的键是有序的,条件是作为键的对象必须操作Comparable接口,或者是在创建TreeMap时指定操作Comparator接口的对象。
而另一种Map---Properties.它是通过setProperty()和getProperty()来设置键值和获取对应键的值。
访问Map的键值,获取一个Map所有的键可以用keySet()方法,获取所有的值可以用values();获取所有的键值则用entrySet()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值