JAVA集合理解

集合是什么

集合实际上就是一个容器,可以容纳其他类型的数据。

集合是一个容器,是一个载体,可以一次容纳多个对象。

所有的集合类和集合接口都在Java.util.*下面

单个方式存储元素:

超级父接口:java.util.Collection

键值对的方式存储元素

超级父接口:java.util.Map

总结

ArrayList:底层是数组

LinkedList:底层是双向链表

Vector:底层是数组,线程安全的,效率较低,使用较少

HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合中的key部分了

TreeSet:底层是TreeMap,放到HashSet集合中的元素等同于放到HashMap集合中的key部分了。

HashMap:底层是哈希表。

-------hashcode(): 先比较hashcode的返回值是否相同,如果不同,就是不同的对象,可以存储 如果相同,接着比较equals方法的返回值

-------equals():如果返回true,代表相同 如果返回false,代表不相同,就可以存

Hashtable:底层也是哈希表,只不过是线程安全的,效率较低,使用较少。

Properties:是线程安全的,并且key和value只能存储字符串String。

TreeMap:底层是二叉树,TreeMap集合的key可以自动按照大小顺序排序。

1、Map(双列集合)

1.1、HashMap

       HashMap底层基于Map和链表 并且在JDK1.8及之后添加了红黑树部分 因为底层有链表 所以增删改效率高 其次因为底层包含了Map所以存储的也是<K,V>形式的键值 HashMap源码中写到继承了AbstractMap 并且在JDK1.8之后 HashMap中链表长度大于8之后会转化为红黑树

详解

HashMap基于了数组和链表 其中数组可以快速的定位到数据在哪一条链表 链表的优点是插入或者删除 两者结合出来之后 就可以避免HashMap中链表过长而导致难于查询 也避免了使用数组进行插入或删除 两者相互减少缺陷 并且HashMap在存值超过临界点时为了不影响效率 会自动扩容 并且HashMap线程不安全因为map初始化为一个长度为2的数组,loadFactor=0.75,threshold=2*0.75=1,也就是说当put第二个key的时候,map就需要进行resize

取值方法get(key) 添加值方法 put(k,v)

1.2、LinkedHashMap(HashMap子类)

底层数据结构由链表和哈希表组成。

由链表保证元素有序。

由哈希表保证元素唯一。

1.3、Hashtable

底层数据结构是哈希表。线程安全,效率低

哈希表依赖两个方法:hashCode()和equals()

执行顺序:

首先判断hashCode()值是否相同

是:继续执行equals(),看其返回值

是true:说明元素重复,不添加

是false:就直接添加到集合

否:就直接添加到集合

最终:

自动生成hashCode()和equals()即可

1.4、 TreeMap

底层数据结构是红黑树。(是一种自平衡的二叉树)

如何保证元素唯一性呢?

根据比较的返回值是否是0来决定

如何保证元素的排序呢?

两种方式

自然排序(元素具备比较性)

让元素所属的类实现Comparable接口

比较器排序(集合具备比较性)

让集合接收一个Comparator

2、List(有序 可重复)

2.1、ArrayList

ArrayList是比较常用的一个List集合 它底层基于数组 继承自AbstractList 并且实现了List接口 因为底层基于数组 所以大小是动态变化的 允许null的存在 同时也实现了RandomAccess、Cloneable、Serializable接口 所以ArrayList是支持快速访问、复制、序列化的

详解

ArrayList和List在遍历时都不能对集合进行remove操作 因为remove会影响集合的大小从而造成结果不精准或者是数组下标越界 其次ArrayList的扩容机制是默认将集合的大小扩容到原容量的1.5倍 .length( ) 可以获取到ArrayList的长度 在ArrayList中如果需要边遍历边 remove ,必须使用 iterator。且 remove 之前必须先 next,next 之后只能用一次 remove

添加方法是list.add( ) 获取是 get( )

2.2、LinkedList

LinkedList也是很常用的一种数据结构 与ArrayList一样都实现了List接口 但LinkedList底层是基于了链表 所以LinkedList会比ArrayList增删改的效率高 但因为ArrayList底层有一部分基于了数组 所以比LinkedList查询效率高 除了List接口之外 LinkedList还实现了Deque、Cloneable、Serializable接口 这三个接口也证明了LinkedList中支持队列、克隆、序列化 也允许null的存在

详解

LinkedList提供了以下三个成员变量。size,first,last。

3、Set(无序 不可重复)

3.1、HashSet

底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

3.2、LinkedHashSet

底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。

3.3、TreeSet

底层数据结构采用红黑树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG-0408

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值