java 集合一些基础知识点

xiaoxiao2021-03-01  56

全部摘自疯狂java讲义,主要给自己看,加深一下基础而已。

 

 

JAVA集合类主要由两个接口派生的 Collection Map ,它们是两个根接口。包含了一些子接口或实现类。Set Queue List是Collection的子接口,无序集合,有序集合,队列。

 

Set集合

hashSet

类似一个罐子,程序可以依次吧多个对象“丢进”Set集合,而Set集合通常不能记住元素添加顺序。不允许包含相同的元素

HashSet  hashcode存储集合中的元素,因此具有很好的存取和查找性能。有以下特点 排列顺序不能保证,不是同步的,集合元素值可以为null。判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashcode方法返回值相等。如果equals返回true hashcode没指定 hashset依然把它们当成两个对象。指定hashcode返回相同,equals没指定 但hashset依然把它们当成两个对象。如果两个对象的hashcode方法返回的hashcode值相同,但它们通过equals方法比较返回false时,因为hashcode相同,hashset将试图把它们保存在同一位置,但又不行,所以用链式结构来保存多个对象,但会导致性能降低HashSet采用每个元素的hashcode值来计算其储存位置,从而可以自由增加hashSet长度,并可以根据元素的hashcode值访问元素。因此,当从hashset中访问元素时,hashset先计算该元素hashcode值,然后直接通过值来取出该元素。存储元素的槽位通常称为桶,如果有多个元素的hashcode值相同,但他们的equals方法比较返回false,需要在桶里放多个元素,这样会性能下降

treeSet

可以确保集合元素处于排序状态,采用红黑树的数据结构来存储集合元素,treeset进行排序的规则是支持自然和定制排序

,只能添加同一类型的对象

默认是自然排序

自然排序 会调用集合元素compareTo方法来比较元素之间的大小,只有第一个元素无须实现comparable接口,后面添加的所有元素都必须实现comparable接口

定制排序 根据集合元素大小,将它们以升序排列,如需要实现定制排序,例如以降序排列,则可以通过comparato接口帮助,

各Set性能分析

HashSet比TreeSet好,因为后者需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的set时,用treeset,

hashset还有一个子类 linkedhashset ,由维护链表所带来的额外开销造成的,由于有了链表,遍历linkedhashset会更快。

Enumset性能最好,只能保存同一个枚举类的枚举值作为集合元素。

都是线程不安全的 需要手动通过Collections工具类的synchronizedSortedSet方法来包装该集合

SortSet  s =Collections.synchronizedSortedSet(new TreeSet());

 

List集合

一个元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引。

判断两个对象相等的标准是只要equals方法比较true就ok

ArrayList线程不安全 Vector安全。

Map集合

用于存映射关系的数据 key-value key不允许重复,key和value是单向一对一关系通过指定的key,总能找到唯一的,确定的value.

Map里key集合和Set集合很像  key的确包含了一个keyset集合,用于返回所有key组成的set集合。

HashMap和Hashtable 

后者是线程安全的,如多个线程访问同一个对象 用后者

前者可以使用null作为key或value ,底层也是采用数组形式来储存key-value

 

linkedhashmap是hashmap的子类,使用双向链表来维护,该链表负责维护map的迭代顺序,迭代顺序与key-value对的插入顺序保存一致。

WeakHashMap与hashmap的用法基本相似,与hashmap的区别是hashmap保存了对象的强引用,意味着只要该hashmap1对象不被销毁,hashmap所有key的引用对象就不会被垃圾回收。WeakHashMap保存了对象的是弱引用类型。

EnumMap 内部以数组形式保存,所以这种实现形式很高效,根据key的自然排序,不允许使用null的key,但允许使用null的value。

Properties类是hashtable的子类

 

性能选择

采用hash算法来决定map中key的存储,并通过hash算法来增加key集合的大小。

hash表里的可以存储元素的位置被称为桶 在通常情况下,单个桶里存储一个元素,此时有最好的性能:hash算法可以根据hashcode值算出桶的存储位置,然后取出,如果hashcode相等 equals为false,会发生hash冲突 单个桶会存储多个元素,这些元素以链式存储,必须按顺序搜索。

容量   :桶的数量

初始化容量:创建桶的数量

尺寸;当前记录的数量

负载因子 :尺寸/初始容量   为0 表示空的hash表,0.5表示半满的hash表

 

负载极限:0-1数值 ;决定了hash表的最大填满程度,当hash表中负载因子达到指定极限时,hash表会自动成倍的增加容量(桶的数量),并将原有的对象重新分配,放入新的桶内,称为rehashing。

 默认负载极限是0.75  较高的负载极限可以降低hash表所占用的内存空间,但会增加查询数据的时间的开销;较低的负载极限会提高查询数据性能,但会增加内存的开销。

 

转载请注明原文地址: https://www.6miu.com/read-3449981.html

最新回复(0)