乐趣区

关于java:JAVA基础知识点之集合

List , Set 继承至 Collection 接口,Map 为独立接口

List 下有 ArrayList,LinkedList,Vector

Set 下有 HashSet,LinkedHashSet,TreeSet
Map 下有 HashMap,LinkedHashMap,TreeMap,Hashtable




1. 汇合和数组的区别:

2.Collection 汇合的办法:

3. 罕用汇合的分类:

Collection 接口的接口 对象的汇合(单列汇合)
├——-List 接口:元素按进入先后有序保留,可反复
│—————-├ LinkedList 接口实现类,链表,插入删除,没有同步,线程不平安
│—————-├ ArrayList 接口实现类,数组,随机拜访,没有同步,线程不平安
│—————-└ Vector 接口实现类 数组,同步,线程平安
│ ———————-└ Stack 是 Vector 类的实现类
└——-Set 接口:仅接管一次,不可反复,并做外部排序
├—————-└HashSet 应用 hash 表(数组)存储元素
│————————└ LinkedHashSet 链表保护元素的插入秩序
└ —————-TreeSet 底层实现为二叉树,元素排好序

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

二、List 和 Set 汇合详解:

1.list 和 set 的区别:

2.List:

(1)ArrayList:底层数据结构是数组,查问快,增删慢,线程不平安,效率高,能够存储反复元素
(2)LinkedList 底层数据结构是链表,查问慢,增删快,线程不平安,效率高,能够存储反复元素
(3)Vector: 底层数据结构是数组,查问快,增删慢,线程平安,效率低,能够存储反复元素
(4 小结:

3.Set:

(1)HashSet底层数据结构采纳哈希表实现,元素无序且惟一,线程不平安,效率高,能够存储 null 元素,元素的唯一性是靠所存储元素类型是否重写 hashCode()和 equals()办法来保障的,如果没有重写这两个办法,则无奈保障元素的唯一性。
具体实现唯一性的比拟过程:存储元素首先会应用 hash()算法函数生成一个 int 类型 hashCode 散列值,而后曾经的所存储的元素的 hashCode 值比拟,如果 hashCode 不相等,则所存储的两个对象肯定不相等,此时存储以后的新的 hashCode 值处的元素对象;如果 hashCode 相等,存储元素的对象还是不肯定相等,此时会调用 equals()办法判断两个对象的内容是否相等,如果内容相等,那么就是同一个对象,无需存储;如果比拟的内容不相等,那么就是不同的对象,就该存储了,此时就要采纳哈希的解决地址抵触算法,在以后 hashCode 值处相似一个新的链表,在同一个 hashCode 值的前面存储存储不同的对象,这样就保障了元素的唯一性。
Set 的实现类的汇合对象中不可能有反复元素,HashSet 也一样他是应用了一种标识来确定元素的不反复,HashSet 用一种算法来保障 HashSet 中的元素是不反复的,HashSet 采纳哈希算法,底层用数组存储数据。默认初始化容量 16,加载因子 0.75。
Object 类中的 hashCode()的办法是所有子类都会继承这个办法,这个办法会用 Hash 算法算出一个 Hash(哈希)码值返回,HashSet 会用 Hash 码值去和数组长度取模,模(这个模就是对象要寄存在数组中的地位)雷同时才会判断数组中的元素和要退出的对象的内容是否雷同,如果不同才会增加进去。
Hash 算法是一种散列算法。
Set hs=new HashSet();

hs.add(o);
|
o.hashCode();
|
o% 以后总容量 (0–15)
|
| 不发生冲突
是否发生冲突—————–间接寄存
|
| 发生冲突
| 假(不相等)
o1.equals(o2)——————- 找一个空位增加
|
| 是(相等)
不增加
笼罩 hashCode()办法的准则:
1、肯定要让那些咱们认为雷同的对象返回雷同的 hashCode 值
2、尽量让那些咱们认为不同的对象返回不同的 hashCode 值,否则,就会减少抵触的概率。
3、尽量的让 hashCode 值散列开(两值用异或运算可使后果的范畴更广)
HashSet 的实现比较简单,相干 HashSet 的操作,基本上都是间接调用底层 HashMap 的相干办法来实现,咱们应该为保留到 HashSet 中的对象笼罩 hashCode() 和 equals(),因为再将对象退出到 HashSet 中时,会首先调用 hashCode 办法计算出对象的 hash 值,接着依据此 hash 值调用 HashMap 中的 hash 办法,失去的值 & (length-1)失去该对象在 hashMap 的 transient Entry[] table 中的保留地位的索引,接着找到数组中该索引地位保留的对象,并调用 equals 办法比拟这两个对象是否相等,如果相等则不增加,留神:所以要存入 HashSet 的汇合对象中的自定义类必须笼罩 hashCode(),equals()两个办法,能力保障汇合中元素不反复。在笼罩 equals()和 hashCode()办法时,要使雷同对象的 hashCode()办法返回雷同值,笼罩 equals()办法再判断其内容。为了保障效率,所以在笼罩 hashCode()办法时,也要尽量使不同对象尽量返回不同的 Hash 码值。

如果数组中的元素和要退出的对象的 hashCode()返回了雷同的 Hash 值(雷同对象), 才会用 equals()办法来判断两个对象的内容是否雷同。

(2)LinkedHashSet底层数据结构采纳链表和哈希表独特实现,链表保障了元素的程序与存储程序统一,哈希表保障了元素的唯一性。线程不平安,效率高。
(3)TreeSet底层数据结构采纳二叉树来实现,元素惟一且曾经排好序;唯一性同样须要重写 hashCode 和 equals()办法,二叉树构造保障了元素的有序性。依据构造方法不同,分为天然排序(无参结构)和比拟器排序(有参结构),天然排序要求元素必须实现 Compareable 接口,并重写外面的 compareTo()办法,元素通过比拟返回的 int 值来判断排序序列,返回 0 阐明两个对象雷同,不须要存储;比拟器排须要在 TreeSet 初始化是时候传入一个实现 Comparator 接口的比拟器对象,或者采纳匿名外部类的形式 new 一个 Comparator 对象,重写外面的 compare()办法;
(4)小结:Set 具备与 Collection 齐全一样的接口,因而没有任何额定的性能,不像后面有两个不同的 List。实际上 Set 就是 Collection, 只 是行为不同。(这是继承与多态思维的典型利用:体现不同的行为。)Set 不保留反复的元素。
Set 存入 Set 的每个元素都必须是惟一的,因为 Set 不保留反复元素。退出 Set 的元素必须定义 equals()办法以确保对象的唯一性。Set 与 Collection 有齐全一样的接口。Set 接口不保障保护元素的秩序。

4.List 和 Set 总结:

(1)、List,Set 都是继承自 Collection 接口,Map 则不是
(2)、List 特点:元素有放入程序,元素可反复,Set 特点:元素无放入程序,元素不可反复,反复元素会笼罩掉,(留神:元素尽管无放入程序,然而元素在 set 中的地位是有该元素的 HashCode 决定的,其地位其实是固定的,退出 Set 的 Object 必须定义 equals() 办法,另外 list 反对 for 循环,也就是通过下标来遍历,也能够用迭代器,然而 set 只能用迭代,因为他无序,无奈用下标来获得想要的值。)
(3).Set 和 List 比照:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素地位扭转。
List:和数组相似,List 能够动静增长,查找元素效率高,插入删除元素效率低,因为会引起其余元素地位扭转。
(4)、ArrayList 与 LinkedList 的区别和实用场景
Arraylist:
长处 :ArrayList 是实现了基于动静数组的数据结构, 因为地址间断,一旦数据存储好了,查问操作效率会比拟高(在内存里是连着放的)。
毛病:因为地址间断,ArrayList 要挪动数据, 所以插入和删除操作效率比拟低。

LinkedList:
长处 :LinkedList 基于链表的数据结构, 地址是任意的,所以在开拓内存空间的时候不须要等一个间断的地址,对于新增和删除操作 add 和 remove,LinedList 比拟占优势。LinkedList 实用于要头尾操作或插入指定地位的场景
毛病 :因为 LinkedList 要挪动指针, 所以查问操作性能比拟低。
实用场景剖析
当须要对数据进行对此拜访的状况下选用 ArrayList,当须要对数据进行屡次减少删除批改时采纳 LinkedList。

ArrayList 与 Vector 的区别和实用场景
ArrayList 有三个构造方法
public ArrayList(int initialCapacity)// 结构一个具备指定初始容量的空列表。
public ArrayList() // 默认结构一个初始容量为 10 的空列表。
public ArrayList(Collection<? extends E> c)// 结构一个蕴含指定 collection 的元素的列表
Vector 有四个构造方法:
public Vector()// 应用指定的初始容量和等于 0 的容量增量结构一个空向量。
public Vector(int initialCapacity)// 结构一个空向量,使其外部数据数组的大小,其规范容量增量为零。
public Vector(Collection<? extends E> c)// 结构一个蕴含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)// 应用指定的初始容量和容量增量结构一个空的向量
ArrayList 和 Vector 都是用数组实现的,次要有这么三个区别:
_(1)_.Vector 是多线程平安的,线程平安就是说多线程拜访同一代码,不会产生不确定的后果。而 ArrayList 不是,这个能够从源码中看出,Vector 类中的办法很多有 synchronized 进行润饰,这样就导致了 Vector 在效率上无奈与 ArrayList 相比;
_(2)_两个都是采纳的线性间断空间存储元素,然而当空间有余的时候,两个类的减少形式是不同。
(3)Vector 能够设置增长因子,而 ArrayList 不能够。
(4)Vector 是一种老的动静数组,是线程同步的,效率很低,个别不赞成应用。
实用场景剖析
1.Vector 是线程同步的,所以它也是线程平安的,而 ArrayList 是线程异步的,是不平安的。如果不思考到线程的平安因素,个别用 ArrayList 效率比拟高。
2. 如果汇合中的元素的数目大于目前汇合数组的长度时,在汇合中应用数据量比拟大的数据,用 Vector 有肯定的劣势。

.TreeSet 是二差树(红黑树的树据构造)实现的,Treeset 中的数据是主动排好序的,不容许放入 null 值
2.HashSet 是哈希表实现的,HashSet 中的数据是无序的,能够放入 null,但只能放入一个 null,两者中的值都不能反复,就如数据库中惟一束缚
3.HashSet 要求放入的对象必须实现 HashCode() 办法,放入的对象,是以 hashcode 码作为标识的,而具备雷同内容的 String 对象,hashcode 是一样,所以放入的内容不能反复。然而同一个类的对象能够放入不同的实例

实用场景剖析:HashSet 是基于 Hash 算法实现的,其性能通常都优于 TreeSet。为疾速查找而设计的 Set,咱们通常都应该应用 HashSet,在咱们须要排序的性能时,咱们才应用 TreeSet。
(5)何时应用:

三、Map 详解:

Map 用于保留具备映射关系的数据,Map 里保留着两组数据:key 和 value,它们都能够使任何援用类型的数据,但 key 不能反复。所以通过指定的 key 就能够取出对应的 value。

(1)、请留神!!!,Map 没有继承 Collection 接口,Map 提供 key 到 value 的映射,你能够通过“键”查找“值”。一个 Map 中不能蕴含雷同的 key,每个 key 只能映射一个 value。Map 接口提供 3 种汇合的视图,Map 的内容能够被当作一组 key 汇合,一组 value 汇合,或者一组 key-value 映射。
(2)Map:

(3)HashMap 和 HashTable 的比拟:

(4)TreeMap:

(5)Map 的其它类:
IdentityHashMapHashMap 的具体区别,IdentityHashMap 应用 == 判断两个 key 是否相等,而 HashMap 应用的是 equals 办法比拟 key 值。有什么区别呢?
对于 ==,如果作用于根本数据类型的变量,则间接比拟其存储的“值”是否相等;如果作用于援用类型的变量,则比拟的是所指向的对象的地址。
对于 equals 办法,留神:equals 办法不能作用于根本数据类型的变量
如果没有对 equals 办法进行重写,则比拟的是援用类型的变量所指向的对象的地址;
诸如 String、Date 等类对 equals 办法进行了重写的话,比拟的是所指向的对象的内容。
(6)小结:

HashMap 非线程平安
HashMap:基于哈希表实现。应用 HashMap 要求增加的键类明确定义了 hashCode() 和 equals()[能够重写 hashCode()和 equals()],为了优化 HashMap 空间的应用,您能够调优初始容量和负载因子。

TreeMap:非线程平安基于红黑树实现。TreeMap 没有调优选项,因为该树总处于均衡状态。

实用场景剖析:
HashMap 和 HashTable:HashMap 去掉了 HashTable 的 contains 办法,然而加上了 containsValue()和 containsKey()办法。HashTable 同步的,而 HashMap 是非同步的,效率上比 HashTable 要高。HashMap 容许空键值,而 HashTable 不容许。

HashMap:实用于 Map 中插入、删除和定位元素。
Treemap:实用于按天然程序或自定义程序遍历键(key)。

5. 线程平安汇合类与非线程平安汇合类
LinkedList、ArrayList、HashSet 是非线程平安的,Vector 是线程平安的;
HashMap 是非线程平安的,HashTable 是线程平安的;
StringBuilder 是非线程平安的,StringBuffer 是线程平安的。

数据结构
ArrayXxx: 底层数据结构是数组,查问快,增删慢
LinkedXxx: 底层数据结构是链表,查问慢,增删快
HashXxx: 底层数据结构是哈希表。依赖两个办法:hashCode() 和 equals()
TreeXxx: 底层数据结构是二叉树。两种形式排序:天然排序和比拟器排序

退出移动版