JAVA集合详解

java集合功能非常强大,总的来说主要是List Set Map 这三类
1.首先我们来看一下集合与数组的区别

1)长度区别:数组长度固定,集合可变
2)内容区别:数组可以是基本类型,也可以是引用类型,集合必须是引用类型
3)元素区别:数组只能储存一种类型的,集合储存多种,但一般也是一种

2.Collention集合

List,Set都是继承Collention实现的集合,所以都实现了Collention中的方法,它们是:
boolean add(E e)             向集合尾部添加元素、
boolean remove(Object o)     集合中有该集合相等的元素则删除
void chear()                 清空集合元素,调用后集合为空
boolean contains(Object o)   集合中是否包含该元素
int size()                   集合个数
boolean addAll(Collention c) 将c中元素全部加入到集合中去
Object[] toArray()             转为数组
Iterator Iterator()          迭代器 集合专用遍历

3.常用的集合分类

Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全,增删快,查找慢
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全,增删慢,查找快
│—————-├ Vector 接口实现类, 数组,同步, 线程安全,增删慢,查找快
├——-Set 接口:仅接收一次,不可重复,并做内部排序
│—————-├ HashSet  hash表
│—————-———-———-└LinkedHashSet 链表维护元素的插入次序
│—————-├ TreeSet  底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

4.List和Set详解

1)区别:
  有序性:List按照插入顺序排序 Set储存和取出不一致
  唯一性:List可以重复 Set不可以
  元素区别:List可以通过索引获取元素,Set不行

20180803201736883.png

2)Set:
HashSet底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储 
元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
覆盖hashCode()方法的原则:
 1、一定要让那些我们认为相同的对象返回相同的hashCode值
 2、尽量让那些我们认为不同的对象返回不同的hashCode值,否则,就会增加冲突的概率。
 3、尽量的让hashCode值散列开(两值用异或运算可使结果的范围更广)
LinkedHashSet底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一 
性。线程不安全,效率高。
TreeSet底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结 
构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实 
现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相 
同,不需要存储;比较器排需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的 
方式new一个Comparator对象,重写里面的compare()方法;
3)总结:
 (1)、List,Set都是继承自Collection接口,Map则不是
 (2)、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注 
  意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的 
  Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代, 
  因为他无序,无法用下标来取得想要的值。)
 (3).Set和List对比:
  Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
  List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
 (3)应用:
  ArrayList 多用户多查询的场景,LinkedList多用于插入
  HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在 
  我们需要排序的功能时,我们才使用TreeSet。

请输入图片描述

4.Map详解
1)Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重
复。 所以通过指定的key就可以取出对应的value。
20180803205119738.png
2)HashMap和HashTable的比较:
20180803205546704.png
3)TreeMap:
20180803205736499.png

IdentityHashMap和HashMap的具体区别,IdentityHashMap使用 == 判断两个key是否相等,而HashMap使用的是equals方 
法比较key值。有什么区别呢?
对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等; 如果作用于引用类型的变量,则比较的是所        
指向的对象的地址。
对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

HashMap 非线程安全
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和 
equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

4)应用:

HashMap:适用于Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
数据结构
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值