java集合

集合和数组的区别

数组:1.长度固定 2.数组里面元素类型单一3.不便于删除,添加,插入等操作4.数组存储的数据是有序的,可重复的
集合:1.长度不固定 2.集合里面元素是对象(对于collcetion),没有要求3.集合便于删除,添加,插入等操作 5.集合中有的存储数据时有序的,可重复的,有的是无序的,不可重复的

集合的类型

collection----------单列数据
List:(LinkedList 和 ArrayList) ------------储存数据是有序的,可重复的
Set:(HashSet (LinkedHashSet)和SortedSet(TreeSet))-----------------储存数据是无序的,不可重复的
Vector:(queue)
Map----------双列数据(key—value)
HashMap:(LinkedHashMap)
SortMap:(TreeMap)
HashTable:(Properties)

下面开始逐一讲解:

LinkedList:底层采用的是双向链表,插入速度快,查询速度慢
ArrayList:底层采用的是动态数组,jdk1.7以前当创建arrylist对象的时候便创建了一个容量为10的数组,而jdk1.7以后是当创建arraylist对象的时候创建一个容量为0的数组,当第一次add元素的时候才将数组容量变为10;因为arraylist底层是数组,所以可以根据索引访问元素,因此插入慢,查找快,并且元素可以是重复的,是有序的
hashmap:这里先说hashmap吧,下面hashset要用到hashmap,hashmap是一个<key,value>的键值对,它允许键和值都可以为null,在jdk1.8以前,hashmap底层是的数组(entry)+链表,当创建一个hashmp对象的时候,则会创建一个容量为16的数组,数组的每一项都是一个entry(即一个<key,value>键值对),在jdk1.8以后,hashmap底层是数组(Node)+链表+红黑树(数组的每一个元素都可以看成是一个链表或者一棵红黑树),其实node和entry是一样的,拿jdk1.8来讲,当创建一个hashmap对象的时候,首先会创建一个容量为0,负载因子为0.75的数组,当你第一次put元素的时候便会将数据容量变为16,每当你添加元素的时候,他首先先计算出key的hashcode值,然后根据hash函数计算出该key在数组的当前索引位置,(并判断是否超出了该数组的阈值,即160.75,如果超过了就经行扩容,即162,否则进行下一步),假如此位置有值,则比较两个数的equals值,如果相等,则确定是一个对象,并将新添加进来的value赋给之前的key的value,假如判断一圈发现都不想等,则将该键值对添加到该链表的最后。当数组的容量为64,并且数组中某一项的链表长度超过了8,则将该链表转换为一棵红黑二叉树,当你romove到一定程度,该红黑树的节点小于6,则该红黑树又将转换为链表
hashset:hashset底层是依靠hashmap,当创建hashset对象的时候,便在内部创建了一个hashmap对象,并将hashset的value转换为hashmap的key,将一个空的object对象赋值给hashmap的value,此后对hashset的一系列操作都是对这个hashmap的操作,因为hashmap的key不能相同,所以hashset的value不可重复,因为hashset底层并不是数组,所以,hashset元素又是无序的;
hashtable:hashtable基本上和hashmap一样,hashtable继承了dictionary,而hashmap继承了abstracthashmap,hashmap将hashtable的contions方法转换为contionskey方法和contionsvalues方法,最大的区别就是hashtable是安全的,是同步的,hashmap是不安全的,不同步的,hashtable键值对不能是null值,hashtable初始化容量为11
treemap:底层也是红黑树,内部主要是有一个conparable比较器,每当添加进去一个元素,便会经行比较,当然,treemap添加进去的对象必须经行自然排序或者定制排序,斗则会抛出异常,假如添加进去的新元素与之前添加进去的某一个元素的key比较之后相等,则会将新元素的value赋值给旧元素
treeset:底层是treemap
linkedhashset:底层是hashset
vector:vector是同步的,,线程安全的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值