学习集合需要注意的雷区

Java集合

集合的家族

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeKAZxSE-1592019974582)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20200613102002305.png)]

集合与数组的区别

1.数组声明后只能存放同一种数据类型,集合可以存不同的数据类型
2.数组声明后长度不可变,集合是可变长度
3.数组可以存放基本数据类型和引用数据类型,集合只能存放引用数据类型

注意:集合要想存放基本数据类型,可以封装成对应的包装类

Collection - 集合/接口:

List:(extends Collection)

特点:有序的可重复
注意:该接口添加了许多针对于下标操作的方法(所以有序的可重复)

ArrayList:
	数据结构:一维数组
	默认长度:10
	扩容:指针(size) ==  数组长度时扩容
	扩容:原来长度的1.5倍
	注意:不是线程安全

LinkedList:
	数据结构:双向链表
	特点:队列模式和栈模式

Vector:
	数据结构:一维数组
	默认长度:10
	扩容:指针(elementCount) ==  数组长度时扩容
	扩容:原来长度的2倍
	注意:是线程安全

Stack:(Stack extends Vector)
	数据结构:一维数组
	特点:栈模式

Set:(extends Collection)

Set:(extends Collection)
特点:无序的不重复

	HashSet:(底层由HashMap实现)
		数据结构:hash表(hash数组)
		特点:去重复
		
	LinkedHashSet:(底层由LinkedHashMap实现)
		数据结构:hash表(hash和数组)
		特点:去重复,有序
		
	TreeSet(底层由TreeMap实现): 
		数据结构:二叉树(红黑树)
		特点:自然排序(根据不同类型的属性进行不同的排序)

Map - 集合/接口:

HashMap:
	数据结构:hash表(hash数组)
	特点:无序、key是唯一的
	注意:
		1.默认长度16
		2.负载因子0.75
		3.临界值:长度*负载因子
		4.每次扩容是原来的2倍
		5.长度一定会是2的幂

LinkedHashMap:
	数据结构:hash表(hash数组)
	特点:有序、key是唯一的

Hashtable:
		数据结构:hash表(hash数组)
		特点:无序、key是唯一的
ConcurrentHashMap:
	数据结构:hash表(hash数组)
	特点:无序、key是唯一的
	
TreeMap:
	数据结构:二叉树(红黑树)
	特点:针对于key自然排序(根据不同类型的属性进行不同的排序)

Properties:文件集合(web项目中,会以配置文件的身份出现)	


注意1:Collection vs Map

>Collection拥有直接获取迭代器的方法(遍历)
>
>Map没有直接获取迭代器的方法
>
>Collection存储单个值
>
>Map存储键值对(Key-Value)

注意2:理解 有序和无序

有序:存入顺序与取出顺序一致

无序:存入顺序与取出顺序不一致,无序不代表随机

注意3:泛型

含义:规定该使用的类型,是一种数据安全的做法

注意4:ArrayList vs LinkedList

>ArrayList:存储数据
>
>LinkedList:存储数据、队列模式、栈模式
>
>因为数据结构不同,效率也不同:(做实验证明)
>
>添加(不扩容):ArrayList快
>添加(扩容):LinkedList快
>删除:LinkedList快
>查询:ArrayList快
>修改:ArrayList快
>注意:使用最频繁的是ArrayList,因为项目中查询数据的功能最多,ArrayList查询快,所以使用他;

注意5:红黑树知识点

《算法导论》中对于红黑树的定义如下:

  1. 每个结点或是红的,或是黑的

  2. 根节点是黑的

  3. 每个叶结点是黑的

  4. 如果一个结点是红的,则它的两个儿子都是黑的

  5. 对每个结点,从该结点到其子孙节点的所有路径上包含相同数目的黑结点

注意6:排序接口(内置与外置)

Comparable接口 – compareTo方法

使用:一个类的对象存入TreeSet集合中,该类必须实现排序接口,自定义排序规则

Comparator接口 – compare方法

使用:这个类是别人的类,不能更改排序规则的情况下,使用外部排序接口

比较器的优先级别:Comparator > Comparable

注意7:HashMap vs Hashtable vs ConcurrentHashMap

HashMap 允许存入null键 null值

Hashtable 不允许存入null键 null值

ConcurrentHashMap 不允许存入null键 null值

HashMap 线程不安全

Hashtable 线程安全(直接在方法上加锁,效率低)

ConcurrentHashMap 线程安全(分段式加锁,效率更高)

注意8:HashMap源码问题

JDK1.7 :
数组+链表(hash桶)
hash碰撞:如果两个对象(Key)的hash值是一样的,在hash数组中的下标也是一样
多线程下有回环问题:源于多线程下扩容后的Entry地址引用

在方法上加锁,效率低)

ConcurrentHashMap 线程安全(分段式加锁,效率更高)

注意8:HashMap源码问题

JDK1.7 :
数组+链表(hash桶)
hash碰撞:如果两个对象(Key)的hash值是一样的,在hash数组中的下标也是一样
多线程下有回环问题:源于多线程下扩容后的Entry地址引用

你可能感兴趣的:(学习集合需要注意的雷区)