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

23 篇文章 0 订阅
7 篇文章 0 订阅

看了一些文章,对集合进行了总结,以及与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的值为elementlist[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]

五、排序、反转、最值

 javapython备注
排序Collections.sort(al); list.sort() 
反转Collections.reverse(al); 
list.reverse() 
最值Collections.max(al); max(list) 

 javapython
获取数组长度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()移除数组头部第一个元素,并返回该元素,里面不可加indexlist.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() 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值