Java集合总结

集合体系(未完待续。。。)
Collection(List和Set)
List:(列表;实现了Iterable接口,有序,可以包含重复元素和null)

ArrayList:线程不安全,底层是动态数组。在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快。默认大小为10,增容50%。

LinkedList:线程不安全,底层双向链表,每个节点都存储着上一个节点和下一个节点的地址以及本节点的数据。增加时只要让前一个元素记住后一个元素,后一个元素记住前一个元素,这样的增删速度快;查询的时候需要一个一个的遍历,所以速度慢。

Vector:线程安全,和ArrayList的原理相同。 像数组一样,它包含可以使用整数索引访问的组件。但是, Vector的大小可以根据需要增长或缩小,以适应在创建Vector之后添加和删除项目。

ArrayList和LinkedList的区别:

在用法上没有区别,但是在功能上还是有区别的。LinkedList经常用在增删操作较多而查询操作很少的情况下,ArrayList则相反。

Set(集;实现了Iterable接口,无序、不可以包含重复元素)

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

HashSet:线程不安全,无序不重复,由哈希表支持。 这个类允许null元素。是由hashCode和equals保证HashSet中的元素不重复。

TreeSet:线程不安全,有序不重复,底层是二叉树,它可以给Set集合中的元素进行指定方式的排序。默认是元素自然排序,可以根据实现Comparable接口(比较器)的compareTo()方法进行排序。判断重不重复也是通过compareTo()方法来完成的,当compareTo()方法返回值为0时,两个对象是相同的。

LinkedHashSet:底层是基于LinkedHashMap实现的,它和HashSet主要区别在于LinkedHashSet中存储的元素是在哈希算法的基础上增加了链式表的结构。

Set与List的区别:

List基本上都是以Array为基础(LinkedList是以链表存储)。但是Set则是 在HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。

发现hashset是通过将相应的内容存储在了一个hashmap里的key中,然后再去读取的。为
了保证hashset里面的数据唯一性,这里将hashset存放的元素作为了hashmap里面唯一
的key变量,value部分用一个PRESENT对象来存储,也就是源码里面的这一句内容:
	private static final Object PRESENT = new Object();
其实hashset底层的很多部分都是引用了hashmap来进行实现的,
Map集合:存储的是键值对

Map集合存储的元素是成对出现的,存放的是键值对,键值是唯一的,但是值可以不唯一。Map的键是一个Set集合,只有这样才可以保证键的唯一性,因为Set集合从不放入重复的元素,这就保证了键的唯一性。
  
HashMap :底层是数组和链表的结合体(在数据结构称“链表散列“),线程不安全,当你往HashMap中放入键值对的时候,如果你放入的键是自定义的类,那么其该键值对的位置与键对象本身的hashCode()方法返回的哈希值有关。判断重不重复,是通过键对象本身的hashCode()方法和equals()方法决定的,所以当你想把你自定义的类对象通过键来放入HashMap集合,最好重写一下这个自定义类的hashCode()方法和equals()方法。其实Map主要的特点都是通过键来完成的,所以你只要封装好你的自定义类,就可以保证键值的唯一性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值