看了一些文章,对集合进行了总结,以及与python对比如下
如何选择集合?
* 在各种Lists中,最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList();Vector总是比ArrayList慢,所以要尽量避免使用。
* 在各种Sets中,HashSet通常优于TreeSet(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。TreeSet存在的唯一理由:能够维护其内元素的排序状态。
* 在各种Maps中HashMap用于快速查找。
* 当元素个数固定,用Array,因为Array效率是最高的。
结论:最常用的是ArrayList,HashSet,HashMap,Array。而且,我们也会发现一个规律,用TreeXXX都是排序的。
1. 无顺序要求,选HashSet
- 精简 如何选择集合类
2. 对顺序有求,选ArrayList
3. 要顺序,经常修改,选LinkedList
4. 键-值 HashMap
5.ArrayList类可以创建动态数组;
6.LinkedList类可以创建链表结构;
7.Vector类可以创建线程同步的动态数组;
8.HashMap类可以创建键值对集合。
- 注意:
1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。HashMap会利用对象的hashCode来快速找到key。
* hashing
哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。
我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。
发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。
6、Map中元素,可以将key序列、value序列单独抽取出来。
使用keySet()抽取key序列,将map中的所有keys生成一个Set。
使用values()抽取value序列,将map中的所有values生成一个Collection。
为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。
- Arraylist(与python中list相似)一些常用方法:
ArrayList al = new ArrayList();
一、添加元素
java | 备注 | python | 备注 |
al.add("a"); | 末尾添加元素,java里stringbuffer的添加才用append() | list.append(obj) | |
Insert(int index,object value) | 方法也可以用来将元素插入到索引处, 不过其有一定的限制性,必须在数组长度以内插入数组 | list.insert(index, obj) | |
InsertRange(int index,ICollection c) | |||
二、删除元素
java | 备注 | pyhon | 备注 |
al.Remove(object obj); | 移除数组中的obj元素 | list.remove(obj) | 移除列表中某个值的第一个匹配项 |
al.RemoveAt(int index); | 移除索引为index的数字元素 | list.pop([index=-1]) | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的 |
al.RemoveRange(int indext,int count); | 移除从索引index开始,移除count个元素 |
三、修改元素
java | python | ||
al.set(index,element) | 修改索引index的值为element | list[indx]=element |
四、查找元素、获取元素
java | python | ||||||||
al.Contains(object obj); | 查找数组中是否有obj元素,存在返回true; | f obj in al : | |||||||
| list.index(obj) | 从列表中找出某个值第一个匹配项的索引位置 | |||||||
al.LastIndexOf() | LastIndexOf(obj)是查找要obj最后出现的位置 |
获取元素:
al.get(index)
python: list[indx]
五、排序、反转、最值
java | python | 备注 | |
排序 | Collections.sort(al); | list.sort() | |
反转 | Collections.reverse(al); | list.reverse() | |
最值 | Collections.max(al); | max(list) |
java | python | |
获取数组长度 | al.size() | len(list) |
LinkedList
其实也就是我们在数据结构中的链表,这种数据结构有这样的特性:
分配内存空间不是必须是连续的;插入、删除操作很快,只要修改前后指针就OK了,时间复杂度为O(1);
访问比较慢,必须得从第一个元素开始遍历,时间复杂度为O(n);
与Arraylsit 不同的常用操作:
功能 | java | 备注 | python | 备注 |
al.push( e) | 在数组头0增加相当alinsert(0,e) | ist.insert(0,e) | ||
al.pop() | 移除数组头部第一个元素,并返回该元素,里面不可加index; | list.pop(0) | 要想达到python list.pop()一样去尾部的方法在java中可以把al反转后用pop() | |
al.peek() | 获取第一个元素,但是不移除,与pop相同,但不剔除 | list[0] | ||
al.peekLast() | 获取最后一个元素,但是不移除; | list[-1] |
java | python | ||
al.poll() | 和al.pop()相同 | list.pop(0) | |
al.pollLast() | 移除数组最后一个元素,并返回该元素,里面不可加index; | list.pop() |