java 集合

java 集合

集合有两种类型colleciton和map这两个接口是所有接口的父接口。

  • colleciton接口的子接口有set和list
  • map的接口的子接口有hashMap,treeMap,concurrnetHashMap,linkHashMap等
  • set的接口的子接口有 hashSet,TreeSet和linkHashSet等
  • list的接口的子接口有ArrayList,linkList,stack以及vector等

集合和数组的区别

(1)数组可以引用数据类型和基本数据类型,集合只能存储引用数据类型。
(2)数组存储类型只能是一个,集合存储类型可以有多个
(3)集合不需要规定长度,数组有固定的长度

集合的简介

List

list是有序的容器,元素可以重复,可以插入多个null,每个元素都有索引。list的接口有Iterator可以遍历list元素,iterator的是安全的当遍历的过程中,如果数据list发生变化时会出现就会抛出ConcurrentModificationException 异常。iterator可以遍历list和set。listIterator只能遍历list,iterator是单向遍历,listIterator可以是双向遍历。
list 的数据结构

  1. ArrayList是 对象数组
  2. LinkList是 双向循环链表
  3. vecotr是对象数组
    list和数组之间可以随便切换,
    list转数组,list.toArray
    数组转list,Arrays.asList
  • ArrayList
    数据结构:动态数组的数据结构
    线程安全:arraylist是不安全的,如果在并发环境下使用的话需要collection中的synchronizedList()进行调用
    扩容机制:默认长度是10.arraylist 扩容后的容量是之前的1.5倍。如原arraylist现在的长度为10,在插入到一个元素,这时arraylist的长度扩容为15位。扩容机制就是把之前的数据拷贝到一个新建的数组中,再将新的元素添加到新数组中。
    增删改查效率: arrayList的底层是以数组实现,是一种随机访问模式,查找的非常快,添加一个元素非常方便。删除时需要将元素复制一遍一个新表这样就耗费性能。插入元素的时候,也要将元素复制一遍消耗性能,查找和增加效率的时间复杂度位O(1),删除和插入复杂度位O(n)
    优点:查找和增加
    缺点:删除和插入
  • LinkList
    数据结构:双向循环链表
    线程安全:也是线程不安全和arrayList一样的
    增删改查效率:
    查找:linkList是双向链表前后有指针,查询的时候需要移动指针前后依次查询时间复杂度O(1),查找数据是根据索引向前向后遍历。
    增加和删除:只要是非首位插入,中间的效率比arrayList高。插入中间,只需要将前后两个指针修改一下就可以了。效率高时间复杂度位O(n).
  • Vector
    数据结构:按顺序存储元素,基于数组
    线程安全:线程是安全的,vector的大部分方法都包含有关键字synchronized。方法都是同步,所以效率比较低。
    扩容机制:扩容的方式和arraylist一样默认的长度位10,当长度增加到量时,会扩容2倍。扩容的时候也是将原来的数组复制到一个新的数组中,再新加数据。
对比 arrayList,linkList,vector

arrayList 查询效率最高
linkList 增、删效率高
vector 由于是同步安全的效率较低。

Set

set 是无序的容器,只能存入一个null,不可以存在重复的,必须保证数据的唯一性。

  • HashSet
    线程安全:线程不安全
    数据结构:hashSet是不能重复的,hashSet主要是底层hashMap,将set的保存在hashMap的key中,vaule是一个PRESENT虚拟的值。所以set是不能重复的。存储和查找是先进性hashcode然后在存入到key中。
    增加和删除:不会引起元素位置改变。直接put就行(看源码
    查询:检索效率比较低,hashSet查询时先进行hashcode,然后找到相同的话再比较equals,只有equals和hashcode都相等时才返回。
    hashcode和equals不同:
    (1)如果两个对象相同,hashcode一定相同
    (2)hashcode相同,两个对象不一定相等
    (3)两个对象相同,对两个equal返回true
    (4)所以equal修改方法,hashcode也重写
    hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
    ==和equal比较:
    equal是比较两个变量或对象的值是否相同,==是比较两个对象或引用的内存,地址是否相同。
  • TreeSet
    线程安全:不安全
    数据结构:二叉树。可以对set集合中的元素进行排序。
    排序方法:treeSet实现了compareable接口,提供了compareto方法用来对数据排序(源码),排好序后保存到二叉树中。二叉树就是排序的,左边小 右边大。
  • LinkHashSet
    扩容机制:默认大小是16,加载因子是0.75.当到16*0.75时进行扩容2n。和map一样
    线程安全:不安全
    数据结构:双向链表和hash表。优点是当知道一个元素时可以知道前一个数据和后一个数据。缺点就是增加和删除是比较复杂。
    HashSet、TreeSet、linkHashSet对比“
    HashSet: 增删效率高,因为增删不用修改元素位置
    TreeSet: 查找效率高,因为二叉树排序号
    linkHashSet:增加效率低,因为增加时需要增加指针。

list和set就到这了。map知识点比较多。就在map中单独描述。

参考:https://blog.csdn.net/ThinkWon/article/details/104588551

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值