list 有序集合 ArrayList 和 LinKedList 不安全 vector安全
set集合 无序集合(HashSet和TreeSet两大实现类) hashset(无序) linkedhashset(有序)
map 双列集合 hashmap(无序) , linkedhashmap(有序) ConcurrentHashMap 是多线程安全的
Collections.synchronizedList(list) 将集合变为线程安全的集合
LinkedList 底层是双向链表(元素分布在内存的不同地方),每一个节点记录下一个节点的位置(即指针域), 插入/删除元素快,只需要关联指针域(指针域的的牵手分手, 每个节点有2个指针域)即可
链表结构,数据查询的时候,只能从第一个元素开始查询,next指针逐个遍历链表,直到找到附和的元素.移动指针的过程非常耗时,所以查询慢.
private static final int DEFAULT_CAPACITY =10;
//源码解读arraylist默认大小是10,不够时,长度扩大为为原数组的1.5倍+1 =16
ArrayList (创建连续的内存区域,连续存放元素) 底层是数组实现, 扩容原理,默认大小是10(JDK8源码), 第一次扩容为 1.5×10 +1 =16
查询比较快, 找到第一个元素,根据间隔数目, 就可以找到你要的. 而ArrayList的删除元素,因为有索引, 所以索引也得前移.比较耗时
LinkedList 和 ArrayList 都不安全.
synchronized关键字修饰的方法或代码块,在任意时刻只有一个线程执行(即有锁,别的线程必须等释放了, 才能执行,解决多线程数据)
先来为大家介绍一下java中锁的概念。java中的每个对象和每个类都有锁,而且是互斥锁,也就是说只能有一方占有,另一方只能等到对方释放后才能再占有锁。synchronized关键字就是基于java的对象和类的锁的。
synchronized关键字会获得锁,所以在这里synchronized关键字获得的锁就是传递给线程的那个Trans对象的锁,两个线程用的是同一个锁,所以当一个线程执行到synchronized修饰的方法时,这个线程就会获得Trans对象的锁,并且这个锁是互斥的,所以其他试图想要获得锁的线程都必须等待,直到这个线程释放了锁,从而起到了互斥的作用。
每个对象都有自己的锁,所以这里synchronized关键字起作用的原因就是因为两个线程用的是同一个对象
你知道hashmap的数据结构吗?
https://www.cnblogs.com/banjinbaijiu/p/9147434.html
hashmap默认长度是16, 底层数据结构为: 数组 + 双向链表 来存储数据
每一个键值也叫entry,这些个 entry在一个数组中, 这个数组 就是hashmap的主干,
hashmap 数组每一个 元素的初始值都是null,
当调用map.put("apple", value) 时, 插入一个key为"apple" , 利用hash函数来确定entry的插入位置,
但是hashmap的长度是有限的, 再完美的hash算法也不能保证index不重复,
所以,hashmap数组的每一个元素不止是一个entry对象, 也是每一个链表的头结点,每一个entry对象通过next指针指向他的下一个entry节点,当新来的entry 映射到冲突的数组位置时,只需要插入到对应的链表即可,新来的entry节点插入链表时,使用的是头插法.
map.get("apple"), 先用hash算法计算出 index=hash("apple") 在数组的位置, 由于hash冲突,同一位置 可能匹配到多个entry,那么就需要就需要 顺着链表的头结点遍历, 循环table[index] 的链表, 找到键为"apple"的entry