Java集合框架表示

1. 框架

集合框架CollectionListArray
Vector
LinkedList
setHashSet
TreeSet
LinkedHashSet
Queue
MapHashMap
HashTable
TreeMap

1.1 Collection

1.1.1 List

List是有序的Collection。

1.1.1.1 ArrayList

ArrayList 允许对元素的快速随机访问。数组的缺点是每个元素之间不能有间隙。当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中,当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制,移动,代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

ArrayList排列有序,可重复
底层使用数组
速度快,增删慢,getter()和setter()方法快
线程不安全
当容量不够时,ArrayList是当前容量*1.5+1
1.1.1.2 Vector

Vector 支持线程同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 AarryList 慢。

Vector排列有序,可重复
底层使用数组
查询速度慢,增删快
线程安全,效率低
当容量不够时,Vector默认扩展一倍容量
1.1.1.3 LinkedList

LinkedList是链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,它还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈,队列和双向队列使用。

LinkedList排列有序,可重复
底层使用双向循环链表数据结构
查询速度慢,增删快,add()和remove()方法快
线程不安全

1.1.2 Set

Set注重独一无二的性质,该体系集合用于存储无序(存入和取出顺序不一定相同)元素,值不值得重复。对象的相等性本质是对象 hashCode 值判断的,如果想要让两个不同的对象视为相等的,就必须覆盖 Object 的 hashCode 方法和equals 方法。

1.1.2.1 HashSet (Hash 表)

哈希表存放的是哈希值。HashSet 存储元素的顺序并不是按照存入时的顺序,而是按照哈希值来存取的,元素的哈希值是通过元素的hashCode方法来获取的。判断是否同一个元素时先判断hashCode再判断equal。HashSet 通过 hashCode 值来确定元素在内存中的位置。一个 hashCode 位置上可以存放多个元 素。

HashSet排列无序,不可重复
底层使用Hash表实现
存取速度快
内部是HashMap
1.1.2.2 TreeSet(二叉树)

TreeSet 是使用二叉树原理对新添加的对象按照指定的顺序排序(升序,降序),每增加一个对象都会进行排序,将对象插入到二叉树指定位置。Integer 和 String 对象都可以进行默认的TreeSet排序,而自定义类的对象时要排序必须实现 Comparable 接口,并且覆写相应的 comparaTo() 函数。在覆写 comparable() 函数时,要返回相应的值才能使TreeSet按照一定的规则来排序,比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整 数、零或正整数。

TreeSet排列无序,不可重复
底层使用二叉树实现
排序存储
内部是TreeMap的SortedSet
1.1.2.3 LinkedHashSet(HashSet+LinkedHashMap)

LinkedList 继承于HashSet,又基于 LinkedHashMap来实现。LinkedHashSet 底层使用LinkedHashMap来保存所有元素,它继承于 HashSet,其所有的方法 操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可

LinkedHashSet采用hash表存储,并用双向链表记录插入顺序
内部是LinkedHashMap

1.1.3 Queue

Queue在两端出入的List,所以也可以用数组或链表来实现

1.2 Map

1.2.1 HashMap(数组+链表+红黑树)

HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导 致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。

HashMap键不可重复,值可重复
底层使用hash表实现
线程不安全
允许key值为null,value也可以为null

1.2.2 HashTable

Hashtable 是遗留类,很多映射的常用功能与 HashMap 类似,不同的是它承自 Dictionary 类,并且是线程安全的,任一时间只有一个线程能写 Hashtable,并发性不如 ConcurrentHashMap,因为 ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用 HashMap 替换,需要线程安全的场合可以用 ConcurrentHashMap 替换。

HashTable键不可重复,值可重复
底层使用hash表实现
线程安全
key,value都不允许为null

1.2.3 TreeMap

TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。如果使用排序的映射,建议使用 TreeMap。在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的 Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异常。

TreeMap键不可重复,值可重复
底层二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值