java集合

java集合

集合存放于java.util包中,主要由3种:set、list和map

  • Collection:是集合list、set、queue的最基本的接口
  • 不包含重复元素
  • List:有顺序的collection,并且可以包含重复元素。
  • map:可以把键(key)映射到值(value)的对象,键不能重复。

List

List继承于Collection,是有序的,有三个实现类,分别是ArrayList、Vector、LinkedList

ArrayList

  • 内部通过数组实现的
  • 允许对元素快速随机访问
  • 插入和删除元素代价较高
  • 适用于随机查找和遍历,不适合插入和删除

Vector

  • 通过数组实现
  • 线程同步,即某一时刻只有一个线程能够写Vector,避免不一致性,但实现同步消耗高
  • 访问速度比ArrayList慢

LinkList

  • 内部通过链表结构实现
  • 适合数据的动态插入和删除
  • 随机访问和遍历速度慢
  • 他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当做堆栈、队列和双向队列使用,实现双向链表

Set

set用户存储无序元素,并且值不允许重复。对象的相等性本质是对象hashCode值判断的。

HashSet(Hash表)

  • HashSet是基于HashMap实现的
  • 哈希表存放的是哈希值。HashSet是无序的,存储元素的顺序不是按照存入时的顺序,而是按照哈希值来存取。元素的哈希值是通过元素的hashcode方法来获取的。
  • 允许放入null值
    HashSet判断元素是否相同:首先判断两个元素的hashCode值,如果hashCode值相同,接着调用equals方法,如果结果为true,则视为同一元素。

注意:hashCode值相同,equals不一定为true,而equeals为true,hashCode一定相同

TreeSet(二叉树)

  • TreeSet底层是基于二叉树原理实现的,每增加一个对象,都会进行排序(升序或降序),将对象插入二叉树指定位置
  • 不允许放入null值
  • Integer和String对象口可以进行默认TreeSet排序,而自定义类的对象不可以。自定义的类必须实现Comparable接口,重写compareTo()函数

LinkHashSet

  • 继承于HashSet,又是基于LinkedHashMapshxian的。底层使用LinkedHashMap来存储所有元素,继承于HashSet,其所有方法操作又与HashSet相同。

Map

HashMap

  • 底层实现是数组+链表+红黑树(java8中加入了红黑树,java7中的结构就是数组+链表)
  • HashMap根据键的hashCode值存储数据,因此能够快速访问
  • HashMap最多只允许一条记录的键为null,允许多条记录的值为null
  • HashMap非线程安全,即某一时刻允许多个线程同时写HashMap,可能导致数据不一致
  • 可以使用Collection的synchronizedMap方法使HashMap具有才能成安全能力,或者使用ConcurrentHashMap

java8中的HashMap结构
在这里插入图片描述
java8中的HashMap结构
我们知道,在java7中,查找某个元素的时候,根据hash值我们能够快速定位到数组的具体下标,但是,之后我们需要顺着链表一个个比较查找我们需要的元素,时间复杂度取决于链表的长度为O(n),为了降低这部分的开销,在java8中,当元素超过8个以后,会将链表转换为红黑树,这样查找的时间复杂度将可以降低O(logN)
在这里插入图片描述

ConcurrentHashMap

  • ConcurrentHashMap支持并发操作,整个ConcurrentHashMap由一个个Segment组成
  • 简单的说ConcurrentHashMap是一个Segment数组,Segment通过继承ReentrantLock进行加锁,每次加锁的是一个Segment,保证了每个Segment线程安全,也就实现了全局的线程安全
  • ConcurrentHashMap默认有16个Segment,所以理论上同时支持16个线程并发写,只要他们分布在不同的Segment
  • ConcurrentHashMap一旦初始化后不能扩容

ConcurrentHashMap数据结构
在这里插入图片描述
注意:在java8中,ConcurrentHashMap也引入了红黑树

HashTable

  • 很多功能与HashMap类似,但是它继承自Dictionary类
  • HashTable线程安全,任一时间只有一个线程能写HashTable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。因此HashTable不建议在代码中使用,因为不需线程安全可以使用HashMap替代,需要线程安全可以用ConcurrentHashMap替代

TreeMap

  • TreeMap可排序,实现了SortedMap接口,能够根据键排序,默认按简直的升序排序。也可以自定义。
  • 在使用TreeMap,key必须实现Compareable接口,否则会抛出java.lang.ClassCastException类型的异常

LinkHashMap

  • LinkHashMap是HashMap的子类,保存了记录的插入顺序,所以是有序的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值