java中如何选择合集,以及ArrayList 、LinkedList与python 的list用法对比

看了一些文章,对集合进行了总结,以及与python对比如下

java中如何选择合集,以及ArrayList 、LinkedList与python 的list用法对比


java中如何选择合集,以及ArrayList 、LinkedList与python 的list用法对比

java中如何选择合集,以及ArrayList 、LinkedList与python 的list用法对比

如何选择集合?

* 在各种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 :  
al.IndexOf(object obj); 从0开始查找obj元素,只第一个obj元素,并返回起在数组中的位置,如果不存在,返回-1;
al.IndexOf(object obj,int startIndex);  //从startIndex开始查找obj元素,只第一个obj元素,并返回起在数组中的位置,
al.IndexOf(object obj,int startIndex,int count); 

从startIndex开始想后查找count个元素,如果存在obj元素,则返回其在数组中的位置


  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()