集合面试 arraylist hashmap

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值