java容器
Posted cn-boya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java容器相关的知识,希望对你有一定的参考价值。
1.容器的概念
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中,只能存放引用数据类型。
集合和数组相似点:
都可以存储多个对象,对外作为一个整体存在
数组的缺点
(1)长度必须在初始化时指定,且固定不变
(2)数组采用连续存储空间,删除和添加效率低下
(3)数组无法直接保存映射关系
(4)数组缺乏封装,操作繁琐
2.容器 API
3.Collection 接口
分为List和Set接口。
Collection 接口存储一组不唯一,无序的对象(单个对象)
集合作为容器应该具有的功能(增,删,改,查),
不一定全有。
集合的基本操作:增加,删除,判断,取出
Collection 接口存储一组不唯一,无序的对象
4.Iterator 接口
所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
ListIterator为Iterator接口的扩展,里面有许多Iterator没有的方法,可以解决iterator无法解决的并发修改的异常。
5.Set 接口
Set 接口存储一组唯一,无序的对象
分为HashSet接口、LinkedHashSet接口、TreeSet接口
(存入和取出的顺序不一定一致)
操作数据的方法与List类似,Set接口不存在get()方法
HashSet:采用Hashtable哈希表存储结构,底层数组结构使用的是hash表,主结构数组,+链表。
创建HashSet时,底层创建的是一个HashMap对象,HashSet使用了HashMap的数据结构。
优点:添加速度快,查询速度快,删除速度快
缺点:无序
使用HashSet存储对象,必须重写对象的hashcode和equals方法。
LinkedHashSet
采用哈希表存储结构,同时使用链表维护次序
有序(添加顺序)
TreeSet
TreeSet的底层所使用的是TreeMap 数据结构为红黑树。
二叉树:每个结点的度均不超过2的有序树。结点的度即该结点的分支数。
采用二叉树(红黑树)的存储结构
优点:有序(排序后的升序)查询速度比List快(二分查找)
(按照内容查询)
缺点:查询速度没有HashSet快
按升序排序
使用TreeSet存放自定义类型的对象会报错,原因是自定义的类中没有指定排序的方式
解决方法:自定义的类实现Comparable 接口,实现compareTo方法
外部比较器
单独创建一个类 实现Comparator 来实现比较大小的功能,创建treeSet的对象的时候用一个外部比较器的对象进行构造
内部比较器
在比较的对象中重写Comparable方法来实现比较大小
6.Comparable 接口
7.List 接口
List 接口存储一组不唯一,有序(插入顺序)的对象
就是在Collection接口上添加了下标,在List接口中多了一些通过下标来操作元素的方法
ArrayList实现了长度可变的数组,在内存中分配连续的空间。
优点:遍历元素和随机访问元素的效率比较高
缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低
LinkedList采用双向链表存储方式。
优点:插入、删除元素时效率比较高
缺点:遍历和随机访问元素效率低下
listlterator接口用来获取查询元素。
8.Map 接口
Map接口存储一组键值对象,提供key到value的映射
HashMap
Key无序 唯一(Set)
Value无序 不唯一(Collection)
LinkedHashMap
有序的HashMap
hash表的存储原理
hash表的主结构为数组
1.调用hashCode()方法计算Hash码值
2.根据y=k(x)这样的函数计算存储位置
3.如果位置上没有元素,则将元素存储
4.如果该位置上有元素,则需要调用equals方法比较内容是否相同。
元素添加步骤:
1.计算元素的哈希码值
2.根据y=kx(除留取余法)或直接定址法、平方取中法、折叠法等哈希函数计算在哈希表中的存储位置,x:哈希码,y:在哈希表的存储位置。
3.如果该位置上有元素,使用equals方法判断该元素是否重复。如果重复,直接删除,如果不重复执行第4步。
4.将该元素用节点(链表)的方式与该位置其它元素的地址连接,再放入该存储位置。
从JDK1.8开始,当链表的个数大于等于8时,将用红黑树连接。
TreeMap
有序 速度没有hash快
底层采用红黑树(接近平衡二叉树)数据结构
使用TreeMap存储自定义对象做为key时,要求必须具备比较规则,否则程序报错。
获取map中的所有键 map中的键不能重复,同时又没有顺序,所以map中的所有键构成一个set集合
获取map中的所有值 map中的value可以重复,同时又没有顺序,所以map中的所有值构成一个collection集合
以上是关于java容器的主要内容,如果未能解决你的问题,请参考以下文章