Java比较实用的三种集合类

哪三种?

四种集合类对应四个接口
1.map接口,常见的实现有hashmap、treemap、hashtable、concurrenthashmap
2.list接口,常见的实现有arraylist、linkedlist、vector
3.set接口,常见的实现有hashset、linkedhashset、treeset

更多集合类以及更多的分类依据可以看大神的文章一张图让你看清Java集合类(Java集合类的总结)

1.map集合类

map接口通用的方法有:
1.map.size(),获取集合类大小(即map里存在的键值对映射数量)
2.map.values(),获取集合类所有值,返回类型为Collection
3.map.keySet(),获取集合类所有key,返回类型为set
4.map.put(key,value),将key-value这对键值对存入集合类中
5.map.get(key),获取key值对应的value,如果对应的values不存在,则返回null
6.map.remove(key),移除key值对应的value
7.map.clear(),清空集合里全部的键值对
8.map.putall(map2),把map2的全部数据复制到map,如果有重复的数据,那么map2中的数据会覆盖map的数据
9.jdk1.8新增加了lambda表达式map.forEach((k,v)->{语句}),语句中可以使用k,v形参代表相应的map中的key,value。
更多例子说明请看大神的文章,在参考文献1

1.1hashmap

hashmap的存储方式采用数组加链表的形式。最常见的map集合类,线程不同步,根据key值直接获取value,具有很高的访问速度。
一组键值对进来,先计算key的hashcode,然后找到和hashcode对应的数组下标,因为hash算法为压缩算法,所以不同的key可能会压缩到相同的下标。如果没有冲突则顺利填入数组中,如果冲突了这时候就会发生hash碰撞。
发生碰撞后hashmap采用的解决方法就是加上链表,在数组的下标对应的那个格子再加链表,当链表过多时在新版本里会加自动转化为红黑树。
在这里插入图片描述
hashmap刚被创建时数组有一个初始长度,当数组被填满到超过某个阈值时,就会扩大两倍,保持2的幂次方长度的原因是这样hash运算时才能最大程度的保持索引分布均匀

1.2treemap

存储方式为红黑树的方式,按照key值排序,可以支持自定义排序,线程不同步。
在插入删除等操作时代价要比hashmap高,适用于按自然顺序或自定义顺序取出数据的场景下使用。

1.3hashtable

与hashmap类似,不同之处在于他在同一时刻只支持一个线程对他进行操作,所以写入比hashmap慢,但他保证了线程同步。
这个集合类因为太过慢所以基本已经过时了,新版本中可以使用concurrenthashmap替换

1.4concurrenthashmap

concurrenthashmap是由一个个的segment组成,每个segment就是一个hashmap,同时一个segment只能由一个线程使用,所以segment的数量就代表了并发的最高数量。保证了部分是同步的就保证了整个集合是同步的。
segment的数量由默认值,也可以自己定义,一开始只会初始化segment[0],后面用到哪个部分才会初始化哪个部分,segment的数目创建后就一直不变了,当某个segment满了时,只会扩容segment里里面包含的数组

2.list集合类

list可以用来装任何东西,是对Collection接口的扩充。
1.list.add(index,element)在index位置添加元素,index可省略
2.list.remove(index)删除index位置的元素
3.list.set(index,element)修改index位置的元素
4.list.get(index)获取index位置的元素
5.list.indexOf(element)查找元素的索引
list.lastIndexOf(element)查找元素最后一次出现的索引

2.1arraylist

以数组的形式存储,动态数组,线程不安全
list最简单的实现方式,在创建时可以指定存储的数据类型,也可以不指定。根据构造方法的不同会有不同的扩容情况,
1,使用默认构造方法时,返回空数组,在第一次添加元素时扩容至默认长度10,之后按照容量的1.5倍扩容
2,使用自定义的触时容量构造方法,会自动初始化为指定的长度,注意当初始长度过小时,后面几次扩容速度会非常慢。
3.arraylist也存在最高容量,2的31次方减1,即int的最大值,当超出时抛出OutOfMemoryError(内存溢出)

2.2linkedlist

使用链表的形式存储,常被用做栈,队列,或双向队列使用,非同步
可以快速的插入第一个或最后一个元素,也可以快速取出第一个或最后一个元素。作为链表固有的缺点,随机访问时效率特别低。
1.linkedlist.getFirst();获取第一个元素
2.linkedlist.getLast();获取最后一个元素
3.linkedlist.add(Element);添加元素
4.linkedlist.removeFrirst();删除第一个元素并返回删除的元素(同理removeLast)
5.linkedlist.pollFirst();也可达到上面的效果(pollLast)

2.3Vector

和arraylist一样使用数组实现,也为动态数组,与arraylist的不同之处在于vector为线程同步的,代价就是访问比arraylist慢
提供添加、删除、修改、遍历、直接访问等功能

3.Set

set不能存储重复元素,适用于无序的元素,判断相等的方法为比较hashcode的值,不能单独实现,只能用hashset或linkedhashset或treeset等形式实现

3.1hashset

存储的时候按照hashcode的值排序,对于hashcode相同而equals时却不同的数,则在数组的基础上使用链表存储
add(),

3.2linkedhashset

有序形式的set,怎么存的就会怎么取出来(链表队列)

3.3 treeset

另一种形式的有序set,以红黑树的形式存储

写的比较简单,有什么疑问或错误欢迎交流2018-12-20

参考文献

1.java.util.Map——Map集合的常用方法
2.java中map的种类区别及排序详解(map集合的使用)
3.LinkedList基本用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值